為什麼需要資料持久化?
容器刪除後,內部的檔案變更也會一併消失。資料庫、上傳檔案等重要資料,需要存放在容器外部。
Bind Mount
docker run -d -v /home/user/data:/var/lib/mydata --name myapp myimage
-v 主機路徑:容器內路徑,主機與容器即時同步,適合開發環境掛載原始碼。
Volume:Docker 管理的資料卷
docker volume create mydata
docker volume ls
docker run -d -v mydata:/var/lib/mydata --name myapp myimage
docker volume inspect mydata
Volume 由 Docker 統一管理實際存放位置,正式環境的資料庫建議優先使用 Volume 而非 bind mount。
網路模式
docker network ls # 列出網路
常見的網路驅動:
- bridge(預設):容器擁有獨立 IP,透過 NAT 對外
- host:容器直接共用主機的網路堆疊,效能較好但失去隔離性
- none:完全沒有網路
自訂網路:容器互相溝通
docker network create mynet
docker run -d --network mynet --name db postgres
docker run -d --network mynet --name app myapp
同一個自訂網路內的容器可以用容器名稱當作主機名稱互相連線,例如 app 容器連到 db:5432,不需要知道實際 IP。Docker 預設的 bridge 網路不提供這種名稱解析,這也是建議自行建立網路的原因之一。
連接埠對應
docker run -d -p 8080:80 nginx
-p 主機埠:容器埠,讓外部可以透過主機連接埠存取容器內的服務;不加 -p 的容器只能從主機內部用容器 IP 存取。