相對(duì)于手動(dòng)制作的docker鏡像,使用dockerfile構(gòu)建的鏡像有以下優(yōu)點(diǎn):
1:dockerfile只有幾kb,便于傳輸
2:使用dockerfile構(gòu)建出來(lái)的鏡像,在運(yùn)行容器的時(shí)候,不用指定容器的初始命令
3:支持更多的自定義操作
dockerfile常用指令:
FROM 這個(gè)鏡像的媽媽是誰(shuí)?(指定基礎(chǔ)鏡像)
MAINTAINER 告訴別人,誰(shuí)負(fù)責(zé)養(yǎng)它?(指定維護(hù)者信息,可以沒有)
RUN 你想讓它干啥(在命令前面加上RUN即可)
ADD 給它點(diǎn)創(chuàng)業(yè)資金(復(fù)制文件,會(huì)自動(dòng)解壓)
WORKDIR 我是cd,今天剛化了妝(設(shè)置當(dāng)前工作目錄)
VOLUME 給它一個(gè)存放行李的地方(設(shè)置卷,掛載主機(jī)目錄)
EXPOSE 它要打開的門是啥(指定對(duì)外的端口)(-P 隨機(jī)端口)
CMD 奔跑吧,兄弟!(指定容器啟動(dòng)后的要干的事情)(容易被替換)
dockerfile其他指令:
COPY 復(fù)制文件
ENV 環(huán)境變量
ENTRYPOINT 容器啟動(dòng)后執(zhí)行的命令(無(wú)法被替換,啟容器的時(shí)候指定的命令,會(huì)被當(dāng)成參數(shù))
dockerfile實(shí)戰(zhàn)1(注意dockerfile與傳統(tǒng)手動(dòng)構(gòu)建docker鏡像的區(qū)別)
- 手動(dòng)構(gòu)建鏡像
1:?jiǎn)?dòng)容器安裝軟件服務(wù)
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:將安裝好服務(wù)的容器commit提交為鏡像
docker commit fxw centos6-ssh:v1
3: 啟動(dòng)新容器來(lái)測(cè)試新提交的鏡像
docker run -d -p 2022:22 centos6-ssh:v1 /usr/sbin/sshd -D
- dockerfile構(gòu)建鏡像
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構(gòu)建鏡像
docker build -t centos6-ssh:v2 .
3: 啟動(dòng)新容器來(lái)測(cè)試新構(gòu)建的鏡像
docker run -d -p 1322:22 centos6-ssh:v2
-
實(shí)戰(zhàn)
1.在/opt目錄下創(chuàng)建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.構(gòu)建docker鏡像(docker image build -t centos6_ssh:v2 .),-t 指定鏡像名稱,注意后面有個(gè)點(diǎn),表示當(dāng)前位置:
[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]#
查看鏡像是否構(gòu)建成功:
[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.啟動(dòng)新構(gòu)建的鏡像
[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.測(cè)試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 ~]#
- 擴(kuò)展1:配置并啟動(dòng)多個(gè)服務(wù)的docker容器,只需修改dockerfile,如下:(ADD file1 file2表示將file1從宿主機(jī)的當(dāng)前目錄復(fù)制到容器的木錄下)
[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"]
并且需要在當(dāng)前目錄下添加init.sh:
[root@docker01 centos6_ssh]# vim init.sh
#!/bin/bash
/etc/init.d/httpd start
/usr/sbin/sshd -D
構(gòu)建,啟動(dòng),測(cè)試容器
[root@docker01 centos6_ssh]# docker build -t centos6.9_http_ssh:v2 . #構(gòu)建容器
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 #啟動(dòng)容器
d213f7d980175b7f35eb6fffc90d48268bfe581e95ab1452c7380604ca01fc5c
[root@docker01 centos6_ssh]# curl -I 10.0.0.11:85 #測(cè)試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 #測(cè)試sshd連接服務(wù)
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 ~]# #成功
- 擴(kuò)展2:
EXPOSE結(jié)合-P隨機(jī)端口映射的使用
EXPOSE 22 80 #指定開放映射端口,否則直接docier run -d -P centos6.9_http_ssh:v3無(wú)效
[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無(wú)效
CMD ["/bin/bash","/init.sh"]
- 擴(kuò)展3:
默認(rèn)情況下,手動(dòng)進(jìn)入容器,將定位到容器的根目錄:
[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 ~]# #當(dāng)前目錄為~,root目錄
- 擴(kuò)展3:
ENV 環(huán)境變量 ,實(shí)例(添加ENV,同時(shí)修改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
重新構(gòu)建并連接ssh服務(wù)
[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 ~]#
- 擴(kuò)展4:docker run --env -d -P ea105d511658 sleep 10,手動(dòng)的初始命令sleep 10 會(huì)覆蓋掉配置文件中的CMD命令(CMD命令將不會(huì)運(yùn)行),如果想要CMD不被覆蓋,并且運(yùn)行手動(dòng)添加的命令,則將CMD修改為ENTRYPOINT(初始命令不覆蓋并隨后運(yùn)行手動(dòng)添加的命令),如下:
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"]