基础
网络
bridge
常用于单机容器之间互联
默认都是一个 172.17.0.0/16 的私网,docker run 不指定网络就是它
可自定义:
shell
docker network create \
--driver bridge \
--subnet 192.168.10.0/24 \
mynet优点:隔离强、容易管理端口映射
docker-compose 默认就是使用 bridge(自建 network)
host
直接共享宿主机网络,不做 NAT
使用方式:
shell
docker run --network host ...特点:
性能最好(无 NAT)
容器无法与 host 上端口冲突(冲突会失败)
安全隔离最弱
使用场景:
- Prometheus Node Exporter 等需要访问宿主机端口的
none
没有网络,纯隔离环境
shell
docker run --network none ...container
让多个容器共享同一个网络堆栈
shell
docker run --network container:<container_name> ...场景:
把多个进程拆成多个容器但共用同一个 IP(Sidecar-like)
yaml
version: "3.9"
services:
app:
image: nginx:alpine
container_name: app
ports:
- "8080:80"
# 注意:这个容器是网络 namespace 的提供者
# sidecar 会加入 app 的网络
restart: always
sidecar:
image: alpine
container_name: sidecar
command: ["sh", "-c", "while true; do nc -lk -p 8081 -e echo 'Hello from sidecar'; done"]
# 核心配置:共享 app 的网络 namespace
network_mode: "service:app"
# 共享网络通常要共享 PID 才方便调试,但不是必须
# pid: "service:app"
restart: alwaysoverlay
多机网络,用于 docker swarm / k8s cni
覆盖集群,将不同节点的容器连接成一个虚拟二层网络
调试工具
shell
docker network ls
docker network inspect <name>
docker exec -it <container> ip addr
docker exec -it <container> netstat -ntlp
docker exec -it <container> ping <ip>状态管理
Volume
Docker 自己管理,位于 /var/lib/docker/volumes
类似 k8s 的 PV/PVC
使用方式:
shell
docker volume create mydata
docker run -v mydata:/data ...用在数据库、缓存、文件存储等需要持久化的业务
Bind Mount
直接挂宿主机目录
shell
docker run -v /var/log/nginx:/logs ...特点:
- 适合开发调试(挂源码)
- 和宿主机耦合紧
tmpfs 内存盘
数据存在内存中,容器删除就没了
shell
docker run --tmpfs /run/data ...适合:
- 高速缓存
- 私密数据(不落盘)
重启策略(restart policy)
Docker 原生提供重启策略:
| 策略 | 描述 |
|---|---|
| no | 不自动重启 |
| always | 无论退出状态如何,立刻重启 |
| unless-stopped | 除非用户主动 stop,否则重启 |
| on-failure[:max-retries] | Exit code ≠ 0 才重启 |
例子:
shell
docker run --restart=always ...
docker run --restart=on-failure:3 ...说明:
- always 常用于生产服务(Nginx、Redis)
- on-failure 常用于可能短暂出错的脚本服务
- unless-stopped 常用于你希望机器重启时也恢复,但手动停服务不会自动重启的场景