Docker基礎4. Docker工具
Docker Engine Docker Compose Docker Swarm
Docker Machine Docker Registry Kitematic
管理所有Docker相關操作 多容器定義與協作 跨主機多容器協作
Docker Engine的執行環境 存放容器映象檔的地方 提供Docker UI操作介面
14. Docker for windows 架構
Docker Engine
Hyper-V: VM
實體機器
• 實際上是跑在Hyper-V的VM上
• 目前Stable的版本僅支援Linux-based的
作業系統
• Beta可以支援Windows容器,但是尚不穩
定
18. 從Docker Hub取得印象檔
指令: docker pull [印象檔名稱]:[標籤]
功用: 從Docker Hub取得指定版本的印象檔
目的: 很多時候,許多基礎的印象檔已經有社群協助提供,並且放置在Docker Hub上。
除非太過客製化,否則絕大部份都可以在Docker Hub上取得所需要的基礎
印象檔。
備註: 若不指定版本,則Docker會自動預設以latest版本為抓取的對象。
(docker pull hello-world:latest)
20. 標記印象檔
指令: docker tag [印象檔名稱]:[標籤] [印象檔]:[新標籤]
功用: 為指定印象檔添加一個標籤
目的: 不常使用到這個指令。
備註: 要注意使用了這個指令之後,僅是一個類似淺複製的行為,因此,原本的印象檔
與新標籤的印象檔,兩者的內容是一致的。
關鍵點在於Image ID
23. 運行Docker容器
指令: docker run [參數…] [印象檔名稱]:[標籤] [命令]
功用: 啟動指定印象檔為容器
目的: 開發過程中,經常需要自行建構or從印象檔倉儲取得印象檔到本機,
為了要能夠確認印象檔是否已存在本機,會使用這個指令
26. 列舉本機容器
指令: docker ps
功用: 列舉出當前本機的容器
目的: 開發過程中,需要確認容器執行的情況;在本例子中,本機目前有一個容器正在執行中。
每一筆列舉的資料有幾個欄位需要特別關注: Status, Ports;這兩個欄位指示了容器的
執行狀態,以及開放給主機(Host)的埠號。
若啟動容器時,沒有指定容器名稱,則Docker會自行給予一個不重覆的隨機名稱,這個
時候就會需要使用docker ps指令來查看容器被賦予的名稱。
備註: 很多時候建議加上參數a(註: 完整指令為docker ps –a);這是因為docker ps預設僅會顯
示還處於運行狀態的容器,但很多時候因為組態不正確導致容器起動失敗,這種情境
就會需要加上參數a才能看到。
27. 查看容器組態資訊
指令: docker inspect [容器名稱]
功用: 查看指定容器的組態資訊
目的: 開發過程中,需要確認容器的組態資訊,特別是關於網路的部份。
備註: docker inspect指令本身會列印出容器所有的組態資訊,但很多時候只需要某部份
的資料,因此,可以再加上format參數來過濾資訊。
要注意Format路徑是有大小寫之分,且開頭有個點(dot)
30. 連線到容器
指令: docker exec [參數…] [容器名稱] [命令]
功用: 執行某個正在運行中的容器的命令
目的: 當需要進到容器中進行細部的控制時,會使用這個指令連線到容器中。
參數ti,其實是兩個參數(-t, -i)的結合,其目的在於將容器的輸出資訊顯
示到視窗中。
31. 複製檔案到容器中
指令: docker cp [本機檔案路徑] [容器名稱]:[容器檔案目標路徑]
docker cp [容器名稱]:[容器檔案路徑] [本機檔案目標路徑]
功用:複製本機/容器的檔案到容器/本機的指定位址
目的: 當需要複製檔案到容器內部,很需要此指令。此指令被大量
應用在應用程式部署。
32. 提交印象檔新版本
指令: docker commit [參數….] [容器ID] [印象檔名稱]:[標籤]
功用: 將容器異動後的內容,提交成為一個新的印象檔
目的: 開發過程中,會需要對基礎印象檔進行一些微調(註:為了效能),為了避免重複的執行
相同的動作。
35. 移除容器
指令: docker rm [參數…] [容器名稱]
功用: 刪除非運行中的容器
目的: 當不需要容器的時候,可以直接刪除它。
備註: 只有非運行中的容器可以刪除,如果硬是要刪除運行中的容器。需加上參數f
(docker rm –f [容器名稱])
44. 架設私有倉儲
指令: docker run –d –p 5000:5000 –v [本機路徑]:[容器路徑] registry
功用: 架設一個私人的印象檔倉儲
目的: 團隊共享印象檔,為CI/CD奠定基礎。
50. 指令(1)-FROM, MAINTAINER, RUN
指令: FROM
格式: FROM <image> 或 FROM <image>:<tag>
備註: Dockerfile的第一個指令必須為FROM;並且,如果在同一個Dockerfile中創建多的印象檔時,
可以使用多個FROM指令(註:每個印象檔一次)。
指令: MAINTAINER
格式: MAINTAINER <name>
備註: 說明此Dockerfile的維護者相關資訊。
指令: RUN
格式: RUN <command> 或 RUN [‘executeable’,’param1’,’param2’]
備註: 第一種格式的命令較為單純,而第二種格式與第一種執行效果相同。
51. 指令(2)-CMD, EXPOSE, ENV
指令: CMD
格式: CMD [‘executable’,’param1’,’param2’]
CMD command param1 param2
CMD [‘param1’,’param2’]
備註: 第一種是較推薦的方式;
第二種則是在/bin/sh中執行,提供需要互動的應用。
第三種是提供給ENTRYPOINT的預設參數
指令: EXPOSE
格式: EXPOSE <port> [<port> …]
備註: 開放一到多個埠號。
指令: ENV
格式: ENV <key> <value>
備註: 指定容器的環境變數值。
52. 指令(3)-ADD, COPY, ENTRYPOINT
指令: ADD
格式: ADD <src> <dest>
備註: 複製指定的<src>到容器中的<dest>,其中<src>可以是Dockerfile所在目錄的一個相對
路徑(文件或是目錄);也可以是一個Url;還可以是一個tar檔案(自動解壓縮為目錄)
指令: COPY
格式: COPY <src> <dest>
備註: 複製本地主機的<src>(為Dockerfile所在目錄的相對路徑,檔案或目錄)為容器中的<dest>。
目標路徑不存在時,會自動創建。(相較於ADD,推薦使用COPY)
指令: ENTRYPOINT
格式: ENTRYPOINT [‘executable’,’param1’,’param2’]
ENTRYPOINT command param1 param2
備註: 組態容器啟動後所執行的命令,並且無法被docker run所指定的命令所覆蓋。
每個Dockerfile只能有一個ENTRYPOINT,當指定多個時,只有最後一個生效。
53. 指令(4)-VOLUME, USER
指令: VOLUME
格式: VOLUME [‘/data’]
備註: 創建一個可以從本地主機或其它容器掛載的掛載點,一般用來存放資料庫和需要維持
的資料等。
指令: USER
格式: USER daemon
備註: 指定運行容器的用戶名或UID,後續的RUN也會使用指定帳號。
當服務不需要管理員權限時,可以透過此命令指定執行的帳號。並且可以在之前創建
所需要的用戶,例如: RUN groupdd –r postgres && useradd –r –g postgres。要臨時獲取
管理員權限可以使用gosu,而不推薦sudo。
54. 指令(5)-WORKDIR, ONBUILD
指令: WORKDIR
格式: WORKDIR /path/to/workdir
備註: 為後續的RUN、CMD、ENTRYPOINT指令組態工作目錄。
可以使用多個WORKDIR指令,後續命令如果參數是相對路徑,則會基於之前命令指定
的路徑。
(例) WORKDIR /a
WORKDIR b
WORKDIR c
則最終路徑為 /a/b/c。
指令: ONBUILD
格式: ONBUILD [INSTRUCTION]
備註: 組態當所創建的印象檔作為其它新創建印象檔的基礎印象檔時,所執行的操作指令。
例如,Dockerfile使用如下的內容創建的印象檔image-A
ONBUILD ADD ./app/src
ONBUILD RUN /usr/local/bin/python-build –dir /app/src
當新的Dockerfile使用了FROM image-A指定基礎印象檔時,會自動執行ONBUILD指令的
內容。
57. 總結
• Docker的內部結構是Layer FS
• Docker就是由: Image + Container + Registry所組成
• Docker的印象檔版本概念與Git相同
• Docker的容器之間是絕對隔離
• Docker Engine負責管理所有容器的運行,並在容器異常時,直接停止
該容器
• Dockerfile是建造印象檔的好幫手