网络与存储
第一部分:网络
网络模式
| 模式 | 说明 | 使用场景 |
|---|---|---|
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 testWindows 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 |
