dockerfile構建鏡像常用命令


一、什么是dockerfile

Dockerfile是一個包含用於組合映像的命令的文本文檔。可以使用在命令行中調用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。
docker build命令用於從Dockerfile構建映像。可以在docker build命令中使用-f標志指向文件系統中任何位置的Dockerfile。
# 例如:
docker build -f /path/to/a/Dockerfile

Dcokerfile的基本結構

Dockerfile 一般分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令,'#' 為 Dockerfile 中的注釋。

二、dockerfile文件說明

Docker以從上到下的順序運行Dockerfile的指令。為了指定基本映像,第一條指令必須是FROM。一個聲明以字符開頭則被視為注釋。可以在Docker文件中使用RUNCMDFROMEXPOSEENV等指令。

# 基礎鏡像:centos后可加版本:centos:7
FROM centos:7
#維護者信息注釋(選寫)
MAINTAINER xx xx@xx.com

# 安裝基礎軟件:盡可能少RUN,可以使用&& 鏈接
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm && yum  install nginx -y

# add 將本地文件扔到容器里
ADD index1.html /usr/share/nginx/html/index.html

# 開放端口
EXPOSE 80
# ADD run.sh /run.sh
# RUN chmod 755 /run.sh
# 啟動執行
CMD ["nginx"]
# 創建新鏡像 : .為Dockerfile所在目錄,在創建鏡像的目錄執行下面命令,ADD里的東西也放在同一個目錄
docker build -t nginx:centos .

# 啟動鏡像,去訪問index.html
docker run -d -P nginx:centos
[root@ ~]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
nginx               centos    578353538643   5 minutes ago   420MB

# 登錄
docker run -it -P  nginx:centos bash

[root@ ~]# docker ps
CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS          PORTS                                                                                NAMES
8de513a57286   nginx:centos   "bash"    17 seconds ago   Up 16 seconds   0.0.0.0:49174->80/tcp, :::49174->80/tcp, 0.0.0.0:49173->443/tcp, :::49173->443/tcp   sharp_sammet

常用參數:FROM: 指定基礎鏡像,必須為第一個命令


MAINTAINER: 維護者信息

ADD
#構建鏡像時執行的命令,將本地文件添加到容器中,tar類型文件會自動解壓(網絡壓縮資源不會被解壓),可以訪問網絡資源
格式:ADD <src>... <dest>

COPY:功能類似ADD,但是是不會自動解壓文件,也不能訪問網絡資源,拷貝文件或目錄至容器中,單純復制文件推薦使用

EXPOSE 指定容器與宿主機交互端口

RUN
# 構建鏡像時執行的命令,重復執行這個dockerfile時不會再執行
# linux
RUN shell命令
# windows
RUN ["executable", "param1", "param2"]
""" 注1:   RUN指令創建的中間鏡像會被緩存,並會在下次構建中使用。如果不想使用這些緩存鏡像,可以在構建時指定--no-cache參數,如:docker build --no-cache 注2:多行命令不要寫多個RUN,原因是Dockerfile中每一個指令都會建立一層. 多少個RUN就構建了多少層鏡像,會造成鏡像的臃腫、多層,不僅僅增加了構件部署的時間,還容易出錯。 """ CMD 構建容器后調用,也就是在容器啟動時才進行調用 格式: CMD ["executable","param1","param2"] (執行可執行文件,優先) CMD ["param1","param2"] (設置了ENTRYPOINT,則直接調用ENTRYPOINT添加參數) CMD command param1 param2 (執行shell內部命令) 示例: CMD echo "This is a test." | wc - CMD ["/usr/bin/wc","--help"]
注:CMD不同於RUN,CMD用於指定在容器啟動時所要執行的命令,而RUN用於指定鏡像構建時所要執行的命令。 ENTRYPOINT:配置容器,使其可執行化。配合CMD可省去
"application",只使用參數。
ENTRYPOINT ["executable","param1","param2"]
示例:ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-c","/usr/local/nginx/conf/nginx.conf"]
示例2:搭配CMD使用:一般變參才會使用CMD,這里的CMD等於在給ENTRYPOINT傳參
    ENTRYPOINT ["nginx","-c"] #定參
    CMD ["/etc/nginx/nginx.conf"] #變參
不傳參,容器內默認運行:nginx -c /etc/nginx/nginx.conf
傳參,覆蓋掉CMD里的指定文件: # docker run nginx:centos -c /etc/nginx/new.conf

