Docker 基本操作
Docker 的日常操作可以分成四類:管理容器(啟動、查看、停止、刪除)、管理 Image(下載、查看、刪除)、保存資料(Volume),以及讓容器互相連線(Network)。本頁用 Nginx 網站當例子,帶你把這四類操作各做一次,每個指令都附上說明。
容器的一生
一個容器從建立到刪除,會經過這幾個階段:
flowchart LR
A[docker run<br>建立並啟動] --> B[執行中]
B -->|docker stop| C[已停止]
C -->|docker start| B
C -->|docker rm| D[刪除]
容器「停止」後並沒有消失,還可以再啟動;要用 docker rm 才會真正刪除。
管理容器
啟動容器
| 參數 | 意思 |
|---|---|
-d |
在背景執行 |
--name web |
幫容器取名字,不取的話 Docker 會隨機命名 |
-p 8080:80 |
連接埠對應:你的電腦:容器。瀏覽器連 localhost:8080,就會連到容器的 80 埠 |
nginx |
要使用的 Image 名稱 |
查看容器
STATUS 欄位會顯示狀態,例如 Up 5 minutes(執行中)或 Exited (0)(已停止,括號裡是結束代碼,0 代表正常結束)。
看日誌、進入容器
docker logs web # 看容器印出的訊息
docker logs -f web # 持續追蹤,按 Ctrl+C 離開
docker exec -it web sh # 進入容器的終端機,輸入 exit 離開
程式出問題時,第一步永遠是先看 docker logs。
停止、重新啟動、刪除
docker stop web # 停止
docker start web # 再次啟動
docker restart web # 重新啟動
docker stop web # 刪除前要先停止
docker rm web # 刪除
想一步完成「停止+刪除」,可以用 docker rm -f web。
什麼時候用 --rm?
只跑一次的容器(例如測試、執行工具),加上 --rm 讓它結束後自動刪除,就不會留下一堆停止的容器。要長期執行的服務則不要加 --rm,改用 --restart unless-stopped 讓它在當機或電腦重開後自動啟動。這兩個選項不能同時使用。
管理 Image
docker pull nginx:1.28-alpine # 下載 Image
docker images # 列出電腦上的 Image
docker rmi nginx:1.28-alpine # 刪除 Image
Image 名稱冒號後面是標籤(tag),通常代表版本。nginx:1.28-alpine 是「Nginx 1.28 版、以 Alpine Linux 為基礎」。沒寫標籤時預設是 latest(最新版),但最新版會隨時間改變,正式使用時建議寫清楚版本。
保存資料:Volume 與 Bind mount
容器刪除後,裡面的檔案也會一起消失。要保存資料,有兩種常用的方法。
Volume:交給 Docker 保管
適合資料庫這類「不需要直接看檔案,但一定要保存」的資料:
docker volume create mydata
docker run --rm -v mydata:/data alpine sh -c "echo 你好 > /data/note.txt"
docker run --rm -v mydata:/data alpine cat /data/note.txt
第一個容器寫入檔案後就被刪除了,但第二個容器還是讀得到 你好,因為檔案存在 Volume 裡。-v mydata:/data 的意思是「把名叫 mydata 的 Volume 接到容器裡的 /data 資料夾」。
Bind mount:直接使用電腦上的資料夾
適合開發時「改檔案要馬上看到效果」的情況:
mkdir mysite && cd mysite
echo "<h1>我的網頁</h1>" > index.html
docker run -d --name web -p 8080:80 -v "$(pwd)":/usr/share/nginx/html:ro nginx
打開 http://localhost:8080 會看到「我的網頁」。修改 index.html 後重新整理,就會看到新內容,不需要重啟容器。結尾的 :ro 代表唯讀,容器只能讀、不能改你的檔案。
試完後先刪掉這個容器,下一節會再用到 web 這個名字:
| Volume | Bind mount | |
|---|---|---|
| 寫法 | -v 名稱:/容器路徑 |
-v /電腦路徑:/容器路徑 |
| 檔案放在哪 | Docker 管理的位置 | 你指定的資料夾 |
| 適合 | 資料庫、要長期保存的資料 | 開發時的程式碼、設定檔 |
讓容器互相連線:Network
網站容器常需要連到資料庫容器。最簡單的做法是建立一個自己的網路,把兩個容器都接上去,它們就能用容器名稱互相找到對方:
docker network create mynet
docker run -d --name web --network mynet nginx
docker run --rm --network mynet alpine wget -qO- http://web
第三行的 Alpine 容器用 http://web 就連到了 Nginx,因為同一個網路裡,容器名稱可以直接當成網址使用。
為什麼要自己建立網路?
如果沒有指定 --network,容器會接到 Docker 預設的網路。預設網路不能用名稱互相連線,只能用 IP 位址,而 IP 每次啟動都可能改變。所以多個容器要互連時,記得建立自己的網路。後面介紹的 Docker Compose 會自動幫你做這件事。
清理
練習完可以把剛才建立的東西刪掉:
想知道 Docker 佔用了多少空間,可以用 docker system df。更多清理方式請看 疑難排解。
下一步:學習如何用 Dockerfile 打包自己的程式,請看 Dockerfile 入門。
參考資料
推薦影音
Publishing and exposing ports
簡述:Docker 官方短片,說明 -p 連接埠對應的意思,對應本頁「啟動容器」。(Docker 官方)
Persisting container data
簡述:Docker 官方短片,說明容器刪除後資料為什麼會消失,以及怎麼用 Volume 保存資料,對應本頁「Volume:交給 Docker 保管」。(Docker 官方)
Sharing local files with containers
簡述:Docker 官方短片,比較 Volume 和 Bind mount,示範把電腦上的資料夾分享給容器,對應本頁「Bind mount」。(Docker 官方)
Docker networking is CRAZY!! (you NEED to learn it)
簡述:實際示範 Docker 的各種網路類型,看懂容器之間怎麼連線,適合讀完本頁「Network」後想深入了解的人。(NetworkChuck)
更多影片請見 影音教學。