相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点:
1:dockerfile只有几kb,便于传输
2:使用dockerfile构建出来的镜像,在运行容器的时候,不用指定容器的初始命令
3:支持更多的自定义操作
dockerfile常用指令:
FROM 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
RUN 你想让它干啥(在命令前面加上RUN即可)
ADD 给它点创业资金(复制文件,会自动解压)
WORKDIR 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME 给它一个存放行李的地方(设置卷,挂载主机目录)
EXPOSE 它要打开的门是啥(指定对外的端口)(-P 随机端口)
CMD 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)
dockerfile其他指令:
COPY 复制文件
ENV 环境变量
ENTRYPOINT 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)
dockerfile实战1(注意dockerfile与传统手动构建docker镜像的区别)
- 手动构建镜像
1:启动容器安装软件服务
docker run -it -p 1022:22 --name fxw centos:6.9
######
yum install openssh-server -y
/etc/init.d/sshd start
echo 123456|passwd --stdin root
######
2:将安装好服务的容器commit提交为镜像
docker commit fxw centos6-ssh:v1
3: 启动新容器来测试新提交的镜像
docker run -d -p 2022:22 centos6-ssh:v1 /usr/sbin/sshd -D
- dockerfile构建镜像
1:编写dockerfile
vi dockerfile
FROM centos:6.9
RUN yum install openssh-server -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
CMD ["/usr/sbin/sshd","-D"]
2:docker build构建镜像
docker build -t centos6-ssh:v2 .
3: 启动新容器来测试新构建的镜像
docker run -d -p 1322:22 centos6-ssh:v2
-
实战
1.在/opt目录下创建dockerfile/centos6_ssh/dockerfile,然后编写dockerfile,如下操作:
[root@docker01 opt]# mkdir dockerfile
[root@docker01 opt]# cd dockerfile/
[root@docker01 dockerfile]# mkdir centos6_ssh
[root@docker01 dockerfile]# cd centos6_ssh/
[root@docker01 centos6_ssh]# vim dockerfile
FROM centos:6.9
RUN yum install openssh-server -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
CMD ["/usr/sbin/sshd","-D"]
2.构建docker镜像(docker image build -t centos6_ssh:v2 .),-t 指定镜像名称,注意后面有个点,表示当前位置:
[root@docker01 centos6_ssh]# docker image build -t centos6_ssh:v2 .
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM centos:6.9
---> 2199b8eb8390
Step 2/5 : RUN yum install openssh-server -y
---> Running in 7948c359c433
Loaded plugins: fastestmirror, ovl
Setting up Install Process
Resolving Dependencies
--> Running transaction check
.
.
.
省略部分
.
.
.
Complete!
Removing intermediate container 7948c359c433
---> 1b4c583de43a
Step 3/5 : RUN /etc/init.d/sshd start
---> Running in 9f51bb8c01af
Generating SSH2 RSA host key: [ OK ]
Generating SSH1 RSA host key: [ OK ]
Generating SSH2 DSA host key: [ OK ]
Starting sshd: [ OK ]
Removing intermediate container 9f51bb8c01af
---> f8f1d7a51f3a
Step 4/5 : RUN echo 123456|passwd --stdin root
---> Running in cf61b9584057
Changing password for user root.
passwd: all authentication tokens updated successfully.
Removing intermediate container cf61b9584057
---> acd69ba39d72
Step 5/5 : CMD ["/usr/sbin/sshd","-D"]
---> Running in 2a34bf3a22e0
Removing intermediate container 2a34bf3a22e0
---> 023162318c9a
Successfully built 023162318c9a
Successfully tagged centos6_ssh:v2
[root@docker01 centos6_ssh]#
查看镜像是否构建成功:
[root@docker01 centos6_ssh]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6_ssh v2 023162318c9a 4 minutes ago 309MB
[root@docker01 centos6_ssh]#
3.启动新构建的镜像
[root@docker01 centos6_ssh]# docker run -d -p 1322:22 centos6_ssh:v2
03aae160a9dcf9a1aa6cd30576739df825fead46f8b1d46fc476bb0fedc5c36b
[root@docker01 centos6_ssh]# docker ps -a -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03aae160a9dc centos6_ssh:v2 "/usr/sbin/sshd -D" 10 seconds ago Up 9 seconds 0.0.0.0:1322->22/tcp silly_stonebraker
[root@docker01 centos6_ssh]#
4.测试ssh,连接成功。
[root@docker01 centos6_ssh]# ssh root@10.0.0.11 -p 1322
The authenticity of host '[10.0.0.11]:1322 ([10.0.0.11]:1322)' can't be established.
RSA key fingerprint is SHA256:fy+mmO6sGYcnPGLVmmKe7bMeIoVf8B1e6koFLMveZEM.
RSA key fingerprint is MD5:6f:f0:e4:4f:e2:2c:3a:af:75:38:9c:4c:9a:4f:24:62.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[10.0.0.11]:1322' (RSA) to the list of known hosts.
root@10.0.0.11's password:
[root@03aae160a9dc ~]#
- 扩展1:配置并启动多个服务的docker容器,只需修改dockerfile,如下:(ADD file1 file2表示将file1从宿主机的当前目录复制到容器的木录下)
[root@docker01 centos6_ssh]# vim dockerfile
FROM centos:6.9
RUN yum install openssh-server -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
RUN yum install httpd -y
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]
并且需要在当前目录下添加init.sh:
[root@docker01 centos6_ssh]# vim init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
构建,启动,测试容器
[root@docker01 centos6_ssh]# docker build -t centos6.9_http_ssh:v2 . #构建容器
Sending build context to Docker daemon 3.072kB
Step 1/7 : FROM centos:6.9
---> 2199b8eb8390
Step 2/7 : RUN yum install openssh-server -y
---> Using cache #使用缓存
---> 1b4c583de43a
Step 3/7 : RUN /etc/init.d/sshd start
---> Using cache #使用缓存
---> f8f1d7a51f3a
Step 4/7 : RUN echo 123456|passwd --stdin root
---> Using cache #使用缓存
---> acd69ba39d72
Step 5/7 : RUN yum install httpd -y
---> Running in 093a92bf39fe
Loaded plugins: fastestmirror, ovl
Setting up Install Process
Determining fastest mirrors
* base: ftp.sjtu.edu.cn
* extras: ftp.sjtu.edu.cn
* updates: ftp.sjtu.edu.cn
Resolving Dependencies
.
.
.
省略部分
.
.
.
apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1
httpd-tools.x86_64 0:2.2.15-69.el6.centos
mailcap.noarch 0:2.1.31-2.el6
Complete!
Removing intermediate container 093a92bf39fe
---> a5bc747e0e9d
Step 6/7 : ADD init.sh ./init.sh
---> 1bca69f9b863
Step 7/7 : CMD ["/bin/bash","/init.sh"]
---> Running in 6f45ce7a47e6
Removing intermediate container 6f45ce7a47e6
---> c00fcc89d51e
Successfully built c00fcc89d51e
Successfully tagged centos6.9_http_ssh:v2
[root@docker01 centos6_ssh]# docker images #查看容器
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6.9_http_ssh v2 c00fcc89d51e 29 seconds ago 386MB
centos6_ssh v2 023162318c9a 27 minutes ago 309MB
[root@docker01 centos6_ssh]# docker run -d -p 1522:22 -p 85:80 centos6.9_http_ssh:v2 #启动容器
d213f7d980175b7f35eb6fffc90d48268bfe581e95ab1452c7380604ca01fc5c
[root@docker01 centos6_ssh]# curl -I 10.0.0.11:85 #测试httpd
HTTP/1.1 403 Forbidden
Date: Thu, 25 Jul 2019 07:51:05 GMT
Server: Apache/2.2.15 (CentOS)
Accept-Ranges: bytes
Content-Length: 4961
Connection: close
Content-Type: text/html; charset=UTF-8
[root@docker01 centos6_ssh]# ssh root@10.0.0.11 -p 1522 #测试sshd连接服务
The authenticity of host '[10.0.0.11]:1522 ([10.0.0.11]:1522)' can't be established.
RSA key fingerprint is SHA256:fy+mmO6sGYcnPGLVmmKe7bMeIoVf8B1e6koFLMveZEM.
RSA key fingerprint is MD5:6f:f0:e4:4f:e2:2c:3a:af:75:38:9c:4c:9a:4f:24:62.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[10.0.0.11]:1522' (RSA) to the list of known hosts.
root@10.0.0.11's password:
[root@d213f7d98017 ~]# #成功
- 扩展2:
EXPOSE结合-P随机端口映射的使用
EXPOSE 22 80 #指定开放映射端口,否则直接docier run -d -P centos6.9_http_ssh:v3无效
[root@docker01 centos6_ssh]# vim dockerfile
FROM centos:6.9
RUN yum install openssh-server -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
RUN yum install httpd -y
ADD init.sh ./init.sh
EXPOSE 22 80 #指定开放映射端口,否则直接docier run -d -P centos6.9_http_ssh无效
CMD ["/bin/bash","/init.sh"]
- 扩展3:
默认情况下,手动进入容器,将定位到容器的根目录:
[root@docker01 centos6_ssh]# docker build -t centos6.9_http_ssh:v4 .
Sending build context to Docker daemon 3.072kB
Step 1/9 : FROM centos:6.9
---> 2199b8eb8390
Step 2/9 : RUN yum install openssh-server -y
---> Using cache
---> 1b4c583de43a
Step 3/9 : RUN /etc/init.d/sshd start
---> Using cache
---> f8f1d7a51f3a
Step 4/9 : RUN echo 123456|passwd --stdin root
---> Using cache
---> acd69ba39d72
Step 5/9 : RUN yum install httpd -y
---> Using cache
---> a5bc747e0e9d
Step 6/9 : ADD init.sh ./init.sh
---> Using cache
---> 1bca69f9b863
Step 7/9 : EXPOSE 22 80
---> Using cache
---> 038d316a06e3
Step 8/9 : WORKDIR /root
---> Using cache
---> 24544ae31045
Step 9/9 : CMD ["/bin/bash","/init.sh"]
---> Using cache
---> 907fc318a171
Successfully built 907fc318a171
Successfully tagged centos6.9_http_ssh:v4
[root@docker01 centos6_ssh]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6.9_http_ssh v4 907fc318a171 6 minutes ago 386MB
[root@docker01 centos6_ssh]# docker run -P -it 907fc318a171 /bin/bash
[root@858958ffa7f2 ~]# #当前目录为~,root目录
- 扩展3:
ENV 环境变量 ,实例(添加ENV,同时修改init.sh):
vim dockerfile
[root@docker01 centos6_ssh]# vim dockerfile
FROM centos:6.9
RUN yum install openssh-server -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
RUN yum install httpd -y
ADD init.sh ./init.sh
EXPOSE 22 80
WORKDIR /root
ENV SSH_PASSWD=123456 #新增
CMD ["/bin/bash","/init.sh"]
vim init.sh
[root@docker01 centos6_ssh]# vim init.sh
#!/bin/bash
echo $SSH_PASSWD|passwd --stdin root #新增
/etc/init.d/httpd start
/usr/sbin/sshd -D
重新构建并连接ssh服务
[root@docker01 centos6_ssh]# docker build -t centos6.9_http_ssh:v5 .
Sending build context to Docker daemon 3.072kB
Step 1/10 : FROM centos:6.9
---> 2199b8eb8390
Step 2/10 : RUN yum install openssh-server -y
---> Using cache
---> 1b4c583de43a
Step 3/10 : RUN /etc/init.d/sshd start
---> Using cache
---> f8f1d7a51f3a
Step 4/10 : RUN echo 123456|passwd --stdin root
---> Using cache
---> acd69ba39d72
Step 5/10 : RUN yum install httpd -y
---> Using cache
---> a5bc747e0e9d
Step 6/10 : ADD init.sh ./init.sh
---> 3300442c4018
Step 7/10 : EXPOSE 22 80
---> Running in b6a585bd79dc
Removing intermediate container b6a585bd79dc
---> 2d3c85fd7725
Step 8/10 : WORKDIR /root
---> Running in afe5b48a9fa6
Removing intermediate container afe5b48a9fa6
---> 93861d4451e6
Step 9/10 : ENV SSH_PASSWD=123456
---> Running in 819d96bc4599
Removing intermediate container 819d96bc4599
---> f9a175cda34b
Step 10/10 : CMD ["/bin/bash","/init.sh"]
---> Running in 23b365d3d5bc
Removing intermediate container 23b365d3d5bc
---> ea105d511658
Successfully built ea105d511658
Successfully tagged centos6.9_http_ssh:v5
[root@docker01 centos6_ssh]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos6.9_http_ssh v5 ea105d511658 5 seconds ago 386MB
[root@docker01 centos6_ssh]# docker run --env "SSH_PASSWD=231231" -d -P ea105d511658
c43e09f83c710d83dfb70258e6fb48ca80aae7be661e230f07dee5a83ec58c3d
[root@docker01 centos6_ssh]# docker ps -a |grep ea105d511658
c43e09f83c71 ea105d511658 "/bin/bash /init.sh" About a minute ago Up About a minute 0.0.0.0:32771->22/tcp, 0.0.0.0:32770->80/tcp keen_villani
[root@docker01 centos6_ssh]# ssh root@10.0.0.11 -p 32771
The authenticity of host '[10.0.0.11]:32771 ([10.0.0.11]:32771)' can't be established.
RSA key fingerprint is SHA256:fy+mmO6sGYcnPGLVmmKe7bMeIoVf8B1e6koFLMveZEM.
RSA key fingerprint is MD5:6f:f0:e4:4f:e2:2c:3a:af:75:38:9c:4c:9a:4f:24:62.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[10.0.0.11]:32771' (RSA) to the list of known hosts.
root@10.0.0.11's password: #此处将不再是123456,而是231231
[root@c43e09f83c71 ~]#
- 扩展4:docker run --env -d -P ea105d511658 sleep 10,手动的初始命令sleep 10 会覆盖掉配置文件中的CMD命令(CMD命令将不会运行),如果想要CMD不被覆盖,并且运行手动添加的命令,则将CMD修改为ENTRYPOINT(初始命令不覆盖并随后运行手动添加的命令),如下:
FROM centos:6.9
RUN yum install openssh-server -y
RUN /etc/init.d/sshd start
RUN echo 123456|passwd --stdin root
RUN yum install httpd -y
ADD init.sh ./init.sh
EXPOSE 22 80
WORKDIR /root
ENV SSH_PASSWD=123456
#CMD ["/bin/bash","/init.sh"] #删掉此行,用下行替换
ENTRYPOINT ["/bin/bash","/init.sh"]
网友评论