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