ENV 設置環境變量,以便之后引用
# 語法有兩種 1. ENV <key> <value> 2. ENV <key>=<value> ... # 兩者的區別就是第一種是一次設置一個,第二種是一次設置多個
例如: ENV VERSION 6.6.6
    RUN curl -SLO "https://xxx/$VERSION/XX.tar.gz" VOLUME 可實現掛載功能,可以將本地文件夾或者其他容器中的文件夾掛在到這個容器種
用途:避免重要數據因容器重啟而丟失,避免容器不斷變大
# 語法為,可以時多個值: VOLUME ["/data"] VOLUME ["/var/log/"] VOLUME /var/log VOLUME /var/log /var/db# docker容器的數據管理
from centos
VOLUME ["/datavolume3","/datavolume6"]
CMD /bin/bash

# 構建命令
docker build -t="volume" .
# 啟動容器后會發現2個目錄
/datavolume3和/datavolume6


# docker的數據卷容器
數據卷容器:命名的容器掛載數據卷,其它容器通過掛載這個容器實現數據共享,掛載數據卷的容器就叫做數據卷容器
掛載方法:
docker run --volumes-from [container name]
示例:
(1) 創建第一個容器
    docker run --name data-volume -dit volume 在/datavolume3中創建一個文件xc.txt
(2)創建第二個容器
    docker run --name data-volume2 --volumes-from data-volume -itd centos /bin/bash
    登錄到data-volume2中就會發現對應目錄也有/datavolume3和/datavolume6,並且/datavolume3目錄中有xc.txt文件

# docker數據卷的備份和還原,容器與容器之間的數據備份還原
數據備份方法:
docker run --volumes-from [container name] -v $(pwd):/backup centos tar czvf /backup/backup.tar [container data volume]

示例:將容器data-volume2中/datavolume卷進行備份到/root/backup/目錄中
備份:docker run --volumes-from data-volume2 -v /root/backup:/backup --name datavolume-copy centos tar czvf /backup/datavolume.tar.gz /datavolume
還原:docker run --volumes-from data-volume2 -v /root/backup:/backup centos tar czvf /backup/datavolume.tar.gz -C /

USER 設置啟動容器的用戶和用戶組
USER daemo
注意:如果設置了容器以daemon用戶去運行,那么RUN, CMD 和 ENTRYPOINT 都會以這個用戶去運行
格式:USER user:group WORKDIR
# 語法,類似cd功能: WORKDIR /path/to/workdir # 設置工作目錄,對RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在則會創建,也可以設置多次。 ARG:用於指定傳遞給構建運行時的變量 格式: ARG <name>[=<default value>]

ONBUILD 用於延遲構建命令的執行,Dockerfile里使用ONBUILD指定的命令,在本次構建鏡像過程中不執行,當有新的dockerfile使用了之前構建的鏡像作為基礎鏡像,這是執行新鏡像的dockerfile構建時候,會執行ONBUILD指定的命令
例如:自己制作了一個centos基礎鏡像,制作的時候有一條ONBUILD命令,當使用這個鏡像作為nginx鏡像時就會執行onbuild命令

LABLE 指令給鏡像添加元數據

HEALTHCHECK 用於指定某個程序或指令來監控docker容器服務的運行狀態
格式:HEALTHCHECK [選項] CMD <命令>:設置檢查容器健康狀況的命令
   HEALTHCHECK NONE:如果基礎鏡像有健康檢查指令,使用這行可以屏蔽其監控檢查指令

ARG 構建參數與ENV作用一致,但作用域不同,ARG設置的環境變量僅對dockerfile內有效,只在docker build過程中有效,構建好的鏡像內不存在此環境變量
格式: ARG 參數名=默認值

 

# tomcat 安裝
# cat tomcat.yaml
FROM centos:8
MAINTAINER xiong
RUN yum install wget
ADD jdk-8u281-linux-x64.rpm /usr/local/
ADD apache-tomcat-8.5.50.tar.gz /usr/local/
RUN cd /usr/local && rpm -ivh jdk-8u281-linux-x64.rpm
RUN mv /usr/local/apache-tomcat-8.5.50.tar.gz /usr/local/tomcat8
EXPOSE 8080
ENTRYPOINT /usr/local/tomcat8/bin/startup.sh && tail -F /usr/local/tomcat8/logs/catalina.out


#構建tomcat
docker build -t="tomcat8:v1" tomcat.yaml

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM