Learning Objectives
- 用 docker container run 建立並執行容器,分辨互動式(-it)與服務式(-d)容器
- 用 docker container ls 與 ls -a 查看容器,看懂 STATUS 欄位
- 用 start、stop、attach、exec、rm 管理容器的生命週期
- 用 logs 與 inspect 查看服務式容器的輸出與設定
映像檔與容器的關係
上一課執行了 hello-world。這一課仔細看「容器」從建立到移除的整個過程。
先分清楚兩個名詞:
| 名詞 | 比喻 | 特性 |
|---|---|---|
| 映像檔(image) | 安裝光碟、食譜 | 唯讀的範本,裡面有作業系統檔案、程式與設定 |
| 容器(container) | 用光碟裝好的一台電腦、照食譜做出的一道菜 | 由映像檔建立出來、正在執行或執行過的「實例」;同一個映像檔可以建立很多個容器 |
一個容器會經歷這些狀態:
docker container run ──▶ 執行中(Up)──stop/程式結束──▶ 已停止(Exited)──rm──▶ 移除
▲ │
└──────────────start────────────────┘
容器停止不等於刪除:停止的容器還在,裡面的檔案也還在,可以再
start;rm之後才真的消失。
建立互動式容器
最常見的寫法是:
docker container run -it --name my_ubuntu ubuntu:24.04 /bin/bash
| 部分 | 意思 |
|---|---|
-i |
interactive:保持標準輸入開著,讓你可以打字 |
-t |
tty:配一個終端機給你 |
--name my_ubuntu |
指定容器名稱;不指定時 Docker 會自動取一個隨機名字(例如 distracted_torvalds) |
ubuntu:24.04 |
用哪一個映像檔(名稱:標籤);本機沒有就會自動從 Docker Hub 下載 |
/bin/bash |
容器啟動後要執行的程式,這裡是 bash 殼層 |
執行後提示字元會變成 root@a3f9c2e1b7d4:/#:你已經在容器「裡面」了,@ 後面是容器 ID 的前 12 碼。
在容器裡輸入 exit 離開時,bash 結束,容器也跟著停止。
容器名稱的規則:只能用英數字、底線、句點與 -,而且必須唯一;要建立同名的新容器,得先把舊的移除。
查看容器:ls 與 ls -a
| 指令 | 列出 | 舊寫法 |
|---|---|---|
docker container ls |
只列執行中的容器 | docker ps |
docker container ls -a |
列出所有容器,包含已停止的 | docker ps -a |
docker container ls -n 5 |
最近建立的 5 個 |
輸出的重點欄位:
- CONTAINER ID:容器 ID(前 12 碼),可以代替名稱使用
- IMAGE:由哪個映像檔建立
- STATUS:
Up 2 minutes=執行中;Exited (0) …=已停止,括號是結束碼,0 代表正常結束 - PORTS:埠號對應(第 09 課)
- NAMES:容器名稱
只用
ls時看不到剛剛 exit 的容器,很多人以為它被刪掉了;加上-a才看得到。
重新啟動、進入與停止
| 指令 | 作用 |
|---|---|
docker container start my_ubuntu |
重新啟動已停止的容器(用名稱或 ID 都可以) |
docker container restart my_ubuntu |
先停止再啟動 |
docker container attach my_ubuntu |
接回容器的主程式(這裡是 bash);可能要按一下 Enter 才看到提示字元 |
docker container exec -it my_ubuntu bash |
在執行中的容器裡另外開一個 bash;離開這個 bash 不會讓容器停止 |
docker container stop my_ubuntu |
送出停止訊號,讓容器正常結束 |
docker container kill my_ubuntu |
直接強制結束 |
在 attach 的畫面裡,按 Ctrl+P 再按 Ctrl+Q 可以「脫離」容器而不讓它停止;直接 exit 會讓主程式結束、容器停止。
服務式容器:-d 在背景執行
網站、資料庫這類服務要一直在背景執行,不需要你進去打字,這時用 -d(detached):
docker container run -d --name daemon_app ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
Docker 只會印出容器 ID 就回到你的提示字元,容器在背景持續執行。常用的檢查指令:
| 指令 | 作用 |
|---|---|
docker container logs daemon_app |
看容器的輸出;加 -f 持續追蹤、--tail 10 只看最後 10 行、-t 加時間戳記 |
docker container inspect daemon_app |
看完整設定(JSON):狀態、映像檔、IP 位址… |
docker container top daemon_app |
看容器裡正在執行的程序 |
docker container rename daemon_app backup_app |
改名 |
移除時要注意:執行中的容器不能直接 rm,要先 stop;或用 docker container rm -f 強制移除(會直接結束容器,請確定沒有需要保存的資料)。
想一想:容器的狀態
在 docker container run -it ubuntu:24.04 /bin/bash 進入的容器裡輸入 exit,這個容器會怎樣?
docker container ls 沒有列出你剛剛建立的容器,最可能的原因是?
下面哪一個情況會讓 docker container rm daemon_app 失敗?
想一想:互動式與服務式
要讓一個網頁伺服器容器在背景持續執行,docker container run 應該加哪個選項?
想看背景容器 daemon_app 到目前為止印出了什麼,用哪個指令?
重點精華回顧
- 映像檔是唯讀範本,容器是由映像檔建立、正在執行或執行過的實例;一個映像檔可以建立很多個容器。
docker container run -it --name 名稱 映像檔 程式建立並進入互動式容器;exit讓容器停止但不刪除。ls只列執行中的容器,ls -a列出全部;STATUS 的Up是執行中、Exited (碼)是已停止。start/restart重新啟動,attach接回主程式,exec -it … bash另開殼層,stop正常停止、kill強制結束。- 服務式容器用
-d在背景執行,用logs、inspect、top檢查。 - 執行中的容器不能直接
rm,要先stop;容器名稱必須唯一。