Docker專題(八)-Docke中DockerFile

1.DockerFile是什麼

Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。

Dockerfile面向開發,Docker鏡像成爲交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。
在這裏插入圖片描述

  • Dockerfile,需要定義一個Dockerfile,Dockerfile定義了進程需要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等;

  • Docker鏡像,在用Dockerfile定義一個文件之後,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時,會真正開始提供服務;

  • Docker容器,容器是直接提供服務的。

  • 構建三步驟
    編寫Dockerfile文件
    docker build
    docker run

2.文件什麼樣

2.1.以我們熟悉的CentOS爲例

網站:https://hub.docker.com/_/centos/
在這裏插入圖片描述
在這裏插入圖片描述

2.2.DockerFile構建過程解析

  • Dockerfile內容基礎知識
    1:每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數
    2:指令按照從上到下,順序執行
    3:#表示註釋
    4:每條指令都會創建一個新的鏡像層,並對鏡像進行提交

  • Dockerfile內容基礎知識
    1:docker從基礎鏡像運行一個容器
    2:執行一條指令並對容器作出修改
    3:執行類似docker commit的操作提交一個新的鏡像層
    4:docker再基於剛提交的鏡像運行一個新容器
    5:執行dockerfile中的下一條指令直到所有指令都執行完成

  • 小結
    從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個不同階段:
    1:Dockerfile是軟件的原材料
    2:Docker鏡像是軟件的交付品
    3:Docker容器則可以認爲是軟件的運行態。

3.DockerFile體系結構(保留字指令)

  • FROM:基礎鏡像,當前新鏡像是基於哪個鏡像的
  • MAINTAINER:鏡像維護者的姓名和郵箱地址
  • RUN:容器構建時需要運行的命令
  • EXPOSE:當前容器對外暴露出的端口
  • WORKDIR:指定在創建容器後,終端默認登陸的進來工作目錄,一個落腳點
  • ENV:用來在構建鏡像過程中設置環境變量
    ENV MY_PATH /usr/mytest
    這個環境變量可以在後續的任何RUN指令中使用,這就如同在命令前面指定了環境變量前綴一樣;
    也可以在其它指令中直接使用這些環境變量,
    比如:WORKDIR $MY_PATH
  • ADD:將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
  • COPY:類似ADD,拷貝文件和目錄到鏡像中。
    將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置
    COPY src dest
    COPY [“src”, “dest”]
  • VOLUME:容器數據卷,用於數據保存和持久化工作
  • CMD:指定一個容器啓動時要運行的命令
    Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數替換
    在這裏插入圖片描述
  • ENTRYPOINT :指定一個容器啓動時要運行的命令
    ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啓動程序及參數
  • ONBUILD:當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發

3.1.小總結

在這裏插入圖片描述

4.DockerFile案例

4.1.Base鏡像(scratch)

Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構建出來的
在這裏插入圖片描述

4.2.自定義鏡像mycentos

Docker Hub默認CentOS鏡像什麼情況??
在這裏插入圖片描述

  • 準備編寫DockerFile文件
[root@localhost myfile]# pwd
/root/myfile
[root@localhost myfile]# vi mycentos_dockerfile
  • myCentOS內容DockerFile
FROM centos
MAINTAINER bruceliu<bruceliu167@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
  • 構建
    命令:

docker build -t 新鏡像名字:TAG .
會看到 docker build 命令最後有一個 .
. 表示當前目錄

[root@localhost myfile]# docker build -f /root/myfile/mycentos_dockerfile -t mycentos:1.3 .
Sending build context to Docker daemon 2.048 kB
Step 1/10 : FROM centos
 ---> 9f38484d220f
Step 2/10 : MAINTAINER bruceliu<bruceliu167@126.com>
 ---> Using cache
 ---> 281446cb753d
Step 3/10 : ENV MYPATH /usr/local
 ---> Using cache
 ---> 2e09cdb61576
Step 4/10 : WORKDIR $MYPATH
 ---> Using cache
 ---> 4aa136d65f26
Step 5/10 : RUN yum -y install vim
 ---> Using cache
 ---> 585392f09407
Step 6/10 : RUN yum -y install net-tools
 ---> Using cache
 ---> 9c7971b08e59
Step 7/10 : EXPOSE 80
 ---> Using cache
 ---> 6741c0b61390
Step 8/10 : CMD echo $MYPATH
 ---> Using cache
 ---> fb1b4b72ba02
Step 9/10 : CMD echo "success--------------ok"
 ---> Using cache
 ---> 3d636347cc9a
Step 10/10 : CMD /bin/bash
 ---> Using cache
 ---> 720d4eb5c5f0
Successfully built 720d4eb5c5f0
  • 運行
    docker run -it 新鏡像名字:TAG
    可以看到,我們自己的新鏡像已經支持vim/ifconfig命令,擴展成功了。
