Docker之dockerfile小結
Docker學習之dockerfile
Dockerfile 是一個用來構建映象的文字檔案,文字內容包含了一條條構建映象所需的指令和說明。
基礎知識
指令語句
指令語句可以大致分為兩種:配置指令和操作指令
指令不區分大小寫。但是,使用中我們約定大寫,以便更輕鬆地將它們與引數區分開。
這些指令基本上都可以在 docker run命令中使用用相關引數來覆蓋掉 Dockerfile相關的值,docker run 的引數優先順序高
- 指令語句的基礎知識:
- 每條保留字指令都必須是大寫字母並且後面要跟隨至少一個引數
- 指令按照從上到下,順序執行
- # 表示註釋
- 每條指令的執行都會建立一個新的映象層,注意:過多無意義的層,會造成映象膨脹過大。
上下文路徑
上下文路徑:指 docker 在構建映象時,如果需要使用到本機的檔案(比如複製),docker build 命令得知這個路徑後,會將該路徑下的所有內容打包
解析:由於 docker 的執行模式是 C/S。我們本機是 C,docker 引擎是 S。實際的構建過程是在 docker 引擎下完成的,所以這個時候無法用到我們本機的檔案。這就需要把我們本機的指定目錄下的檔案一起打包提供給 docker 引擎使用。
如果未說明最後一個引數,那麼預設上下文路徑就是 Dockerfile 所在的位置。
注意:上下文路徑下不要放無用的檔案,因為會一起打包傳送給 docker 引擎,如果檔案過多會造成過程緩慢。
製作dockerfile
基於已有的映象建立
docker commit :從容器建立一個新的映象
#語法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]
常用引數:
- -a :提交的映象作者;
- -c :使用Dockerfile指令來建立映象;
- -m :提交時的說明文字;
- -p :在commit時,將容器暫停。
例如:結合docker cp命令自定義nginx的index頁面
docker run -itd --name nginx -p 80:80 192.168.1.214:5000/zhsl/nginx:v1 cd /data echo "laowan" > /data/index.html docker cp /data/index.html nginx:/usr/share/nginx/html/index.html curl localhost docker container commit -m "update index.html file" -a "laowan" nginx 192.168.1.214:5000/zhsl/nginx:v2 docker images docker rm -f nginx docker run -itd --name nginx -p 80:80 192.168.1.214:5000/zhsl/nginx:v2 curl localhost docker push 192.168.1.214:5000/zhsl/nginx:v2
官網地址
https://docs.docker.com/engine/reference/builder/
Dockerfile其實就是我們用來構建Docker映象的原始碼,當然這不是所謂的程式設計原始碼,而是一些命令的集 合,只要理解它的邏輯和語法格式,就可以很容易的編寫Dockerfile。簡單點說,Dockerfile可以讓使用者 個性化定製Docker映象。因為工作環境中的需求各式各樣,網路上的映象很難滿足實際的需求。
Dockerfile的基本結構
Dockerfile是一個包含用於組合映像的命令的文字文件。可以使用在命令列中呼叫任何命令。 Docker通
過讀取Dockerfile中的指令自動生成映像
docker build命令用於從Dockerfile構建映像。可以在docker build命令中使用 -f 標誌指向檔案系統中任
何位置的Dockerfile。
Dockerfile由一行行命令語句組成,並且支援以#開頭的註釋行
Dockerfile分為四部分:基礎映象資訊、維護者資訊、 映象操作指令和容器啟動時執行指令
Dockerfile檔案說明
Docker以從上到下的順序執行Dockerfile的指令。為了指定基本映像,第一條指令必須是FROM。一個聲 明以 # 字元開頭則被視為註釋。可以在Docker檔案中使用 RUN , CMD , FROM , EXPOSE , ENV 等指 令。
Dockerfile常見命令
命令 | 解釋 |
---|---|
FROM | 指定基礎映象,必須為第一個命令 |
MAINTAINER | 維護者(作者)資訊 |
ENV | 設定環境變數 |
RUN | 構建映象時執行的命令 |
CMD | 構建容器後呼叫,也就是在容器啟動時才進行呼叫 |
ENTRYPOINT | 指定執行容器啟動過程執行命令,覆蓋CMD引數 ENTRYPOINT與CMD非常類似,不同的是通過docker run執行的命令不會覆蓋 ENTRYPOINT,而docker run命令中指定的任何引數,都會被當做引數再次傳遞 給ENTRYPOINT。Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆 蓋前面的設定,而只執行最後的ENTRYPOINT指令。 |
ADD | 將本地檔案新增到容器中,tar型別檔案會自動解壓(網路壓縮資源不會被解壓), 可以訪問網路資源,類似wget |
COPY | 功能類似ADD,但是是不會自動解壓檔案,也不能訪問網路資源 |
WORKDIR | 工作目錄,類似於cd命令 |
ARG | 用於指定傳遞給構建執行時的變數 |
VOLUMN | 用於指定持久化目錄 |
EXPOSE | 指定於外界互動的埠 |
USER | 指定執行容器時的使用者名稱或 UID,後續的 RUN 也會使用指定使用者。使用USER指 定使用者時,可以使用使用者名稱、UID或GID,或是兩者的組合。當服務不需要管理 員許可權時,可以通過該命令指定執行使用者。並且可以在之前建立所需要的使用者 |
我最近在做canal同步就遇到一個問題,需要同步一個UTC時區的資料到我的資料庫中來,所以需要修改mysql官網映象時區
FROM mysql:8.0.28
# 作者資訊
MAINTAINER mysql from date Asia/Shanghai by UTC "laowan"
ENV TZ UTC
build命令
docker build 命令用於使用 Dockerfile 建立映象。
docker build [OPTIONS] PATH | URL | -
常用引數
build命令引數特別多。這裡只給大家介紹幾個常用的引數,如果小夥伴們想了解更多內容,請參考 docker官網手冊。
- --build-arg=[] :設定映象建立時的變數;
- -f :指定要使用的Dockerfile路徑;
- --rm :設定映象成功後刪除中間容器;
- --tag, -t: 映象的名字及標籤,通常 name:tag 或者 name 格式;可以在一次構建中為一個映象設定 多個標籤。
製作映象
docker build --rm -t 192.168.1.214:5000/zhsl/mysql:8.0.28
docker images
執行映象
docker run -itd --name mysql --restart always -p 3306:3306 -e
MYSQL_ROOT_PASSWORD=123456 192.168.1.214:5000/zhsl/mysql:8.0.28
docker logs -f mysql
docker exec -it mysql bash
date
測試mysql連線
docker exec -it mysql bash