目錄

更詳細的 Docker 操作方法

到目前為止,介紹了許多操作 Docker 的方法,現在來了解更詳細的操作方法。

說穿了,其實還是下指令,今天指令將會介紹三個部分如下:

  1. Docker 子指令
  2. 操作 container
  3. 建立 container 的參數
  4. 檢視元件的指令

目前已知道的元件有 image、container、volume、network 四種,其實它們分別有個自的子指令如下:

  • docker image
  • docker container
  • docker volume
  • docker network

今天簡單介紹一下 docker imagedocker container 這兩個子指令,這裡同時複習過去提到的指令。

這個指令是用來管理 image 的,過去有提到的指令如下:

Docker image 子指令對應過去提過的指令
docker image builddocker build
docker image historydocker history
docker image importdocker import
docker image loaddocker load
docker image lsdocker images
docker image pulldocker pull
docker image pushdocker push
docker image rmdocker rmi
docker image savedocker rmi
docker image tagdocker tag

這裡有個很好用的指令是 docker image prune,它會把同時符合下面條件的「孤兒」image 移除。

  1. REPOSITORYTAG<none>
  2. 沒有其他 image 或 container 依賴這個孤兒 image
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
<none>                       <none>              f9bb75ff4a9c        13 hours ago        56.2MB

以上面這個例子來說:

  1. 符合 REPOSITORYTAG<none> 條件
  2. 是否跟 image 有依賴關係可以用 docker image ls -f dangling=true | grep f9bb75ff4a9c 指令檢查
  3. 是否跟 container 有依賴關係可以用 docker ps -a -f ancestor=f9bb75ff4a9c 指令檢查

這個子指令也很直白,就是管理 container:

Docker container 子指令對應過去提過的指令
docker container attachdocker attach
docker container commitdocker commit
docker container createdocker create
docker container execdocker attach
docker container exportdocker export
docker container killdocker kill
docker container logsdocker logs
docker container lsdocker ps
docker container rmdocker rm
docker container rundocker run
docker container startdocker start
docker container stopdocker stop

過去已停止的 container 都是靠人工刪,或是 --rm 讓 Docker 自動刪。現在介紹 docker container prune 指令,它可以清除沒用的 container。清除的條件是所有停止的 container,包括剛建立未啟動的狀態也算停止的 container。

另外再介紹,如果是 Bash 的話,可以用下面這個指令無條件清除所有 container:

# -v 參數代表要順便移除 volume。
docker rm -vf $(docker ps -aq)

docker image 的操作方法幾乎都說明過了,但 docker container 還有很多指令都沒看過,下面會繼續介紹。

這個指令與 Dockerfile COPY 有一半像,docker container cpCOPY 都可以把 host 的檔案複製到 container,而只有 docker container cp 可以把 container 的檔案複製到 host。

用法如下:

docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker container cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

一個例子如下:

# 把 container 裡 build 好的 JAR 檔複製出來
docker container cp jdk_container:/source/target ./

Hello Docker World 有提到,image 的內容是唯讀的,而 container 內容是可讀寫。

這個指令可以查 container 檔案系統,與 image 檔案系統的差異,也就是 container 啟動後,到底對檔案系統做了哪些修改。

之前曾提到 docker stop 是送出 SIGTERM 信號、docker kill 則是送出 SIGKILL。這裡把相關的指令和對應的信號都列出來:

Docker 指令信號
docker container killSIGKILL
docker container pauseSIGSTOP
docker container stop先 SIGTERM,timeout 到了會改送 SIGKILL
docker container unpauseSIGCONT
Docker 指令用途
docker container port查目前 host 與 container 有設定哪些 port forwarding
docker container rename改 container 名稱
docker container restart先 stop 再 start
docker container stats查看 container 的 CPU 與記憶體使用量
docker container top觀察 container process 狀態,其實等於在 container 裡下 ps 指令
docker container wait執行後,會等到 container 結束,然後再把 exit code 印出

使用 docker container create --help 指令,可以看到非常多參數可以使用,這裡列幾個出來參考:

參數用途
–add-host新增 host 與 ip 的對照表,也就是 /etc/hosts 的表
–cpus分配 CPU 資源
–device分配 host 的裝置
–dns自定義 DNS server
–entrypoint覆寫 ENTRYPOINT 設定,注意這裡會是 exec mode
–env-file如果 env 族繁不及備載的話,可改用檔案
–expose揭露可以使用的 port
–gpus分配 GPU 資源
–hostname自定義 hostname
–ip自定義 IP
–label設定 metadata
–mac-address自定義 MAC address
–memory設定記憶體上限
–restart設定自動重啟機制
–volume-driver使用 volume driver

以上面的例子可以發現幾件事:

  1. Dockerfile 很多設定都可以在 docker run 階段再覆蓋
  2. CPU 與記憶體設定可以調整使用上限
  3. 網路設定幾乎都可以客製化--網路是 container 對外溝通的重要管道之一
  4. Volume 設備也可以客製化--也是 container 對外溝通的管道

建議讀者可以看過一輪,大致了解 Docker 可以控制 container 什麼樣的設定。

動態調整 container 的 CPU、memory、restart 機制等。

是的,volume 設定與網路設定是無法調整的,只能砍掉重練。但只要 docker volumedocker network 有配置好,砍掉重練是非常簡單的。

四種元件都有各自的 inspect 指令:

docker image inspect
docker container inspect
docker volume inspect
docker network inspect

如 container,可以查出非常詳細的 Volume 設定、網路設定、CPU、Memory 等資訊。

# Volume 設定
docker container inspect -f '{{json .Mounts}}' fdad097c5781

# 網路設定
docker container inspect -f '{{json .NetworkSettings}}' fdad097c5781

# CPU、Memory 資訊
docker container inspect -f '{{json .HostConfig}}' fdad097c5781

今天介紹的指令或參數,可以做更詳細的設定,或查到更詳細的資訊。Kubernetes 或其他 container orchestration 工具,其實就是用這些方法與資訊在管理 container 的,因此了解這些內容對於開發出適用於 container orchestration 工具的程式或 image,是非常有幫助的。