Docker 的指令其實不算多,真正麻煩的是容易記混。比方說,明明已經拉取了新映像檔,網站跑的卻是舊版本;容器刪除以後重新建立,才發現資料庫也一起不見了;伺服器突然被塞爆,最後查出來是 Docker 的日誌檔。這些問題不複雜,但每隔一段時間就會遇到一次。等到真的出問題時,再去翻文件,往往又要花時間確認參數。所以我把平時部署和維護伺服器時經常使用的 Docker 指令整理在這裡。這不是一份完整的 Docker 手冊。那些一年用不到一次的參數,我沒有全部收錄。這裡只記錄日常最常見的操作,以及幾條可能導致資料遺失的指令。TipDockerfile 用来构建镜像,镜像用来创建容器。容器负责运行程序,但容器本身不适合保存重要数据,需要长期保留的内容应该放在数据卷或宿主机目录中。多个容器之间,则通过 Docker 网络互相通信。開始之前,先搞清楚 Docker 裡的幾個東西Docker 指令容易混淆,主要是因為映像檔、容器、資料卷和網路經常同時出現。它們之間的關係大致如下:一、先看看 Docker 現在是什麼狀態遇到 Docker 問題時,我通常不會馬上重啟服務,而是先看容器狀態。docker ps這條指令只顯示正在執行的容器。如果還想看已經停止的容器,需要加上 -a。docker ps -a輸出中比較重要的是以下幾項:NAMES:容器名稱IMAGE:使用的映像檔STATUS:目前狀態PORTS:通訊埠對應有些容器啟動以後會立刻結束。這種情況下,單獨執行 docker ps 是看不到它的,必須使用:docker ps -a查看 Docker 目前佔用了多少磁碟空間,可以執行:docker system df需要查看更詳細的映像檔、容器和資料卷佔用時,可以執行:docker system df -v伺服器磁碟突然爆滿時,這兩條指令通常很有用。不要一看到 /var/lib/docker 很大,就直接進去刪除檔案。這個目錄由 Docker 自己管理,手動刪除裡面的內容,很容易把整個 Docker 環境搞壞。二、查看容器日誌容器啟動失敗時,第一件事不是進入容器,而是查看日誌。docker logs 容器名称例如:docker logs nginx如果日誌太多,可以只看最後 100 行。docker logs --tail 100 nginx持續查看新日誌:docker logs -f nginx我平時更常使用下面這種組合:docker logs -f --tail 200 nginx它會先顯示最後 200 行日誌,然後繼續輸出新產生的日誌。查看最近 30 分鐘的日誌:docker logs --since 30m nginx如果容器不斷重啟,可以同時打開兩個終端機。第一個終端機查看狀態:docker ps第二個終端機持續查看日誌:docker logs -f --tail 200 容器名称一般來說,環境變數缺失、設定檔錯誤、目錄權限不足、資料庫連線失敗,都能在日誌裡找到線索。三、啟動、停止和重啟容器啟動一個已經存在的容器:docker start 容器名称停止容器:docker stop 容器名称重啟容器:docker restart 容器名称例如:docker restart nginxdocker stop 會先通知容器內的程式正常結束。對於 PostgreSQL、MySQL、Redis 這類會寫入資料的服務,應該優先使用 docker stop,給程式留下保存資料和關閉檔案的緩衝時間。如果容器已經完全無法回應,才考慮使用:docker kill 容器名称docker kill 會直接終止容器程序,比 docker stop 更強硬。它可以解決容器卡死的問題,但不應該作為日常重啟方式。四、進入容器內部進入容器通常使用:docker exec -it 容器名称 bash例如:docker exec -it nginx bash不過,並不是所有映像檔都安裝了 Bash。Alpine 等精簡映像檔通常只有 sh:docker exec -it nginx sh如果需要以 root 用戶進入:docker exec -it -u root 容器名称 sh不進入互動終端,也可以直接執行一條指令。docker exec nginx ls -lah /etc/nginx如果指令中包含 cd、管線或多個操作,需要使用 sh -c。docker exec nginx sh -c 'cd /etc/nginx && ls -lah'下面這種寫法通常是不行的:docker exec nginx "cd /etc/nginx && ls"因為 cd 不是一個獨立的可執行檔,它是 Shell 內部指令。進入容器適合排查問題,但不適合長期修改設定。例如,你進入容器修改了 /etc/nginx/nginx.conf,當容器下次被重新建立時,這些修改很可能全部消失。真正需要長期保留的設定,應該寫入 Dockerfile,或者從主機掛載進去。五、映像檔的基本操作查看本地映像檔:docker images也可以寫成:docker image ls拉取映像檔:docker pull nginx指定版本:docker pull nginx:1.29-alpine正式環境最好指定明確版本,而不是一直使用:nginx:latestlatest 只是一個標籤,不代表它永遠指向同一個版本。今天拉取的 latest 和幾個月以後拉取的 latest,內容可能完全不同。這樣雖然更新方便,但出了問題以後不容易回退。刪除映像檔:docker rmi 镜像名称例如:docker rmi nginx:1.29-alpine如果映像檔仍然被某個容器使用,Docker 會拒絕刪除。即使那個容器已經停止,它仍然可能引用這個映像檔。可以先使用下面的指令確認:docker ps -a六、為什麼拉取了新映像檔,程式還是舊版本這是 Docker 使用中很容易誤解的一點。執行:docker pull nginx:latest只是把新映像檔下載到了伺服器。已經執行的容器不會自動換成新映像檔,因為容器建立時使用的映像檔已經確定了。對於 Docker Compose 專案,通常需要執行:docker compose pulldocker compose up -d第一條指令拉取映像檔,第二條指令根據新映像檔重新建立容器。只執行:docker compose restart通常沒有用。restart 只是重啟原來的容器,它不會替換映像檔,也不會套用新修改的通訊埠、目錄掛載和環境變數。所以,修改了 compose.yaml 以後,應該執行:docker compose up -d如果懷疑容器沒有正確重新建立,可以使用:docker compose up -d --force-recreate不過大部分情況下,普通的 docker compose up -d 就夠了。七、Docker Compose 常用指令現在新版本 Docker 一般使用:docker compose而不是舊版的:docker-compose啟動專案:docker compose up -d-d 表示背景執行。查看專案狀態:docker compose ps查看日誌:docker compose logs持續查看日誌:docker compose logs -f只查看某個服務:docker compose logs -f web停止專案中的容器,但不刪除:docker compose stop重新啟動:docker compose start停止並刪除專案容器:docker compose down重新建構映像檔並啟動:docker compose up -d --build拉取遠端映像檔:docker compose pull檢查 Compose 檔案有沒有格式錯誤:docker compose config如果只想檢查,不想輸出完整設定:docker compose config -q我通常會在更新專案之前先執行一次:docker compose config -q如果沒有任何輸出,通常表示設定語法沒有問題。八、一個比較穩妥的更新流程假設專案放在:/opt/myapp先進入專案目錄:cd /opt/myapp檢查設定:docker compose config -q查看目前執行狀態:docker compose ps拉取新映像檔:docker compose pull重新建立容器:docker compose up -d --remove-orphans查看更新後的狀態:docker compose ps最後查看日誌:docker compose logs --tail 200如果程式正常執行,再考慮清理舊映像檔。docker image prune不要把清理操作放在更新流程的最前面。先確保新版本已經正常執行,再刪除舊映像檔。這樣出現問題時,至少還有機會重新使用舊版本。九、資料到底保存在什麼地方Docker 容器本身並不適合保存重要資料。容器刪除後,它的可寫層也會被刪除。需要長期保存的資料,通常放在兩種地方:Docker 資料卷主機目錄查看資料卷:docker volume ls查看某個資料卷的資訊:docker volume inspect 数据卷名称例如:docker volume inspect postgres-dataCompose 中常見的資料卷寫法:services: database: image: postgres:18 volumes: - postgres-data:/var/lib/postgresql/datavolumes: postgres-data:這樣,即使容器被刪除,postgres-data 資料卷通常還是會保留。如果使用主機目錄,可以這樣寫:services: app: image: myapp:1.0.0 volumes: - /opt/myapp/data:/app/data左邊是主機目錄:/opt/myapp/data右邊是容器內部目錄:/app/data這裡最容易出問題的是路徑寫錯。假設容器原本在 /app/config 中自帶設定檔,但是你掛載了一個空目錄:volumes: - /opt/myapp/config:/app/config那麼容器原本的 /app/config 會被主機空目錄覆蓋。程式啟動以後,就會像設定檔突然消失了一樣。所以在掛載之前,最好先確認主機目錄是否存在,裡面是否有正確的檔案。ls -lah /opt/myapp/config十、容器之間應該怎樣連接同一個 Compose 專案中的服務,可以直接使用服務名稱連接。例如:services: app: image: myapp:1.0.0 database: image: postgres:18應用程式連接資料庫時,位址應該寫成:database:5432不要把容器 IP 寫死成:172.20.0.3:5432容器重新建立以後,IP 位址可能發生變化,但是服務名稱通常不會變。查看 Docker 網路:docker network ls查看網路詳細資訊:docker network inspect 网络名称建立一個自訂網路:docker network create my-network把已經存在的容器加入網路:docker network connect my-network 容器名称如果兩個容器無法互相存取,先確認它們是否在同一個 Docker 網路中。十一、通訊埠不要全部暴露到公網下面的設定:ports: - "8080:80"一般表示將主機的 8080 埠對應到容器的 80 埠。預設情況下,它可能監聽所有網路介面:0.0.0.0:8080也就是說,只要伺服器防火牆允許,外部裝置就可能直接存取這個埠。如果服務只需要提供給主機上的 Nginx 或 OpenResty 使用,可以繫結到本機:ports: - "127.0.0.1:8080:80"這樣外部網路無法直接存取,只能透過主機本地連線。資料庫和 Redis 一般也沒有必要直接暴露到公網。同一個 Compose 網路中的應用,可以直接存取:database:5432redis:6379不需要為每一個內部服務都配置 ports。十二、查看資源佔用即時查看所有容器的 CPU 和記憶體佔用:docker stats只輸出一次:docker stats --no-stream查看指定容器:docker stats nginx查看容器內部程序:docker top nginx如果容器突然結束,可以檢查它是否因為記憶體不足被系統終止。docker inspect --format '{{.State.OOMKilled}}' 容器名称如果返回:true表示這個容器曾經發生過 OOM Kill,也就是因為記憶體不足被核心終止。還可以查看結束代碼:docker inspect --format '{{.State.ExitCode}}' 容器名称查看重啟次數:docker inspect --format '{{.RestartCount}}' 容器名称這些資訊對排查容器反覆重啟很有幫助。十三、Docker 日誌為什麼會佔滿磁碟Docker 預設可能使用 json-file 保存容器日誌。如果沒有設定日誌輪換,日誌檔會一直增長。修改:/etc/docker/daemon.json加入:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" }}這裡表示:每個日誌檔最大 10MB最多保留 3 個日誌檔修改完成後重啟 Docker:sudo systemctl restart docker不過需要注意,新的日誌設定通常只會套用到之後建立的容器。已經存在的容器可能需要重新建立。Compose 中也可以單獨為服務設定:services: app: image: myapp:1.0.0 logging: driver: json-file options: max-size: "10m" max-file: "3"如果伺服器磁碟總是莫名奇妙減少,除了檢查資料庫和上傳檔案,也應該看看 Docker 日誌。十四、清理 Docker 空間刪除已經停止的容器:docker container prune刪除懸空映像檔:docker image prune刪除未使用的網路:docker network prune刪除未使用的資料卷:docker volume prune綜合清理:docker system prune這些指令都會要求確認。但不要因為看到「未使用」三個字,就認為裡面的資料一定沒有價值。例如,資料庫容器被刪除以後,對應資料卷可能暫時沒有任何容器使用。Docker 會把它判斷為未使用資料卷,但資料庫檔案仍然在裡面。下面幾條指令執行前,必須格外小心:docker volume prune -adocker system prune -a --volumesdocker compose down -v尤其是:docker compose down -v普通的:docker compose down通常只刪除容器和網路。加上 -v 以後,還會刪除專案使用的資料卷。如果 PostgreSQL、MySQL 或上傳檔案保存在這些資料卷中,資料也會一起消失。清理之前,至少先查看:docker ps -adocker imagesdocker volume lsdocker system df -v不要把 docker system prune -a --volumes 當成日常清理指令。它更像是一條「我已經確認這些東西全部不要了」的指令。十五、目錄權限錯誤怎麼辦容器掛載主機目錄以後,程式可能會提示:Permission denied先查看主機目錄權限:ls -ld /opt/myapp/data查看檔案對應的 UID 和 GID:ls -ln /opt/myapp/data再查看容器內程式使用的用戶:docker exec 容器名称 id如果容器使用 UID 1000、GID 1000,可以根據實際情況修改主機目錄擁有者:sudo chown -R 1000:1000 /opt/myapp/data很多人遇到權限問題時,會直接執行:chmod -R 777 /opt/myapp/data這雖然可能暫時解決問題,但通常不是正確做法。777 會給所有用戶讀寫和執行權限,也會掩蓋真正的 UID、GID 和目錄所有權問題。先確認容器以什麼用戶執行,再調整對應權限,通常更穩妥。十六、幾個容易混淆的地方docker pull 不會更新正在執行的容器它只負責下載映像檔。更新 Compose 專案還需要:docker compose up -ddocker restart 不會套用新的設定它只是重啟原來的容器。修改 Compose 檔案後,應使用:docker compose up -d刪除容器不一定會刪除資料卷普通的:docker rm 容器名称通常不會刪除具名資料卷。但是:docker rm -v 容器名称可能會刪除容器使用的匿名資料卷。容器內手動修改的檔案不可靠容器重新建立後,修改可能消失。需要長期保留的設定,應該寫入 Dockerfile、Compose 檔案或者主機掛載目錄。不要依賴容器 IP使用容器名稱或 Compose 服務名稱存取。不要把全部通訊埠都對應到公網內部服務盡量只放在 Docker 網路中。十七、我平時最常用的一組指令查看容器:docker ps -a查看日誌:docker logs -f --tail 200 容器名称進入容器:docker exec -it 容器名称 sh查看資源:docker stats查看磁碟佔用:docker system df -v檢查 Compose 設定:docker compose config -q更新 Compose 專案:docker compose pulldocker compose up -d --remove-orphans查看更新後的狀態:docker compose psdocker compose logs --tail 200這些指令基本上可以涵蓋大部分日常部署、更新和故障排查。結語Docker 最容易讓人誤解的地方,是容器看起來很像一台小型伺服器。但容器不是虛擬機。它更像一個隨時可以被刪除、重新建立和替換的執行環境。真正重要的東西,不應該只放在容器內部。程式放在映像檔裡,設定寫進 Compose 或掛載目錄,資料放進資料卷或獨立儲存。容器出了問題,就重新建立。理解這一點以後,很多 Docker 指令就不需要死記了。最後再提醒一次,看到下面這些參數時,執行前最好停一下:-v--volumesprunerm -f--privileged它們不一定危險,但通常代表刪除資料、強制操作,或者擴大容器權限。尤其是這一條:docker compose down -v在確認資料已經備份之前,不要隨便執行。
Docker 的指令其實不算多,真正麻煩的是容易記混。
比方說,明明已經拉取了新映像檔,網站跑的卻是舊版本;容器刪除以後重新建立,才發現資料庫也一起不見了;伺服器突然被塞爆,最後查出來是 Docker 的日誌檔。
這些問題不複雜,但每隔一段時間就會遇到一次。等到真的出問題時,再去翻文件,往往又要花時間確認參數。
所以我把平時部署和維護伺服器時經常使用的 Docker 指令整理在這裡。
這不是一份完整的 Docker 手冊。那些一年用不到一次的參數,我沒有全部收錄。這裡只記錄日常最常見的操作,以及幾條可能導致資料遺失的指令。
Dockerfile 用来构建镜像,镜像用来创建容器。容器负责运行程序,但容器本身不适合保存重要数据,需要长期保留的内容应该放在数据卷或宿主机目录中。多个容器之间,则通过 Docker 网络互相通信。
開始之前,先搞清楚 Docker 裡的幾個東西
Docker 指令容易混淆,主要是因為映像檔、容器、資料卷和網路經常同時出現。
它們之間的關係大致如下:
一、先看看 Docker 現在是什麼狀態
遇到 Docker 問題時,我通常不會馬上重啟服務,而是先看容器狀態。
這條指令只顯示正在執行的容器。
如果還想看已經停止的容器,需要加上 -a。
輸出中比較重要的是以下幾項:
有些容器啟動以後會立刻結束。這種情況下,單獨執行 docker ps 是看不到它的,必須使用:
查看 Docker 目前佔用了多少磁碟空間,可以執行:
需要查看更詳細的映像檔、容器和資料卷佔用時,可以執行:
伺服器磁碟突然爆滿時,這兩條指令通常很有用。
不要一看到 /var/lib/docker 很大,就直接進去刪除檔案。這個目錄由 Docker 自己管理,手動刪除裡面的內容,很容易把整個 Docker 環境搞壞。
二、查看容器日誌
容器啟動失敗時,第一件事不是進入容器,而是查看日誌。
例如:
如果日誌太多,可以只看最後 100 行。
持續查看新日誌:
我平時更常使用下面這種組合:
它會先顯示最後 200 行日誌,然後繼續輸出新產生的日誌。
查看最近 30 分鐘的日誌:
如果容器不斷重啟,可以同時打開兩個終端機。
第一個終端機查看狀態:
第二個終端機持續查看日誌:
一般來說,環境變數缺失、設定檔錯誤、目錄權限不足、資料庫連線失敗,都能在日誌裡找到線索。
三、啟動、停止和重啟容器
啟動一個已經存在的容器:
停止容器:
重啟容器:
例如:
docker stop 會先通知容器內的程式正常結束。
對於 PostgreSQL、MySQL、Redis 這類會寫入資料的服務,應該優先使用 docker stop,給程式留下保存資料和關閉檔案的緩衝時間。
如果容器已經完全無法回應,才考慮使用:
docker kill 會直接終止容器程序,比 docker stop 更強硬。
它可以解決容器卡死的問題,但不應該作為日常重啟方式。
四、進入容器內部
進入容器通常使用:
例如:
不過,並不是所有映像檔都安裝了 Bash。
Alpine 等精簡映像檔通常只有 sh:
如果需要以 root 用戶進入:
不進入互動終端,也可以直接執行一條指令。
如果指令中包含 cd、管線或多個操作,需要使用 sh -c。
下面這種寫法通常是不行的:
因為 cd 不是一個獨立的可執行檔,它是 Shell 內部指令。
進入容器適合排查問題,但不適合長期修改設定。
例如,你進入容器修改了 /etc/nginx/nginx.conf,當容器下次被重新建立時,這些修改很可能全部消失。
真正需要長期保留的設定,應該寫入 Dockerfile,或者從主機掛載進去。
五、映像檔的基本操作
查看本地映像檔:
也可以寫成:
拉取映像檔:
指定版本:
正式環境最好指定明確版本,而不是一直使用:
latest 只是一個標籤,不代表它永遠指向同一個版本。
今天拉取的 latest 和幾個月以後拉取的 latest,內容可能完全不同。這樣雖然更新方便,但出了問題以後不容易回退。
刪除映像檔:
例如:
如果映像檔仍然被某個容器使用,Docker 會拒絕刪除。
即使那個容器已經停止,它仍然可能引用這個映像檔。可以先使用下面的指令確認:
六、為什麼拉取了新映像檔,程式還是舊版本
這是 Docker 使用中很容易誤解的一點。
執行:
只是把新映像檔下載到了伺服器。
已經執行的容器不會自動換成新映像檔,因為容器建立時使用的映像檔已經確定了。
對於 Docker Compose 專案,通常需要執行:
第一條指令拉取映像檔,第二條指令根據新映像檔重新建立容器。
只執行:
通常沒有用。
restart 只是重啟原來的容器,它不會替換映像檔,也不會套用新修改的通訊埠、目錄掛載和環境變數。
所以,修改了 compose.yaml 以後,應該執行:
如果懷疑容器沒有正確重新建立,可以使用:
不過大部分情況下,普通的 docker compose up -d 就夠了。
七、Docker Compose 常用指令
現在新版本 Docker 一般使用:
而不是舊版的:
啟動專案:
-d 表示背景執行。
查看專案狀態:
查看日誌:
持續查看日誌:
只查看某個服務:
停止專案中的容器,但不刪除:
重新啟動:
停止並刪除專案容器:
重新建構映像檔並啟動:
拉取遠端映像檔:
檢查 Compose 檔案有沒有格式錯誤:
如果只想檢查,不想輸出完整設定:
我通常會在更新專案之前先執行一次:
如果沒有任何輸出,通常表示設定語法沒有問題。
八、一個比較穩妥的更新流程
假設專案放在:
先進入專案目錄:
檢查設定:
查看目前執行狀態:
拉取新映像檔:
重新建立容器:
查看更新後的狀態:
最後查看日誌:
如果程式正常執行,再考慮清理舊映像檔。
不要把清理操作放在更新流程的最前面。
先確保新版本已經正常執行,再刪除舊映像檔。這樣出現問題時,至少還有機會重新使用舊版本。
九、資料到底保存在什麼地方
Docker 容器本身並不適合保存重要資料。
容器刪除後,它的可寫層也會被刪除。
需要長期保存的資料,通常放在兩種地方:
查看資料卷:
查看某個資料卷的資訊:
例如:
Compose 中常見的資料卷寫法:
這樣,即使容器被刪除,postgres-data 資料卷通常還是會保留。
如果使用主機目錄,可以這樣寫:
左邊是主機目錄:
右邊是容器內部目錄:
這裡最容易出問題的是路徑寫錯。
假設容器原本在 /app/config 中自帶設定檔,但是你掛載了一個空目錄:
那麼容器原本的 /app/config 會被主機空目錄覆蓋。
程式啟動以後,就會像設定檔突然消失了一樣。
所以在掛載之前,最好先確認主機目錄是否存在,裡面是否有正確的檔案。
十、容器之間應該怎樣連接
同一個 Compose 專案中的服務,可以直接使用服務名稱連接。
例如:
應用程式連接資料庫時,位址應該寫成:
不要把容器 IP 寫死成:
容器重新建立以後,IP 位址可能發生變化,但是服務名稱通常不會變。
查看 Docker 網路:
查看網路詳細資訊:
建立一個自訂網路:
把已經存在的容器加入網路:
如果兩個容器無法互相存取,先確認它們是否在同一個 Docker 網路中。
十一、通訊埠不要全部暴露到公網
下面的設定:
一般表示將主機的 8080 埠對應到容器的 80 埠。
預設情況下,它可能監聽所有網路介面:
也就是說,只要伺服器防火牆允許,外部裝置就可能直接存取這個埠。
如果服務只需要提供給主機上的 Nginx 或 OpenResty 使用,可以繫結到本機:
這樣外部網路無法直接存取,只能透過主機本地連線。
資料庫和 Redis 一般也沒有必要直接暴露到公網。
同一個 Compose 網路中的應用,可以直接存取:
不需要為每一個內部服務都配置 ports。
十二、查看資源佔用
即時查看所有容器的 CPU 和記憶體佔用:
只輸出一次:
查看指定容器:
查看容器內部程序:
如果容器突然結束,可以檢查它是否因為記憶體不足被系統終止。
如果返回:
表示這個容器曾經發生過 OOM Kill,也就是因為記憶體不足被核心終止。
還可以查看結束代碼:
查看重啟次數:
這些資訊對排查容器反覆重啟很有幫助。
十三、Docker 日誌為什麼會佔滿磁碟
Docker 預設可能使用 json-file 保存容器日誌。
如果沒有設定日誌輪換,日誌檔會一直增長。
修改:
加入:
這裡表示:
修改完成後重啟 Docker:
不過需要注意,新的日誌設定通常只會套用到之後建立的容器。
已經存在的容器可能需要重新建立。
Compose 中也可以單獨為服務設定:
如果伺服器磁碟總是莫名奇妙減少,除了檢查資料庫和上傳檔案,也應該看看 Docker 日誌。
十四、清理 Docker 空間
刪除已經停止的容器:
刪除懸空映像檔:
刪除未使用的網路:
刪除未使用的資料卷:
綜合清理:
這些指令都會要求確認。
但不要因為看到「未使用」三個字,就認為裡面的資料一定沒有價值。
例如,資料庫容器被刪除以後,對應資料卷可能暫時沒有任何容器使用。Docker 會把它判斷為未使用資料卷,但資料庫檔案仍然在裡面。
下面幾條指令執行前,必須格外小心:
尤其是:
普通的:
通常只刪除容器和網路。
加上 -v 以後,還會刪除專案使用的資料卷。如果 PostgreSQL、MySQL 或上傳檔案保存在這些資料卷中,資料也會一起消失。
清理之前,至少先查看:
不要把 docker system prune -a --volumes 當成日常清理指令。
它更像是一條「我已經確認這些東西全部不要了」的指令。
十五、目錄權限錯誤怎麼辦
容器掛載主機目錄以後,程式可能會提示:
先查看主機目錄權限:
查看檔案對應的 UID 和 GID:
再查看容器內程式使用的用戶:
如果容器使用 UID 1000、GID 1000,可以根據實際情況修改主機目錄擁有者:
很多人遇到權限問題時,會直接執行:
這雖然可能暫時解決問題,但通常不是正確做法。
777 會給所有用戶讀寫和執行權限,也會掩蓋真正的 UID、GID 和目錄所有權問題。
先確認容器以什麼用戶執行,再調整對應權限,通常更穩妥。
十六、幾個容易混淆的地方
docker pull 不會更新正在執行的容器
它只負責下載映像檔。
更新 Compose 專案還需要:
docker restart 不會套用新的設定
它只是重啟原來的容器。
修改 Compose 檔案後,應使用:
刪除容器不一定會刪除資料卷
普通的:
通常不會刪除具名資料卷。
但是:
可能會刪除容器使用的匿名資料卷。
容器內手動修改的檔案不可靠
容器重新建立後,修改可能消失。
需要長期保留的設定,應該寫入 Dockerfile、Compose 檔案或者主機掛載目錄。
不要依賴容器 IP
使用容器名稱或 Compose 服務名稱存取。
不要把全部通訊埠都對應到公網
內部服務盡量只放在 Docker 網路中。
十七、我平時最常用的一組指令
查看容器:
查看日誌:
進入容器:
查看資源:
查看磁碟佔用:
檢查 Compose 設定:
更新 Compose 專案:
查看更新後的狀態:
這些指令基本上可以涵蓋大部分日常部署、更新和故障排查。
結語
Docker 最容易讓人誤解的地方,是容器看起來很像一台小型伺服器。
但容器不是虛擬機。
它更像一個隨時可以被刪除、重新建立和替換的執行環境。真正重要的東西,不應該只放在容器內部。
程式放在映像檔裡,設定寫進 Compose 或掛載目錄,資料放進資料卷或獨立儲存。容器出了問題,就重新建立。
理解這一點以後,很多 Docker 指令就不需要死記了。
最後再提醒一次,看到下面這些參數時,執行前最好停一下:
它們不一定危險,但通常代表刪除資料、強制操作,或者擴大容器權限。
尤其是這一條:
在確認資料已經備份之前,不要隨便執行。