National Yunlin University of Science and Technology
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try a Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

1

Local AI

--

Uedu Code

--

雲林科技大學 AQI 56 27°C PM2.5 10
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 03

容器的生命週期

run、ls、start、stop、exec、rm 與服務式容器
Interaction 25 minute(s)

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 結束,容器也跟著停止。

容器名稱的規則:只能用英數字、底線、句點與 -,而且必須唯一;要建立同名的新容器,得先把舊的移除。

互動練習:容器的生命週期

依右下角的任務操作:建立並進入 my_ubuntu、離開後用 ls -a 找到它、重新啟動再停止,最後建立會一直輸出的服務式容器 daemon_app,看它的 logs 並移除。深色按鈕是 docker 指令;綠色按鈕是「在容器裡面」才能用的指令。注意容器卡片的狀態標籤怎麼變化。

查看容器: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 強制移除(會直接結束容器,請確定沒有需要保存的資料)。

想一想:容器的狀態

1.

在 docker container run -it ubuntu:24.04 /bin/bash 進入的容器裡輸入 exit,這個容器會怎樣?

2.

docker container ls 沒有列出你剛剛建立的容器,最可能的原因是?

3.

下面哪一個情況會讓 docker container rm daemon_app 失敗?

第 1 次作答

想一想:互動式與服務式

1.

要讓一個網頁伺服器容器在背景持續執行,docker container run 應該加哪個選項?

2.

想看背景容器 daemon_app 到目前為止印出了什麼,用哪個指令?

第 1 次作答

重點精華回顧

  • 映像檔是唯讀範本,容器是由映像檔建立、正在執行或執行過的實例;一個映像檔可以建立很多個容器。
  • 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;容器名稱必須唯一。
這一課完成了!
Next lesson:映像檔、層與 Docker Hub
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。