docker實戰測試:構建自己的centos映象
Docker Hub中的99%映象都是從這個基礎映象過來的(FROM scratch),然後配置需要的軟體和配置來進行構建
建立一個自己的centos
1,在home目錄下建立dockerfile目錄,並在dockerfile目錄下編寫指令碼mydockerfile
[root@CentOs home]# mkdir dockerfile
[root@CentOs home]# cd dockerfile/
[root@CentOs dockerfile]# ls
[root@CentOs dockerfile]# vim mydockerfile
[root@CentOs dockerfile]#
2,指令碼內容
FROM centos
MAINTAINER wz<[email protected]>
ENV MYPATH /usr/local
WORDDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash
3,通過這個檔案構載映象
docker build -f mydockerfile -t mycentos:0.1 .(. 注意不要忘記)
-f:dockerfile檔案的檔案路徑
-t:映象名:[版本號]
如果構載時報錯::Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
請參考此文件解決:https://www.cnblogs.com/zypdbk/p/16038698.html
解決完報錯,我們就會發現構載成功了!
4,測試執行
docker run -it mycentos:0.1
我們發現進入以後直接在剛才設定的工作路徑下,官方的centos預設的工作路徑是根目錄
我們自己設定的ifconfig也可以用了!
同理:我們vim也可以使用!
5,我們可以列出本地映象的變更歷史
docker history 映象id
[root@CentOs ~]# docker history 881437706017
IMAGE CREATED CREATED BY SIZE COMMENT
881437706017 About an hour ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
fe83cac19108 About an hour ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
7edbbbd873bd About an hour ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
0c67c3512376 About an hour ago /bin/sh -c #(nop) EXPOSE 80 0B
565879c4900e About an hour ago /bin/sh -c yum -y install net-tools 161MB
c22a94b9f3fa About an hour ago /bin/sh -c yum -y install vim 216MB
c484ff737c6f About an hour ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
9d9bcc6d2ca8 About an hour ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
72112a6135d1 About an hour ago /bin/sh -c #(nop) MAINTAINER wz<2086568109@… 0B
eeb6ee3f44bd 6 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 6 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 6 months ago /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4… 204MB
[root@CentOs ~]#
所以我們平時拿到一個映象,可以研究一下它是怎麼做的!
6,CMD和ENTRYPOINT的區別
CMD 指定這個容器啟動執行時的命令,只有最後一個會生效,可被替代
ENTRYPOINT 指定這個容器啟動執行時的命令,可以追加命令
CMD測試:
(1)建立檔案,編寫指令碼
(2)構建映象
docker build -f dockerfile-cmd-test -t cmdtest .
(3)執行映象生成的容器,發現 “ ls -a”命令生效了
(4)我們想要追加一個命令:-l。最後想要顯示“ls -al”,發現報錯
[root@CentOs dockerfile]# docker run 38db52f206dd -l
docker: Error response from daemon: failed to create shim: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
[root@CentOs dockerfile]#
原因:在CMD的下,“-l” 替代了CMD ["ls","-a"]命令,但由於 “-l” 不是命令,所以報錯了!
再次測試:
這回發現就不報錯了!
[root@CentOs dockerfile]# docker run 38db52f206dd ls -al
total 12
drwxr-xr-x. 1 root root 6 Mar 22 05:27 .
drwxr-xr-x. 1 root root 6 Mar 22 05:27 ..
-rwxr-xr-x. 1 root root 0 Mar 22 05:27 .dockerenv
-rw-r--r--. 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx. 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Mar 22 05:27 dev
drwxr-xr-x. 1 root root 66 Mar 22 05:27 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt
dr-xr-xr-x. 147 root root 0 Mar 22 05:27 proc
dr-xr-x---. 2 root root 114 Nov 13 2020 root
drwxr-xr-x. 11 root root 148 Nov 13 2020 run
lrwxrwxrwx. 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x. 13 root root 0 Mar 22 01:39 sys
drwxrwxrwt. 7 root root 132 Nov 13 2020 tmp
drwxr-xr-x. 13 root root 155 Nov 13 2020 usr
drwxr-xr-x. 18 root root 238 Nov 13 2020 var
[root@CentOs dockerfile]#
ENTRYPOINT測試:
步驟同上,細微處有些許改變
接下來就是二者的區別了:
“-l” 之後沒有報錯!
[root@CentOs dockerfile]# docker run 1acfdaf5e5f5 -l
total 12
drwxr-xr-x. 1 root root 6 Mar 22 05:39 .
drwxr-xr-x. 1 root root 6 Mar 22 05:39 ..
-rwxr-xr-x. 1 root root 0 Mar 22 05:39 .dockerenv
-rw-r--r--. 1 root root 12114 Nov 13 2020 anaconda-post.log
lrwxrwxrwx. 1 root root 7 Nov 13 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Mar 22 05:39 dev
drwxr-xr-x. 1 root root 66 Mar 22 05:39 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Nov 13 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 13 2020 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt
dr-xr-xr-x. 148 root root 0 Mar 22 05:39 proc
dr-xr-x---. 2 root root 114 Nov 13 2020 root
drwxr-xr-x. 11 root root 148 Nov 13 2020 run
lrwxrwxrwx. 1 root root 8 Nov 13 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x. 13 root root 0 Mar 22 01:39 sys
drwxrwxrwt. 7 root root 132 Nov 13 2020 tmp
drwxr-xr-x. 13 root root 155 Nov 13 2020 usr
drwxr-xr-x. 18 root root 238 Nov 13 2020 var
[root@CentOs dockerfile]#
小結:我們的追加命令,是直接拼接在我們的ENTRYPOINT命令的後面的!
7,不是總結的總結~
dockerfile中很多命令都是十分相似的,我們需要了解它們的區別,我們最後的學習就是對比它們 然後測試效果!