[root@localhost ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED                  SIZE
docker.io/mongo       latest              9c02a5a12c52        Less than a second ago   413 MB
mycentos              1.3                 720d4eb5c5f0        50 minutes ago           480 MB
bruceliu/centos9527   latest              071e944a589b        8 hours ago              202 MB
bruceliu/tomcat       7-jre7              a66f9aba334d        13 hours ago             359 MB
docker.io/tomcat      7-jre7              47c156f4d4e3        5 weeks ago              359 MB
docker.io/mysql       latest              7bb2586065cd        2 months ago             477 MB
docker.io/centos      7                   9f38484d220f        3 months ago             202 MB
docker.io/centos      latest              9f38484d220f        3 months ago             202 MB
[root@localhost ~]# docker run -it mycentos:1.3
[root@50784a17d114 local]# pwd
/usr/local
[root@50784a17d114 local]# vi 1.txt
[root@50784a17d114 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe11:3  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 656 (656.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 列出鏡像的變更歷史
    命令:

docker history 鏡像名

[root@localhost ~]# docker history 720d4eb5c5f0
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
720d4eb5c5f0        53 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/b...   0 B                 
3d636347cc9a        53 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "ec...   0 B                 
fb1b4b72ba02        53 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "ec...   0 B                 
6741c0b61390        53 minutes ago      /bin/sh -c #(nop)  EXPOSE 80/tcp                0 B                 
9c7971b08e59        53 minutes ago      /bin/sh -c yum -y install net-tools             112 MB              
585392f09407        54 minutes ago      /bin/sh -c yum -y install vim                   167 MB              
4aa136d65f26        About an hour ago   /bin/sh -c #(nop) WORKDIR /usr/local            0 B                 
2e09cdb61576        About an hour ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0 B                 
281446cb753d        About an hour ago   /bin/sh -c #(nop)  MAINTAINER bruceliu<bru...   0 B                 
9f38484d220f        3 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
<missing>           3 months ago        /bin/sh -c #(nop)  LABEL org.label-schema....   0 B                 
<missing>           3 months ago        /bin/sh -c #(nop) ADD file:074f2c974463ab3...   202 MB   

4.3.CMD/ENTRYPOINT 鏡像案例

都是指定一個容器啓動時要運行的命令

  • CMD
    Dockerfile中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數替換
[root@localhost ~]# docker run -it -p 8888:8080 docker.io/tomcat ls -l
total 124
-rw-r--r--. 1 root root  19534 Jul  4  2019 BUILDING.txt
-rw-r--r--. 1 root root   5407 Jul  4  2019 CONTRIBUTING.md
-rw-r--r--. 1 root root  57011 Jul  4  2019 LICENSE
-rw-r--r--. 1 root root   1726 Jul  4  2019 NOTICE
-rw-r--r--. 1 root root   3255 Jul  4  2019 README.md
-rw-r--r--. 1 root root   7139 Jul  4  2019 RELEASE-NOTES
-rw-r--r--. 1 root root  16262 Jul  4  2019 RUNNING.txt
drwxr-xr-x. 2 root root   4096 Jul 18  2019 bin
drwxr-sr-x. 2 root root    238 Jul  4  2019 conf
drwxr-sr-x. 2 root staff    78 Jul 18  2019 include
drwxr-xr-x. 2 root root   4096 Jul 18  2019 lib
drwxrwxrwx. 2 root root      6 Jul  4  2019 logs
drwxr-sr-x. 3 root staff   151 Jul 18  2019 native-jni-lib
drwxr-xr-x. 2 root root     30 Jul 18  2019 temp
drwxr-xr-x. 7 root root     81 Jul  4  2019 webapps
drwxrwxrwx. 2 root root      6 Jul  4  2019 work
  • ENTRYPOINT
    docker run 之後的參數會被當做參數傳遞給 ENTRYPOINT,之後形成新的命令組合
    在這裏插入圖片描述
    製作CMD版可以查詢IP信息的容器

curl命令可以用來執行下載、發送各種HTTP請求,指定HTTP頭部等操作。
如果系統沒有curl可以使用yum install curl安裝,也可以下載安裝。
curl是將下載文件輸出到stdout
使用命令:curl http://www.baidu.com
執行後,www.baidu.com的html就會顯示在屏幕上了
這是最簡單的使用方法。用這個命令獲得了http://curl.haxx.se指向的頁面,同樣,如果這裏的URL指向的是一個文件或者一幅圖都可以直接下載到本地。如果下載的是HTML文檔,那麼缺省的將只顯示文件頭部,即HTML文檔的header。要全部顯示,請加參數 -i

  • 製作CMD版可以查詢IP信息的容器
[root@localhost myfile]# vi myip_dockerfile
FROM centos
RUN yum install -y curl
CMD [ "curl", "-s", "http://ip.cn" ]
[root@localhost myfile]# docker build -f myip_dockerfile -t myip_centos .
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM centos
 ---> 9f38484d220f
Step 2/3 : RUN yum install -y curl
 ---> Running in 617a61151503

Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package curl.x86_64 0:7.29.0-51.el7 will be updated
---> Package curl.x86_64 0:7.29.0-51.el7_6.3 will be an update
--> Processing Dependency: libcurl = 7.29.0-51.el7_6.3 for package: curl-7.29.0-51.el7_6.3.x86_64
--> Running transaction check
---> Package libcurl.x86_64 0:7.29.0-51.el7 will be updated
---> Package libcurl.x86_64 0:7.29.0-51.el7_6.3 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch           Version                   Repository       Size
================================================================================
Updating:
 curl            x86_64         7.29.0-51.el7_6.3         updates         269 k
Updating for dependencies:
 libcurl         x86_64         7.29.0-51.el7_6.3         updates         222 k

Transaction Summary
================================================================================
Upgrade  1 Package (+1 Dependent package)

Total download size: 492 k
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
warning: /var/cache/yum/x86_64/7/updates/packages/curl-7.29.0-51.el7_6.3.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for curl-7.29.0-51.el7_6.3.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total                                              777 kB/s | 492 kB  00:00     
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-6.1810.2.el7.centos.x86_64 (@CentOS)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : libcurl-7.29.0-51.el7_6.3.x86_64                             1/4 
  Updating   : curl-7.29.0-51.el7_6.3.x86_64                                2/4 
  Cleanup    : curl-7.29.0-51.el7.x86_64                                    3/4 
  Cleanup    : libcurl-7.29.0-51.el7.x86_64                                 4/4 
  Verifying  : curl-7.29.0-51.el7_6.3.x86_64                                1/4 
  Verifying  : libcurl-7.29.0-51.el7_6.3.x86_64                             2/4 
  Verifying  : libcurl-7.29.0-51.el7.x86_64                                 3/4 
  Verifying  : curl-7.29.0-51.el7.x86_64                                    4/4 

Updated:
  curl.x86_64 0:7.29.0-51.el7_6.3                                               

Dependency Updated:
  libcurl.x86_64 0:7.29.0-51.el7_6.3                                            

Complete!
 ---> c0ab6e8f3af7
Removing intermediate container 617a61151503
Step 3/3 : CMD curl -s http://ip.cn
 ---> Running in 9933fbe7593b
 ---> 41868e4e4fee
Removing intermediate container 9933fbe7593b
Successfully built 41868e4e4fee

查看生成的鏡像

[root@localhost myfile]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED                  SIZE
docker.io/mongo       latest              9c02a5a12c52        Less than a second ago   413 MB
docker.io/tomcat      latest              238e6d7313e3        Less than a second ago   506 MB
myip_centos           latest              41868e4e4fee        13 minutes ago           314 MB
mycentos              1.3                 720d4eb5c5f0        About an hour ago        480 MB
bruceliu/centos9527   latest              071e944a589b        9 hours ago              202 MB
bruceliu/tomcat       7-jre7              a66f9aba334d        13 hours ago             359 MB
docker.io/tomcat      7-jre7              47c156f4d4e3        5 weeks ago              359 MB
docker.io/mysql       latest              7bb2586065cd        2 months ago             477 MB
docker.io/centos      7                   9f38484d220f        3 months ago             202 MB
docker.io/centos      latest              9f38484d220f        3 months ago             202 MB
[root@localhost myfile]# docker run 41868e4e4fee

問題
如果我們希望顯示 HTTP 頭信息,就需要加上 -i 參數

[root@localhost myfile]# docker run 41868e4e4fee -i
container_linux.go:235: starting container process caused "exec: \"-i\": executable file not found in $PATH"
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused "exec: \"-i\": executable file not found in $PATH".

WHY

我們可以看到可執行文件找不到的報錯,executable file not found。
之前我們說過,跟在鏡像名後面的是 command,運行時會替換 CMD 的默認值。
因此這裏的 -i 替換了原來的 CMD,而不是添加在原來的 curl -s http://ip.cn 後面。而 -i 根本不是命令,所以自然找不到。
 
那麼如果我們希望加入 -i 這參數,我們就必須重新完整的輸入這個命令:
 
$ docker run myip curl -s http://ip.cn -i

製作ENTROYPOINT版查詢IP信息的容器

[root@localhost myfile]# docker build -f myip1_dockerfile -t myip1_centos .
Sending build context to Docker daemon 4.096 kB
Step 1/3 : FROM centos
 ---> 9f38484d220f
Step 2/3 : RUN yum install -y curl
 ---> Using cache
 ---> c0ab6e8f3af7
Step 3/3 : ENTRYPOINT curl -s http://ip.cn
 ---> Running in b31022ed350c
 ---> 274c58d0c1e4
Removing intermediate container b31022ed350c
Successfully built 274c58d0c1e4
[root@localhost myfile]# docker run 274c58d0c1e4 
[root@localhost myfile]# docker run 274c58d0c1e4 -i
HTTP/1.1 301 Moved Permanently
Date: Fri, 02 Aug 2019 15:13:03 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Fri, 02 Aug 2019 16:13:03 GMT
Location: https://ip.cn/
Server: cloudflare
CF-RAY: 5000fe5a399bd33e-LAX

4.4.自定義鏡像Tomcat9


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章