2023 iT邦鐵人賽 Day 8 - 容器的建立與啟動

前言

透過前兩天的講解,希望大家對 Docker 的容器有一定的了解。今天我們要離開學術的象牙塔,自己動手來玩玩看,容器要如何建立、刪除等。

想要跟著文章動手做的讀者們,還請大家先安裝好 Docker,並且記得要開啟 Docker Desktop 並登入,才有辦法在本機中完成以下手作。

容器建立與啟動

run

執行 docker container run 映像檔名稱(image):標籤(tag) 以建立並啟動容器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> docker container run httpd

1. Unable to find image 'httpd:latest' locally
2. latest: Pulling from library/httpd
3. 4ee097f9a366: Already exists
4. 94662ba12854: Pull complete
5. 595a05b7c0ad: Pull complete
6. 03682c916abd: Pull complete
7. 7e88a38e211a: Pull complete
8. Digest: sha256:333f7bca9fb72248f301fd2ae4892b86d36cc2fdf4c6aa49a6700f27c8e06daf
9. Status: Downloaded newer image for httpd:latest
10. AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
11. AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
12. [Sun Sep 03 14:42:54.245510 2023] [mpm_event:notice] [pid 1:tid 281473761857568] AH00489: Apache/2.4.57 (Unix) configured -- resuming normal operations
13. [Sun Sep 03 14:42:54.259073 2023] [core:notice] [pid 1:tid 281473761857568] AH00094: Command line: 'httpd -D FOREGROUND'

輸入完成後會看到多行的回傳資訊,基本上就是 Docker 找不到 http 映像檔,所以就把它抓下來並建立容器。等之後介紹到映像檔時,我們再來細細講解這些 log 是什麼意思。

當看到 12 與 13 行,代表容器正在運作,而你的終端機正在被容器運行所佔用中,只要按下 control + c 就能關閉容器,並繼續使用終端機。

run 指令幫我們做了什麼?

  1. 找映像檔
  2. 找不到,自動下載映像檔
  3. 下載完後,依照該映像檔建立一個容器,啟動容器,讓容器運作起來

create + start

在使用 run 時, run 一口氣幫我們做了很多事情,但其實我們也可以一步一步慢慢來。

1. 下載要使用的映像檔

docker image pull httpd

2. 用下載的映像檔建立容器

docker container create httpd

建立完成後,會在終端機上看到一長串字串,那是在容器被建立完成後,回傳的 容器 ID

3. 啟動剛剛建立的容器

docker container start 容器ID或容器名稱(name)

這裡跟前一步驟不一樣,要輸入的是 容器 ID 或是 容器名稱 (name) ,而不是映像檔名稱,因為你現在要啟動 (start) 的是容器,而前一步是用映像檔建立容器。

查看容器

我們剛剛建立並啟動了容器,但我們要怎麼看到容器呢?

查看運作中的容器

docker container ls / docker container ps

透過上述指令,可以查詢運行中的容器,所以尚未啟動的容器,是不會出現在清單上。如果在上面容器建立並啟動正常,就可以在輸入指令後看到容器的資訊。

以下是我這邊的資訊:

1
2
3
4
> docker container ls   

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82c383e88c6c httpd "httpd-foreground" 5 minutes ago Up 4 minutes 80/tcp elegant_payne

這是剛剛建立並正在運行的容器,從左到右依序是:

CONTAINER ID: 容器 ID。

IMAGE: 建立該容器的映像檔。

COMMAND: 啟動容器時的命令,主要定義在 Dockerfile 內的 CMD

CREATED: 建立容器的時間。

STATUS: 容器狀態, up 為運行狀態、 exited 為退出狀態(也就是被終止運行)、 paused 為暫停狀態 (並未被終止)、 created 為已建立狀態 (被建立但尚未啟動)、 dead 為結束狀態(因容器內某些錯誤原因導致無法再被啟動)、 restarting 為重啟狀態。

PORTS: 容器的連接阜。

NAMES: 容器的名稱。

想看沒有啟動的容器?

上述指令只看得到啟動且運行中的容器,如果想要看沒有啟動的容器,就使用參數 --all-a ,兩個是一樣的,可以查看全部的資訊: docker container ls --alldocker container ls -a

docker container ps --alldocker container ps -a

docker container ls 與 docker container ps

這兩者都是查看運行中的容器的指令,那到底有什麼不一樣呢?

在某些容器相關的指令, container 是可省略的, ps 就是其中一個,所以輸入 docker ps 也是能正常使用,但如果是 docker ls 就會出現錯誤。

這原因其實很簡單, ps 只專屬容器使用,但 ls 則還會被其他,像是 image、volume、network 等,這種共通使用的指令,就必須指名道姓,是誰要用它,是 container 要查詢 ls 還是 image 還是其他的好朋友。

結論

今天帶大家手動建立並啟動容器,以及如何查看容器,這些指令其實不難,基本上常用的大同小異,練習幾次就會記得了,比較多、比較複雜的是指令參數 ( 也就是上面提到的 --all 這種有 - 的指令 ),明天會帶大家介紹容器常會使用到的指令參數們。