Skip to content

网络与存储

第一部分:网络

网络模式

模式说明使用场景
bridge默认,容器接在虚拟网桥上,经 NAT 对外单机容器互联(最常用)
host与宿主机共享网络栈高性能、端口不隔离
none无网络完全隔离
container:<名>复用另一容器的网络栈边车模式
overlay跨主机网络(Swarm)集群
bash
docker run -d --network host nginx        # host 模式
docker run -d --network none nginx        # 无网络
docker run -d --network container:web nginx   # 复用 web 的网络

端口映射 -p

bash
# 宿主机 8080 → 容器 80
docker run -d -p 8080:80 nginx

# 指定绑定 IP 与 UDP
docker run -d -p 127.0.0.1:8080:80/udp nginx

# 随机宿主机端口(用 docker port 查询)
docker run -d -P nginx
docker port <>

格式:-p 宿主机端口:容器端口[/协议],冒号前后顺序不要反。

自定义网络(推荐)

默认 bridge 网络下容器间只能用 IP 互访;自定义网络支持按容器名互相解析(内置 DNS)。

bash
# 创建网络
docker network create mynet

# 查看网络
docker network ls
docker network inspect mynet

# 让容器加入网络
docker run -d --name db --network mynet mysql:8
docker run -d --name app --network mynet -p 8080:80 myapp

# 同网络内直接用容器名访问
docker exec app curl http://db:3306

# 容器加入/断开网络
docker network connect mynet other
docker network disconnect mynet other

# 删除网络
docker network rm mynet

口诀:需要互相调用的容器放进同一个自定义网络,用容器名当主机名。

网络诊断

bash
# 查看某容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <>

# 进入容器测试连通性(busybox 含 ping/nslookup)
docker run --rm --network mynet busybox nslookup db
docker exec <> ping db

第二部分:存储

容器数据为何会丢

容器的可写层随容器删除而消失,且不利于共享、备份、性能。持久化靠挂载

宿主机/卷  ──挂载──▶  容器内路径

三种挂载方式对比

方式数据位置管理适用
volume(卷)Docker 管理的目录(/var/lib/docker/volumes/Docker 管理,推荐生产持久化、数据库
bind mount(绑定挂载)宿主机任意绝对路径用户管理开发热更新、共享配置
tmpfs内存不落盘临时敏感数据

卷 Volume

bash
# 创建卷
docker volume create dbdata

# 挂载到容器:-v 卷名:容器路径
docker run -d -v dbdata:/var/lib/mysql mysql:8

# 列出 / 查看 / 删除
docker volume ls
docker volume inspect dbdata
docker volume rm dbdata

# 清理未使用的卷
docker volume prune

数据备份与迁移

bash
# 备份:用一个临时容器把卷内容打包
docker run --rm -v dbdata:/data -v $(pwd):/backup alpine \
  tar czf /backup/dbdata.tar.gz -C /data .

# 恢复
docker run --rm -v dbdata:/data -v $(pwd):/backup alpine \
  sh -c "cd /data && tar xzf /backup/dbdata.tar.gz"

Colima/WSL2 场景下,卷存放在虚拟机内,宿主机(Windows/macOS)看不到,属于正常现象。

绑定挂载 Bind Mount

bash
# -v 宿主机绝对路径:容器路径
docker run -d -v /home/me/app:/app myapp

# 只读挂载
docker run -d -v /home/me/conf:/etc/nginx/conf.d:ro nginx

# 当前目录挂载(开发常用)
docker run --rm -v $(pwd):/app -w /app node:20 npm test

Windows WSL2 内用 $(pwd) 表示 WSL 里的当前目录;若要挂载 Windows 目录用 /mnt/c/...

tmpfs(内存)

bash
docker run -d --tmpfs /tmp nginx

挂载语法说明

  • -v 名称:路径:Docker 自动区分——前面是绝对路径则为 bind mount,否则为卷名。
  • --mount:更显式、推荐的写法。
bash
docker run -d \
  --mount type=volume,source=dbdata,target=/var/lib/mysql \
  mysql:8

docker run -d \
  --mount type=bind,source=$(pwd)/conf,target=/etc/nginx/conf.d,readonly \
  nginx

选型建议

场景推荐
数据库、需要 Docker 托管与备份volume
开发时代码热更新、读宿主机配置bind mount
临时文件、敏感信息tmpfs