更詳細的 Docker 操作方法

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

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

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

Docker 子指令

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

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

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

docker image

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

Docker image 子指令 對應過去提過的指令
docker image build docker build
docker image history docker history
docker image import docker import
docker image load docker load
docker image ls docker images
docker image pull docker pull
docker image push docker push
docker image rm docker rmi
docker image save docker rmi
docker image tag docker 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 指令檢查

docker container

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

Docker container 子指令 對應過去提過的指令
docker container attach docker attach
docker container commit docker commit
docker container create docker create
docker container exec docker attach
docker container export docker export
docker container kill docker kill
docker container logs docker logs
docker container ls docker ps
docker container rm docker rm
docker container run docker run
docker container start docker start
docker container stop docker stop

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

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

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

操作 container

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

docker container cp

這個指令與 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 ./

docker container diff

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

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

操控 process 狀態

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

Docker 指令 信號
docker container kill SIGKILL
docker container pause SIGSTOP
docker container stop 先 SIGTERM,timeout 到了會改送 SIGKILL
docker container unpause SIGCONT

其他雜七雜八的指令

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 印出

建立 container 的參數

使用 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 什麼樣的設定。

docker container update

動態調整 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,是非常有幫助的。