Website logo

Robert Chang

技術部落格

Docker - Container 的相關指令 ( 下 )

昨天學到了替容器命名以及為什麼重新啟動容器不需要加入原先的設定,今天將繼續把容器相關的指令給交代完。

觀看容器的事件紀錄

在學會背景執行容器後,會遇到沒辦法觀看事件紀錄 ( Log ) 的情形發生,這時候很簡單,接續著上面的章節,一樣對 nginx 這個容器下指令:

$ docker container logs nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2022/08/30 16:23:35 [notice] 1#1: using the "epoll" event method
2022/08/30 16:23:35 [notice] 1#1: nginx/1.23.1
2022/08/30 16:23:35 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2022/08/30 16:23:35 [notice] 1#1: OS: Linux 5.10.104-linuxkit
2022/08/30 16:23:35 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022/08/30 16:23:35 [notice] 1#1: start worker processes
2022/08/30 16:23:35 [notice] 1#1: start worker process 32
2022/08/30 16:23:35 [notice] 1#1: start worker process 33
2022/08/30 16:23:35 [notice] 1#1: start worker process 34

$

但這只是把事件紀錄印出來,有時候在網站開發的情況下,我們需要一直持續追蹤事件的進展,這時候加上 --follow 的參數,就能夠達到一樣的效果。

$ docker container logs --follow nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2022/08/30 16:23:35 [notice] 1#1: using the "epoll" event method
2022/08/30 16:23:35 [notice] 1#1: nginx/1.23.1
2022/08/30 16:23:35 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2022/08/30 16:23:35 [notice] 1#1: OS: Linux 5.10.104-linuxkit
2022/08/30 16:23:35 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022/08/30 16:23:35 [notice] 1#1: start worker processes
2022/08/30 16:23:35 [notice] 1#1: start worker process 32
2022/08/30 16:23:35 [notice] 1#1: start worker process 33
2022/08/30 16:23:35 [notice] 1#1: start worker process 34

# 這邊會像是當機一樣,等待事件記錄

同理,要離開只需要下 Ctrl + C 的指令就能夠離開輸出的畫面。

刪除容器

這章節是容器的生命週期,當然要在最後刪除掉容器才算是圓滿,容器本身是會佔掉電腦的硬碟空間,所以刪除容器是以後常常會做的一件事情。

$ docker container rm nginx
Error response from daemon: You cannot remove a running container 3e489a611df3a09a50dec629824f2d4d7b5f132a961917df Stop the container before attempting removal or force remove

rm 這個動作意指 remove 的意思;但在這邊我們可以看到 daemon 給了我們一個錯誤,大意上是說我們不能夠刪除掉一個正常執行的容器。

所以這邊我們有兩種做法:

第一個是先暫停在刪除容器,這也是比較文明一點的做法:

$ docker container stop nginx
nginx

$ docker container rm nginx
nginx

第二個則是強行刪除正在執行的容器:

$ docker container rm --force nginx
nginx

接著為了證明有刪除這件事,我們再列出所有的容器吧!

$ docker container list --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

恭喜你見證了一個容器從啟動、暫停、重新啟動、刪除的過程。

指令的縮寫

在上面所有的指令都採用完整的寫法,最大的目的是希望大家可以了解縮寫的原意是什麼,這在使用指令上也可以幫助記憶,一開始可以嘗試多使用完整的指令,之後再嘗試使用縮寫會比較好喔!

基礎啟動容器指令練習

提供一些小小的練習來熟悉本章的內容,通常會比較難一點;若是想不出來也不需要灰心,有些時候可能是指令不熟悉導致,可以往前幾天的文章看來加強記憶,記得 --help 以及 docs.docker.com 會是你最好的夥伴。

  1. 請你在背景執行三個不同的服務,分別是 nginx、postgres、httpd ( apache ),並且分別給容器命名
  2. nginx 要執行在 80:80,postgres 要執行在 5432:5432,httpd 則要執行在 8080:80
  3. 當你在啟動 postgres 容器時,需要給予環境變數 --env POSTGRES_PASSWORD=mysecretpassword 才能夠正確啟動
  4. 使用 docker container logs 的指令來確認服務都有正常啟動
  5. 停止並刪除上述三個容器
  6. 使用 docker container list --all 來確認容器都有徹底刪除

結語

今天結束了容器基礎操作的章節,明天會稍微介紹一下容器以及虛擬機之間的差別。

有時間的新手們可以稍微試著做做看練習,多多熟悉 Docker 的指令對於後面的使用會有幫助的!

上一篇文章Docker - Container 的相關指令 ( 中 )

下一篇文章Docker - Container vs 虛擬機