更詳細的 Docker 操作方法
到目前為止,介紹了許多操作 Docker 的方法,現在來了解更詳細的操作方法。
說穿了,其實還是下指令,今天指令將會介紹三個部分如下:
- Docker 子指令
- 操作 container
- 建立 container 的參數
- 檢視元件的指令
Docker 子指令
目前已知道的元件有 image、container、volume、network 四種,其實它們分別有個自的子指令如下:
docker image
docker container
docker volume
docker network
今天簡單介紹一下 docker image
與 docker 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 移除。
REPOSITORY
與TAG
標<none>
- 沒有其他 image 或 container 依賴這個孤兒 image
REPOSITORY TAG IMAGE ID CREATED SIZE |
以上面這個例子來說:
- 符合
REPOSITORY
與TAG
標<none>
條件 - 是否跟 image 有依賴關係可以用
docker image ls -f dangling=true | grep f9bb75ff4a9c
指令檢查 - 是否跟 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。 |
操作 container
docker image
的操作方法幾乎都說明過了,但 docker container
還有很多指令都沒看過,下面會繼續介紹。
docker container cp
這個指令與 Dockerfile COPY 有一半像,docker container cp
與 COPY
都可以把 host 的檔案複製到 container,而只有 docker container cp
可以把 container 的檔案複製到 host。
用法如下:
docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- |
一個例子如下:
# 把 container 裡 build 好的 JAR 檔複製出來 |
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 |
以上面的例子可以發現幾件事:
- Dockerfile 很多設定都可以在
docker run
階段再覆蓋 - CPU 與記憶體設定可以調整使用上限
- 網路設定幾乎都可以客製化--網路是 container 對外溝通的重要管道之一
- Volume 設備也可以客製化--也是 container 對外溝通的管道
建議讀者可以看過一輪,大致了解 Docker 可以控制 container 什麼樣的設定。
docker container update
動態調整 container 的 CPU、memory、restart 機制等。
是的,volume 設定與網路設定是無法調整的,只能砍掉重練。但只要 docker volume 與 docker network 有配置好,砍掉重練是非常簡單的。
檢視元件的指令
四種元件都有各自的 inspect 指令:
docker image inspect |
如 container,可以查出非常詳細的 Volume 設定、網路設定、CPU、Memory 等資訊。
# Volume 設定 |
今日自我回顧
今天介紹的指令或參數,可以做更詳細的設定,或查到更詳細的資訊。Kubernetes 或其他 container orchestration 工具,其實就是用這些方法與資訊在管理 container 的,因此了解這些內容對於開發出適用於 container orchestration 工具的程式或 image,是非常有幫助的。