mkdir /tmp/docker/Dockerfile
cd /tmp/docker/Dockerfile
vim Dolcerfile
FROM rhel7 #指定基础镜像
MAINTAINER [email protected] #作者信息
ENV HOSTNAME server1 #设置容器主机名
EXPOSE 22 #容器对外开放的端口
COPY dvd.repo /etc/yum/repos.d/dvd.repo #复制本地文件到容器中
RUN yum install -y openssh-clients openssh-server && yum clean all && ssh-keygen -t rsa -f "/etc/ssh/ssh_host_rsa_key" -q -N "" && ssh-keygen -t ecdsa -f "/etc/ssh/ssh_host_ecdsa_key" -q -N "" && ssh-keygen -t ed25519 -f "/etc/ssh/ssh_host_ed25519_key" -q -N "" && echo root:redhat | chpasswd
CMD ["/usr/sbin/sshd","-D"]
vim dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.92.250/rhel7.3
gpgcheck=0
在Docerfile的目录下
docker build -t rhel7:test1 . #创建rhel7:test1镜像,包含ssh服务
docker run -d --name vm1 rhel7:test1 #使用rhel7:test1镜像创建容器
docker inspect vm1 #查看容器信息
ssh root@172.17.0.2 #测试
mkdir /tmp/docker/Dockerfile
cd /tmp/docker/Dockerfile
[root@foundation92 Dockerfile]# cat Dockerfile
FROM rhel7
MAINTAINER ly@test.com
ENV HOSTNAME server2
EXPOSE 80
COPY dvd.repo /etc/yum/repos.d/dvd.repo
RUN yum install -y httpd && yum clean all
VOLUME ["/var/www/html"]
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
[root@foundation92 Dockerfile]# cat dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.92.250/rhel7.3
gpgcheck=0
[root@foundation92 Dockerfile]# pwd
/tmp/docker/Dockerfile
[root@foundation92 Dockerfile]# docker build -t rhel7:httpd .
mkdir /tmp/html
cd /tmp/html
vim index.html
Docker-httpd create sucessfully!
docker run -d -v /tmp/html/:/var/www/html --name httpd2 rhel7:httpd #创建容器httpd2
docker inspect httpd2 #查看容器信息
docker save -o apache.tar rhel7:http #保存为本地tar文件。
docker rm -f `docker ps -aq`
mkdir /tmp/docker/Dockerfile
cd /tmp/docker/Dockerfile
[root@foundation92 Dockerfile]# cat Dockerfile
FROM rhel7
MAINTAINER ly@test.com
ENV HOSTNAME server3
EXPOSE 8080
COPY dvd.repo /etc/yum/repos.d/dvd.repo
RUN yum install -y tomcat && yum clean all
VOLUME ["/var/lib/tomcat/webapps/ROOT"]
CMD ["/usr/libexec/tomcat/server","start"]
[root@foundation92 Dockerfile]# cat dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.92.250/rhel7.3
gpgcheck=0
[root@foundation92 Dockerfile]# pwd
/tmp/docker/Dockerfile
[root@foundation92 Dockerfile]# docker build -t rhel7:tomcat .
[root@foundation92 html]# pwd
/tmp/html
[root@foundation92 html]# cat index.jsp
Now time is: <%=new java.util.Date()%>
docker run -d --name tomcat1 -p 80:8080 -v /tmp/html/:/var/lib/tomcat/webapps/ROOT rhel7:tomcat
使用tomcat源码构建tomcat镜像:
vim Dockerfile
FROM rhel7
MAINTAINER ly@test.com
ENV HOSTNAME server4
ENV JAVA_HOME /usr/local/jdk1.7.0_79
EXPOSE 8080
ADD jdk-7u79-linux-x64.tar.gz /uar/local/
ADD apache-tomcat-7.0.37.tar.gz /usr/local/
VOLUME ["/usr/lcoal/apache-tomcat-7.0.37/webapps/ROOT"]
CMD ["/usr/local/apache-tomcat-7.0.37/bin/startup.sh"]
~
CMD 如果只有一个命令,那创建如果我们需要运行多个服务怎么办呢?最好的办法是分别在不同的容器中运行,通过 link 进行连接,比如先前实验中用到的 web,app,db 容器。如果一定要在一个容器中运行多个服务可以考虑用 Supervisord 来进行进程管理,方式就是将多个启动命令放入到一个启动脚本中。
[root@foundation92 Dockerfile]# pwd
/tmp/docker/Dockerfile
[root@foundation92 Dockerfile]# ls
Dockerfile dvd.repo supervisord.conf
[root@foundation92 Dockerfile]# cat Dockerfile
FROM rhel7
MAINTAINER test@mirro.com
ENV HOSTNAME server5
EXPOSE 80 22
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN yum install -y httpd openssh-clients openssh-server supervisor && yum clean all && ssh-keygen -t rsa -f "/etc/ssh/ssh_host_rsa_key" -q -N "" && ssh-keygen -t ecdsa -f "/etc/ssh/ssh_host_ecdsa_key" -q -N "" && ssh-keygen -t ed25519 -f "/etc/ssh/ssh_host_ed25519_key" -q -N "" && echo root:westos | chpasswd
COPY supervisord.conf /etc/supervisord.conf
VOLUME ["/var/www/html"]
CMD ["/usr/bin/supervisord"]
[root@foundation92 Dockerfile]# cat dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.92.250/rhel7.3
gpgcheck=0
[update]
name=update
baseurl=ftp://172.25.92.250/pub/docker #用于下载supervisor的yum源
gpgcheck=0
[root@foundation92 Dockerfile]# cat supervisord.conf #配置文件,如果有多个服务需要启动可以在文件后继续添加[program:xxx]
[supervisord]
nodaemon=true
[program:httpd]
command=/usr/sbin/httpd
[program:sshd]
command=/usr/sbin/sshd -D
[root@foundation92 Dockerfile]# docker build -t rhel7:image1 . #根据Dockerfile创建镜像
[root@foundation92 Dockerfile]# docker run -d --name vm2 -v /tmp/docker/html:/var/www/html rhel7:image1 #创建容器
[root@foundation92 Dockerfile]# ssh 172.17.0.3
The authenticity of host '172.17.0.3 (172.17.0.3)' can't be established.
ECDSA key fingerprint is 9d:1a:fd:f1:39:d4:8f:c1:34:d0:c9:07:49:e2:07:ec.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.3' (ECDSA) to the list of known hosts.
[email protected]'s password:
-bash-4.2# yum install -y net-tools
-bash-4.2# netstat -antlp #可以看见容器对外开方的端口22,80全部开启
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 9/sshd
tcp 0 0 172.17.0.3:54663 172.25.92.250:80 TIME_WAIT -
tcp 0 0 172.17.0.3:54660 172.25.92.250:80 TIME_WAIT -
tcp 0 0 172.17.0.3:54667 172.25.92.250:80 TIME_WAIT -
tcp 0 0 172.17.0.3:54664 172.25.92.250:80 TIME_WAIT -
tcp 0 0 172.17.0.3:59728 172.25.92.250:21 TIME_WAIT -
tcp 0 0 172.17.0.3:22 172.17.0.1:49074 ESTABLISHED 20/sshd: root@pts/0
tcp6 0 0 :::80 :::* LISTEN 10/httpd
tcp6 0 0 :::22 :::* LISTEN
指定容器运行的用户
该用户将作为后续的 RUN 命令执行的用户。
一些需要指定用
户来运行的应用部署时非常关键,比如提供 hadoop 服务的容器通常会使用 hadoop 用户来启动服务。
命令使用方式,例如使用 shiyanlou 用户来执行后续命令:
USER shiyanlou
指定后续命令的执行目录
由于我们需要运行的是一个静态网站,将启动后的工作目录切换到/var/www/html 目录:WORKDIR /var/www/html
对外连接端口号
由于内部服务会启动 Web 服务,我们需要把对应的 80 端口暴露出来,可以提供给容器间互联使用,可以使用 EXPOSE 命令。
在镜像操作部分增加下面一句:
EXPOSE 80
设置容器主机名
ENV 命令能够对容器内的环境变量进行设置:
ENV HOSTNAME sevrer1.example.com
向镜像中增加文件
向镜像中添加文件有两种命令:COPY 和 ADD。
COPY 命令可以复制本地文件夹到镜像中:
COPY website /var/www/html
ADD 命令支持添加本地的 tar 压缩包到容器中指定目录,压缩包会被自动解压为目录,也可以自动下载 URL 并拷贝到镜像,例如:
ADD html.tar /var/www
ADD http://www.westos.org/html.tar /var/www
根据实验需求,我们把需要的一个网站放到镜像里,需要把一个 tar 包添加到 apache 的
/var/www 目录下,因此选择使用 ADD 命令:
ADD html.tar /var/www
CMD 与 ENTRYPOINT
ENTRYPOINT 容器启动后执行的命令,让容器执行表现的像一个可执行程序一样,与CMD 的 区 别 是 不 可 以 被 docker run 覆 盖 , 会 把 docker run 后 面 的 参 数 当 作 传 递 给ENTRYPOINT 指令的参数。Dockerfile 中只能指定一个 ENTRYPOINT,如果指定了很多,只 有 最 后 一 个 有 效 。 docker run 命 令 的 -entrypoint 参 数 可 以 把 指 定 的 参 数 继 续 传 递 给ENTRYPOINT。
挂载数据卷
将 apache 访问的日志数据存储到宿主机可以访问的数据卷中:
VOLUME [“/var/log/apche2”]
设置容器内的环境变量
使用 ENV 设置一些 apache 启动的环境变量:
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apche2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apche2