<返回目录     Powered by claude/xia兄

第7课: 网络配置

Docker网络模式

Docker提供多种网络驱动,适用于不同场景:

网络管理命令

# 查看所有网络
docker network ls

# 查看网络详情
docker network inspect bridge

# 创建自定义网络
docker network create mynetwork

# 创建指定驱动的网络
docker network create --driver bridge mybridge

# 删除网络
docker network rm mynetwork

# 清理未使用的网络
docker network prune

bridge模式(默认)

# 使用默认bridge网络
docker run -d --name web1 nginx

# 使用自定义bridge网络
docker network create my-bridge
docker run -d --name web2 --network my-bridge nginx

# 容器连接到网络
docker network connect my-bridge web1

# 容器断开网络
docker network disconnect my-bridge web1
自定义bridge vs 默认bridge:

host模式

# 使用主机网络(无端口映射)
docker run -d --network host nginx

# 容器直接使用主机的80端口
# 性能最好,但失去网络隔离

none模式

# 禁用网络
docker run -d --network none nginx

# 适用于不需要网络的批处理任务

容器互联实战

# 创建自定义网络
docker network create app-network

# 运行MySQL容器
docker run -d \
  --name mysql-db \
  --network app-network \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=myapp \
  mysql:8.0

# 运行应用容器,通过容器名访问MySQL
docker run -d \
  --name web-app \
  --network app-network \
  -e DB_HOST=mysql-db \
  -e DB_PORT=3306 \
  -e DB_USER=root \
  -e DB_PASSWORD=123456 \
  -p 8080:80 \
  myapp:latest

# 在web-app容器中可以直接使用mysql-db作为主机名

端口映射

# 映射单个端口
docker run -d -p 8080:80 nginx

# 映射到随机端口
docker run -d -p 80 nginx

# 映射多个端口
docker run -d -p 8080:80 -p 8443:443 nginx

# 指定协议
docker run -d -p 8080:80/tcp -p 8081:80/udp nginx

# 绑定到特定IP
docker run -d -p 127.0.0.1:8080:80 nginx

# 查看端口映射
docker port container_name

网络别名

# 为容器设置网络别名
docker run -d \
  --name web1 \
  --network app-network \
  --network-alias webapp \
  nginx

docker run -d \
  --name web2 \
  --network app-network \
  --network-alias webapp \
  nginx

# 其他容器访问webapp时会负载均衡到web1和web2

查看容器网络信息

# 查看容器IP地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name

# 查看容器网络配置
docker inspect container_name | grep -A 20 NetworkSettings

# 在容器内查看网络
docker exec container_name ip addr
docker exec container_name ping other_container

自定义网络配置

# 创建指定子网的网络
docker network create \
  --driver bridge \
  --subnet 172.20.0.0/16 \
  --gateway 172.20.0.1 \
  custom-network

# 指定容器IP
docker run -d \
  --name web \
  --network custom-network \
  --ip 172.20.0.10 \
  nginx

overlay网络(Swarm集群)

# 初始化Swarm
docker swarm init

# 创建overlay网络
docker network create \
  --driver overlay \
  --attachable \
  my-overlay

# 跨主机容器通信
docker run -d --network my-overlay nginx

网络故障排查

# 测试容器间连通性
docker exec web1 ping web2

# 查看容器DNS配置
docker exec web1 cat /etc/resolv.conf

# 查看容器路由表
docker exec web1 ip route

# 使用网络工具容器
docker run --rm --network container:web1 nicolaka/netshoot

最佳实践

实践练习

  1. 创建自定义网络,运行MySQL和Web应用容器
  2. 验证容器间可以通过容器名互相访问
  3. 测试端口映射,从主机访问容器服务
  4. 创建多个容器使用相同的网络别名
  5. 排查网络连接问题,使用ping和curl测试