什么是 Dockerfile
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
Dockerfile的作用
安裝dockerfile中的指令定義docker容器或者容器中的應用程序以及服務
Dockerfile制作一個鏡像模板安裝模板統一生成容器
環境介紹
- 1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一級父目錄下,可以為Dockerfile父目錄的子目錄
- 2.Dockerfile中相對路徑默認都是Dockerfile所在的目錄
- 3.Dockerfile中一定要惜字如金,能寫到一行的指令,一定要寫到一行,原因是分層構建,聯合掛載這個特性。
- 4.Dockerfile中每一條指令被視為一層
- 5.Dockerfile中指明大寫(約定俗成)
Docker build 命令
語法
docker build [OPTIONS] PATH | URL | -
OPTIONS說明:
- --build-arg=[] :設置鏡像創建時的變量;
- --cpu-shares :設置 cpu 使用權重;
- --cpu-period :限制 CPU CFS周期;
- --cpu-quota :限制 CPU CFS配額;
- --cpuset-cpus :指定使用的CPU id;
- --cpuset-mems :指定使用的內存 id;
- --disable-content-trust :忽略校驗,默認開啟;
- -f :指定要使用的Dockerfile路徑;
- --force-rm :設置鏡像過程中刪除中間容器;
- --isolation :使用容器隔離技術;
- --label=[] :設置鏡像使用的元數據;
- -m :設置內存最大值;
- --memory-swap :設置Swap的最大值為內存+swap,"-1"表示不限swap;
- --no-cache :創建鏡像的過程不使用緩存;
- --pull :嘗試去更新鏡像的新版本;
- --quiet, -q :安靜模式,成功后只輸出鏡像 ID;
- --rm :設置鏡像成功后刪除中間容器;
- --shm-size :設置/dev/shm的大小,默認值是64M;
- --ulimit :Ulimit配置。
- --squash :將 Dockerfile 中所有的操作壓縮為一層。
- --tag, -t: 鏡像的名字及標簽,通常 name:tag 或者 name 格式;可以在一次構建中為一個鏡像設置多個標簽。
- --network: 默認 default。在構建期間設置RUN指令的網絡模式
dockerfile常用命令
- FROM:基礎鏡像,FROM命令必須是dockfile的首個命令
- LABEL:為鏡像生成元數據標簽信息。
- USER:指定運行容器時的用戶名或UID,后續RUN也會使用指定用戶
- RUN:RUN命令是Dockfile執行命令的核心部分。它接受命令作為參數並用於創建鏡像。每條RUN命令在當前鏡像基礎上執行,並且會提交一個新鏡像層。
- WORKDIR:設置CMD指明的命令的運行目錄。為后續的RUN、CMD、ENTRYPOINT、ADD指令配置工作目錄。
- ENV:容器啟動的環境變量
- ARG:構建環境的環境變量
- COPY:復制文件到鏡像中,格式: COPY 源路徑 目標路徑
- ADD: 拷復制文件到鏡像中,格式: ADD 源路徑 目標路徑
- CMD:容器運行時執行的默認命令
- ENTRYPOINT:指定容器的“入口”
- HEALTHCHECK:容器健康狀態檢查
關於 ADD ,有如下注意事項:
- 1、如果源路徑是個文件,且目標路徑是以 / 結尾, 則docker會把目標路徑當作一個目錄,會把源文件拷貝到該目錄下。如果目標路徑不存在,則會自動創建目標路徑。
- 2、如果源路徑是個文件,且目標路徑是不是以 / 結尾,則docker會把目標路徑當作一個文件。
如果目標路徑不存在,會以目標路徑為名創建一個文件,內容同源文件;
如果目標文件是個存在的文件,會用源文件覆蓋它,當然只是內容覆蓋,文件名還是目標文件名。
如果目標文件實際是個存在的目錄,則會源文件拷貝到該目錄下。 注意,這種情況下,最好顯示的以 / 結尾,以避免混淆。 - 3、如果源路徑是個目錄,且目標路徑不存在,則docker會自動以目標路徑創建一個目錄,把源路徑目錄下的文件拷貝進來。
如果目標路徑是個已經存在的目錄,則docker會把源路徑目錄下的文件拷貝到該目錄下。 - 4、如果源文件是個歸檔文件(壓縮文件),則docker會自動幫解壓。
- COPY指令和ADD指令功能和使用方式類似。只是COPY指令不會做自動解壓工作。
演示
使用Dockerfile構建nginx容器,添加容器健康檢查
# 基於nginx:1.17.9 鏡像構建
FROM nginx:1.17.9
# 指定信息 maintainer 貢獻者
LABEL maintainer="chenshifeng@163.com"
#設置環境變量
ENV NGINX_VERSION 1.17.9
ARG work_pwd=/data/html
#切換 root 用戶
USER root
#執行命令,安裝curl 軟件,設置軟連接把 nginx 服務的日志顯示到終端輸出
RUN apt-get -yq update && apt-get install -y curl && \
ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log
#掛載卷
VOLUME ["/data"]
#設置工作目錄
WORKDIR ${work_pwd}
# 復制 index.html 文件到 WORKDIR 目錄下
COPY index.html .
# 映射 80 端口
EXPOSE 80
# 此處 CMD 作為 ENTRYPOINT 的參數
CMD ["nginx","-g","daemon off;"]
STOPSIGNAL SIGRTMAX
# 檢查容器健康,通過訪問NGINX 服務80端口,來判斷容器是否運行正常
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
構建
docker build -t n:1 .
chenshifengdeMacBook-Pro:nginx chenshifeng$ docker build -t n:1 .
[+] Building 2265.0s (5/8)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/nginx:1.17.9 2.3s
=> [internal] load build context 0.0s
=> => transferring context: 280B 0.0s
=> [1/4] FROM docker.io/library/nginx:1.17.9@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 12.9s
=> => resolve docker.io/library/nginx:1.17.9@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 0.0s
=> => sha256:123275d6e508d282237a22fefa5aef822b719a06496444ea89efa65da523fc4b 27.10MB / 27.10MB 9.7s
=> => sha256:9a5d769f04f8b7810455a5c19f35a91042cbe6a53d5155b8840c67e90a352e0f 23.92MB / 23.92MB 8.2s
=> => sha256:faad4f49180d2ade69590557af5af7695b3659bbf50f59fdfe984aab06269d49 204B / 204B 0.3s
[+] Building 2265.1s (5/8) => [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s. => [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s. => [internal] load metadata for docker.io/library/nginx:1.17.9 2.3s
=> [internal] load build context 0.0s. => => transferring context: 280B 0.0s
=> [1/4] FROM docker.io/library/nginx:1.17.9@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 1[+] Building 2265.3s (5/8) => [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/nginx:1.17.9 2.3s => [internal] load build context [+] Building 2265.4s (5/8) => [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s2 => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/nginx:1.17.9 [+] Building 2265.6s (5/8)
=> [internal] load build definition from Dockerfile 0.0s0 => => transferring dockerfile: 276B 0.0s0 => [internal] load .dockerignore 0.0s => => transferring context: 2B [+] [+] Building 2267.6s (5/8) [+] Building[+] Building[+] Building 2268.9s (5/8) => [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s> => [internal] load .dockerignore 0[+] Building 2269.1s (5/8) => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 276B 0.0s => [internal] load .dockerignore [+] Building 2269.2s (5/8) => [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 276B 0.0s[[[+] Building 2364.5s (9/9) FINISHED => [internal] load build definition from Dockerfile 0.0s> => => transferring dockerfile: 276B 0.0s => [internal] load .dockerignore 0.0s= => => transferring context: 2B 0.0si => [internal] load metadata for docker.io/library/nginx:1.17.9 2.3sn => [internal] load build context 0.0st => => transferring context: 280B 0.0s
=> [1/4] FROM docker.io/library/nginx:1.17.9@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 12.9s => => resolve docker.io/library/nginx:1.17.9@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 0.0s= => => sha256:123275d6e508d282237a22fefa5aef822b719a06496444ea89efa65da523fc4b 27.10MB / 27.10MB 9.7s> => => sha256:9a5d769f04f8b7810455a5c19f35a91042cbe6a53d5155b8840c67e90a352e0f 23.92MB / 23.92MB 8.2s => => sha256:faad4f49180d2ade69590557af5af7695b3659bbf50f59fdfe984aab06269d49 204B / 204B 0.3s= => => sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50 1.41kB / 1.41kB 0.0s> => => sha256:30d9dde0c4cb5ab4989a92bc2c235b995dfa88ff86c09232f309b6ad27f1c7cd 948B / 948B 0.0s => => sha256:5a8dfb2ca7312ee39433331b11d92f45bb19d7809f7c0ff19e1d01a2c131e959 6.67kB / 6.67kB 0.0se => => extracting sha256:123275d6e508d282237a22fefa5aef822b719a06496444ea89efa65da523fc4b 1.6s
=> => extracting sha256:9a5d769f04f8b7810455a5c19f35a91042cbe6a53d5155b8840c67e90a352e0f 1.0s => => extracting sha256:faad4f49180d2ade69590557af5af7695b3659bbf50f59fdfe984aab06269d49 0.0s= => [2/4] RUN apt-get -yq update && apt-get install -y curl && ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stder 2349.0s> => [3/4] WORKDIR /data/html 0.0s => [4/4] COPY index.html . 0.0s => exporting to image 0.3s => => exporting layers 0.3s => => writing image sha256:663bf35f3ce6c35b0fbf159382a60ba1f271f89ae59fa32690e12f812801375c 0.0s => => naming to docker.io/library/n:1 0.0s
運行鏡像
chenshifengdeMacBook-Pro:nginx chenshifeng$ docker run -d -p 9090:80 n:1
56b9ed9a0a49bac4e525cdcc8589467a28fbeacae47400770e037b8aee55c3ab
chenshifengdeMacBook-Pro:docker-compose chenshifeng$ docker exec -it nifty_chatelet bash
root@56b9ed9a0a49:/data/html# pwd
/data/html # 對應WORKDIR 工作目錄
root@56b9ed9a0a49:/data/html# ls
index.html # 對應 COPY index.html
root@56b9ed9a0a49:/data/html# env
HOSTNAME=56b9ed9a0a49
PWD=/data/html
PKG_RELEASE=1~buster
HOME=/root
NJS_VERSION=0.3.9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.17.9
_=/usr/bin/env
root@56b9ed9a0a49:/data/html# id
uid=0(root) gid=0(root) groups=0(root) # 對應#切換 root 用戶 USER root
root@56b9ed9a0a49:/data/html# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 59G 6.3G 50G 12% /
tmpfs 64M 0 64M 0% /dev
tmpfs 994M 0 994M 0% /sys/fs/cgroup
shm 64M 0 64M 0% /dev/shm
/dev/vda1 59G 6.3G 50G 12% /data # 掛載卷
tmpfs 994M 0 994M 0% /proc/acpi
tmpfs 994M 0 994M 0% /sys/firmware
root@56b9ed9a0a49:/data/html#