网络与存储
Docker 网络
网络模式
bash
# 查看网络
docker network ls
# 创建网络
docker network create mynetwork四种网络模式:
| 模式 | 说明 | 使用场景 |
|---|---|---|
bridge | 默认模式,容器有独立网络命名空间 | 单主机容器通信 |
host | 共享主机网络命名空间 | 高性能场景 |
none | 无网络 | 隔离环境 |
container | 与另一容器共享网络 | 容器关联 |
Bridge 网络
bash
# 创建自定义 bridge 网络
docker network create --driver bridge mybridge
# 运行容器并连接到网络
docker run -d --name app1 --network mybridge myapp
docker run -d --name app2 --network mybridge myapp
# 容器间通过容器名通信(DNS 自动解析)
# app1 可以 ping app2原理:
┌─────────────────────────────────────────────────┐
│ Host │
│ ┌───────────────────────────────────────────┐ │
│ │ docker0 (网桥) │ │
│ │ IP: 172.17.0.1 │ │
│ └───────────────────────────────────────────┘ │
│ ▲ ▲ │
│ ┌──────┴──────┐ ┌─────┴──────┐ │
│ │ Container 1 │ │ Container 2 │ │
│ │ 172.17.0.2 │ │ 172.17.0.3 │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────┘Host 网络
bash
# 容器直接使用主机网络(无隔离)
docker run --network host myappPort 映射
bash
# 容器端口映射到主机
docker run -d -p 8080:3000 myapp
# 访问 http://localhost:8080 → 容器 3000 端口
# 随机端口
docker run -d -P myapp
# 绑定特定 IP
docker run -d -p 127.0.0.1:8080:3000 myappDocker 存储
数据卷(Volume)
bash
# 创建数据卷
docker volume create myvolume
# 查看数据卷
docker volume ls
docker volume inspect myvolume
# 挂载数据卷
docker run -d -v myvolume:/app/data myapp
docker run -d -v /host/path:/app/data myapp # 绑定挂载
# 删除数据卷
docker volume rm myvolume
docker volume prune # 清理未使用的Volume 原理:
┌─────────────────────────────────────────────────┐
│ Host │
│ ┌───────────────────────────────────────────┐ │
│ │ /var/lib/docker/volumes/myvolume/_data │ │ ← 容器数据持久化位置
│ └───────────────────────────────────────────┘ │
│ ▲ │
│ │ 挂载 │
│ ┌───────────────────────────────────────────┐ │
│ │ Container │ │
│ │ /app/data │ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘绑定挂载(Bind Mount)
bash
# 挂载主机目录到容器
docker run -d -v /home/user/data:/app/data myapp
# 只读挂载
docker run -d -v /home/user/config:/app/config:ro myapptmpfs 挂载
bash
# 数据存储在内存中
docker run --tmpfs /app/tmp myapp存储驱动
bash
# 查看存储驱动
docker info | grep "Storage Driver"
# 常用驱动
# overlay2 - 默认,适合大多数场景
# device mapper - RHEL/CentOS
# vfs - 简单,但不推荐生产使用容器间通信
同一网络内
bash
# 创建网络
docker network create app-network
# 启动服务
docker run -d --name mysql --network app-network \
-e MYSQL_ROOT_PASSWORD=123456 mysql:8
docker run -d --name app --network app-network \
-e DB_HOST=mysql myapp
# 在 app 容器内可以直接访问 mysql:3306跨主机通信
bash
# 使用 overlay 网络(Docker Swarm)
docker network create \
--driver overlay \
--attachable \
my-overlay-network面试高频题
Q1: Docker 有哪几种网络模式?
答案: 四种
- bridge:默认模式,容器有独立网络空间,通过网桥通信
- host:共享主机网络命名空间,性能好但无隔离
- none:禁用网络
- container:与其他容器共享网络命名空间
Q2: 容器间如何通过容器名通信?
答案:
- 将容器连接到同一自定义 bridge 网络
- Docker 内置 DNS 会自动解析容器名到对应 IP
bash
docker network create mynet
docker run -d --name svc1 --network mynet img
docker run -d --name svc2 --network mynet img
# svc2 可以 ping svc1Q3: Docker 数据持久化有哪几种方式?
答案:
- Volume:Docker 管理,适合生产环境
- Bind Mount:挂载主机目录,适合开发环境
- tmpfs:内存存储,适合敏感数据
Q4: 容器删了数据还在吗?
答案:
- 默认情况下,容器的可写层数据会随容器删除而丢失
- 使用 Volume 或 Bind Mount 可以实现数据持久化