Dockerfile的常用指令和構建案例
- 一、Dockerfile操作常用的指令
- (1) FROM 鏡像
- (2) MAINTAINER 名字
- (3) RUN命令
- (4) ENTRYPOINT ["要運行的程式","引數1", "引數2"]
- (5) CMD ["要運行的程式","引數1", "引數2"]
- (6) EXPOSE 埠號
- (7)ENV 環境變數變數值
- (8) ADD 源檔案/目錄目標檔案/目錄
- (9) COPY 源檔案/目錄目標檔案/目錄
- (10) VOLUME [“目錄”]
- (11) USER 用戶名/UID
- (12) WORKDIR路徑
- (13) |ONBUILD命令
- (14 ) HEALTHCHECK
- 二、Dockerfile案例
一、Dockerfile操作常用的指令

(1) FROM 鏡像
- 指定新鏡像所基于的基礎鏡像,第一條指令必須為FROM指令,每創建一個鏡像就需要一條FROM指令
(2) MAINTAINER 名字
- 說明新鏡像的維護人資訊
(3) RUN命令
- 在所基于的鏡像上執行命令,并提交到新的鏡像中
(4) ENTRYPOINT [“要運行的程式”,“引數1”, “引數2”]
- 設定容器啟動時第一一個運行的命令及其引數,
- 可以通過使用命令dockerrun–entrypoint來覆寫鏡像中的ENTRYPOINT指令的內容,
(5) CMD [“要運行的程式”,“引數1”, “引數2”]
上面的是exec形式, shell形式: CMD 命令 引數1 引數2
- 啟動容器時默認執行的命令或者腳本,Dockerfile只 能有一條CMD命令,如果指定多條命令,只執行最后一條命令,
- 如果在dockerrun時指定了命令或者鏡像中有ENTRYPOINT,那么cmd就會被覆寫,
CMD可以為ENTRYPOINT 指令提供默認引數
ENTRYPOINT ["echo"]
CMD ["test2"]
(6) EXPOSE 埠號
- 指定新鏡像加載到Docker時要開啟的埠
(7)ENV 環境變數變數值
- 設定一個環境變數的值,會被后面的RUN使用
(8) ADD 源檔案/目錄目標檔案/目錄
- 將源檔案復制到鏡像中,源檔案要與Dockerfile 位于相同目錄中,或者是一個URL
有如下注意事項: - 1、如果源路徑是個檔案,且目標路徑是以/結尾, 則docker會把目標路徑當作一一個目錄, 會把源檔案拷貝到該目錄下,
- 如果目標路徑不存在,則會自動創建目標路徑,
- 2、如果源路徑是個檔案,且目標路徑是不是以/結尾,則docker會把目標路徑當作一個檔案,
- 如果目標路徑不存在,會以目標路徑為名創建一個檔案,內容同源檔案;
- 如果目標檔案是個存在的檔案,會用源檔案覆寫它,當然只是內容覆寫,檔案名還是目標檔案名,
- 如果目標檔案實際是個存在的目錄,則會源檔案拷貝到該目錄下,注意,這種情況下,最好顯示的以/結尾,以避免混淆,
- 3、如果源路徑是個目錄,且目標路徑不存在,則docker會自動以目標路徑創建一個目錄,把源路徑目錄下的檔案拷貝進來,
- 如果目標路徑是個已經存在的目錄,則docker 會把源路徑目錄下的檔案拷貝到該目錄下,
- 4、如果源檔案是個歸檔檔案(壓縮檔案),則docker會自動幫解壓,
- URL"下載和解壓特性不能一 起使用,任何壓縮檔案通過URI拷貝, 都不會自動解壓,
(9) COPY 源檔案/目錄目標檔案/目錄
- 只復制本地主機上的檔案/目錄復制到目標地點,源檔案/目錄要與Dockerfile 在相同的目錄中
(10) VOLUME [“目錄”]
- 在容器中創建一個掛載點.
(11) USER 用戶名/UID
- 指定運行容器時的用戶
(12) WORKDIR路徑
- 為后續的RUN、 CMD、 ENTRYPOINT 指定作業目錄
(13) |ONBUILD命令
- 指定所生成的鏡像作為一個基礎鏡像時所要運行的命令,
- 當在一個Dockerfile檔案中加_上ONBUILD指令,該指令對利用該Dockerfile構建鏡像(比如為A鏡像)不會產生實質性影響,
- 但是當撰寫一個新的Dockerfile檔案來基于A鏡像構建一個鏡像 ( 比如為B鏡像)時,這時構造A鏡像的Dockerfile檔案中的ONBUILD指令就生效了,在構建B鏡像的程序中,首先會執行0NBUILD指令指定的指令,然后才會執行其它指令,
(14 ) HEALTHCHECK
- 健康檢查
二、Dockerfile案例
在撰寫Dockerfile時,有嚴格的格式需要遵循:
- 第一行必須使用 FROM 指令指明所基于的鏡像名稱;
- 之后使用 MAINTAINER 指令說明維護該鏡像的用戶資訊;
- 然后是鏡像操作相關指令,如RUN指令,每運行一條指令,都會給基礎鏡像添加新的一層,
- 最后使用CMD指令指定啟動容器時要運行的命令操作,

代碼清單
#建立作業目錄
mkdir /opt/ apache
cd /opt/ apache
vim Dockerfile
#基于的基礎鏡像
FROM centos:7
#維護鏡像的用戶資訊
MAINTAINER this is apache image <wdc,2021.7.27>
#鏡像操作指令安裝apache軟體
RUN yum -y update
RUN yum -y install httpd
#開啟 80 埠
EXPOSE 80
#復制網站首頁檔案
ADD index.html /var/www/html/index.html
//方法一:
#將執行腳本復制到鏡像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#啟動容器時執行腳本
CMD ["/run.sh"]
//方法二:
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D", "FOREGROUND"]
//準備執行腳本
vim run.sh
#!/bin/bash
rm -rf /run/httpd/* #清理httpd的快取
exec /usr/sbin/apachectl -D FOREGROUND #指定為前臺運行
#因為Docker容器僅在它的1號行程(PID為1)運行時,會保持運行,如果1號行程退出了,Docker容 器也就退出了,
//準備網站頁面
echo "this is test web" > index.html
//生成鏡像
docker build -t httpd:centos7 . #注意別忘了末尾有"."
//新鏡像運行容器
docker run -d -p 1216:80 httpd:centos7
//外主機測驗
http://192.168.80.10:1216/
########如果有網路報錯提示########
[Warning] IPv4 forwarding is disabled. Networking will not work.
解決方法:
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -P
systemctl restart network
systemct1 restart docker
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292839.html
標籤:其他
