1. 程式人生 > 其它 >docker實戰測試:構建自己的centos映象

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中很多命令都是十分相似的,我們需要了解它們的區別,我們最後的學習就是對比它們 然後測試效果!