Docker build: Build an image from a Dockerfile.
按照Dockerfile檔案所定義内容建立臨時性容器,把Docker中所定義的每行指令在臨時容器中執行,然後生成鏡像分層,所有指令執行結束後,生成一個新的鏡像,中間過程為commit。
一行指令就是一個分層,一行指令多條指令就涉及到鏡像優化。
一次一次的commit執行情況就是pause暫停打包、暫停打包、暫停打包……的過程。
Docker build執行的Dockerfile檔案,執行的卻是docker commit操作。
Dockerfile原理:在Dockerfile定義所要執行的指令,使用docker build建立鏡像,過程中會按照Dockerfile所定義的内容打開臨時性容器(使用docker commit容器),把Dockerfile檔案中的指令全部執行完畢,就得到一個容器應用鏡像。
執行的指令越多,最終得到的容器應用鏡像越大,是以要做優化。
Dockerfile關鍵字:
1、FROM:指定基礎鏡像;
2、MAINTAINER: 用來指定鏡像建立者;
3、RUN:運作指令;
4、CMD:設定container啟動時執行的操作;(如果容器鏡像有此指令,啟動容器時不要手動再讓容器執行其他的指令。)
5、ENTRYPOINT:設定Container啟動時執行的操作;
6、USER:設定容器中的使用者;
7、EXPOSE:指定容器需要映射到主控端的端口;
8、ENV:設定環境變量;
9、ADD:從主控端的src複制檔案到container的dest路徑;
10、VOLUME:指定挂載點;
11、WORKDIR: 在子鏡像中執行工作路徑切換;
12、ONBUILD:
這些關鍵字都是要了解的。
1、示例:
目的: 通過Dockerfile建立一個可以在啟動容器時就直接啟動httpd應用的鏡像。
步驟:
1、建立一個檔案夾(目錄),用于存儲Dockerfile所使用的檔案;
2、在此目錄中建立Dockerfile檔案及制作鏡像所使用的檔案,比如網站的首頁,啟動apache啟動的腳本;
3、在此目錄中,使用docker build建立鏡像,讀取Dockerfile檔案;
4、驗證:使用建立的鏡像啟動容器。
過程:
第一步:建立test目錄:
mkdir test
第二步:進入目錄并建立用于啟動httpd的腳本檔案:
cd test
vim run-httpd.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/httpd -D FOREGROUND
第三步:建立用于測試httpd是否可用的index.html:
vim index.html
It's work!
第四步:建立Dockerfile:
FROM centos:7
MAINTAINER "[email protected]"
RUN yum clean all && yum install -y httpd
ADD run-httpd.sh /run-httpd.sh
RUN chmod -v +x /run-httpd.sh
ADD index.html /var/www/html
EXPOSE 80
WORKDIR /
CMD ["/bin/bash","run-httpd.sh"]
說明:centos:8已經停服。
第五步:使用docker build建立容器應用鏡像,鏡像名稱為centos-base-httpd,版本為v1。
[[email protected] test]# docker build -t centos-base-httpd:v1 .
Sending build context to Docker daemon 4.096kB
Step 1/9 : FROM centos:7
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:7
---> eeb6ee3f44bd
Step 2/9 : MAINTAINER "[email protected]"
---> Running in c26b1ca650a4
Removing intermediate container c26b1ca650a4
---> e796b74765c8
Step 3/9 : RUN yum clean all && yum install -y httpd
---> Running in 13bb29923568
Loaded plugins: fastestmirror, ovl
Cleaning repos: base extras updates
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.tuna.tsinghua.edu.cn
* updates: mirrors.tuna.tsinghua.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-97.el7.centos.5 will be installed
--> Processing Dependency: httpd-tools = 2.4.6-97.el7.centos.5 for package: httpd-2.4.6-97.el7.centos.5.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-97.el7.centos.5.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-97.el7.centos.5.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-97.el7.centos.5.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-97.el7.centos.5.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-7.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
---> Package httpd-tools.x86_64 0:2.4.6-97.el7.centos.5 will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
httpd x86_64 2.4.6-97.el7.centos.5 updates 2.7 M
Installing for dependencies:
apr x86_64 1.4.8-7.el7 base 104 k
apr-util x86_64 1.5.2-6.el7 base 92 k
centos-logos noarch 70.0.6-3.el7.centos base 21 M
httpd-tools x86_64 2.4.6-97.el7.centos.5 updates 94 k
mailcap noarch 2.1.41-2.el7 base 31 k
Transaction Summary
================================================================================
Install 1 Package (+5 Dependent packages)
Total download size: 24 M
Installed size: 32 M
Downloading packages:
Public key for apr-1.4.8-7.el7.x86_64.rpm is not installed
warning: /var/cache/yum/x86_64/7/base/packages/apr-1.4.8-7.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for httpd-tools-2.4.6-97.el7.centos.5.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total 1.7 MB/s | 24 MB 00:14
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-9.2009.0.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
Installing : apr-1.4.8-7.el7.x86_64 1/6
Installing : apr-util-1.5.2-6.el7.x86_64 2/6
Installing : httpd-tools-2.4.6-97.el7.centos.5.x86_64 3/6
Installing : centos-logos-70.0.6-3.el7.centos.noarch 4/6
Installing : mailcap-2.1.41-2.el7.noarch 5/6
Installing : httpd-2.4.6-97.el7.centos.5.x86_64 6/6
Verifying : httpd-tools-2.4.6-97.el7.centos.5.x86_64 1/6
Verifying : mailcap-2.1.41-2.el7.noarch 2/6
Verifying : apr-1.4.8-7.el7.x86_64 3/6
Verifying : apr-util-1.5.2-6.el7.x86_64 4/6
Verifying : httpd-2.4.6-97.el7.centos.5.x86_64 5/6
Verifying : centos-logos-70.0.6-3.el7.centos.noarch 6/6
Installed:
httpd.x86_64 0:2.4.6-97.el7.centos.5
Dependency Installed:
apr.x86_64 0:1.4.8-7.el7
apr-util.x86_64 0:1.5.2-6.el7
centos-logos.noarch 0:70.0.6-3.el7.centos
httpd-tools.x86_64 0:2.4.6-97.el7.centos.5
mailcap.noarch 0:2.1.41-2.el7
Complete!
Removing intermediate container 13bb29923568
---> c1b6b195b759
Step 4/9 : ADD run-httpd.sh /run-httpd.sh
---> 1f85b533d455
Step 5/9 : RUN chmod -v +x /run-httpd.sh
---> Running in bd3ef63efe8a
mode of '/run-httpd.sh' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
Removing intermediate container bd3ef63efe8a
---> 938f5dcddad5
Step 6/9 : ADD index.html /var/www/html
---> 026c49eb2266
Step 7/9 : EXPOSE 80
---> Running in bb9b4ff22bf7
Removing intermediate container bb9b4ff22bf7
---> 50c117e5c73b
Step 8/9 : WORKDIR /
---> Running in ef989d3ca39b
Removing intermediate container ef989d3ca39b
---> e12ce12352d9
Step 9/9 : CMD ["/bin/bash","run-httpd.sh"]
---> Running in 94f40a65dbe4
Removing intermediate container 94f40a65dbe4
---> 62581b44dd05
Successfully built 62581b44dd05
Successfully tagged centos-base-httpd:v1
第六步:驗證,使用上述建立的鏡像啟動容器:
docker run -d centos-base-httpd:v1
使用docker run --help 檢視-d指令的意思:
-d:Run container in background and print container ID。
另外需要注意的是後面不再需要如/bin/bash的指令了,因為/bin/bash的指令比CMD指令優先級要高。
驗證容器及httpd是否可用:
docker inspect 6a6 # 檢視容器的IP位址
curl http://172.17.0.11
It's working!
案例二:把nginx容器化:
1)要求通過基礎鏡像做nginx應用鏡像;
2)使用nginx應用鏡像啟動容器的時候,nginx要求啟動;
3)驗證nginx服務是否啟動。
第一步:建立一個目錄:
mkdir nginxtest
cd nginxtest
第二步:建立測試檔案:
[[email protected] nginxtest]# echo 'nginx s running!!!' >> index.html
[[email protected] nginxtest]# ls
index.html
第三步:建立Dockerfile檔案:
FROM centos:7
MAINTAINER "[email protected]"
RUN yum clean all && yum install -y yum-plugin-ovl && yum -y install epel-release
RUN yum -y install nginx
ADD index.html /usr/share/nginx/html/
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD /usr/sbin/nginx
第四步:使用docker build指令建立nginx鏡像:
docker build -t centos-nginx:v1 .