【Docker 新手入门指南】第八章:网络配置

一、端口映射进阶:-p与-P的核心差异

  1. 随机映射(-P
  • 场景:快速启动服务,自动分配宿主机端口(适用于开发测试)。
docker run -d -P nginx # 容器 80 端口随机映射到宿主机高端口(如 32768)
  • 查看映射
docker port [容器名或ID] 80 # 输出宿主机端口(如 0.0.0.0:32768)
  1. 指定映射(-p
  • 格式宿主机端口:容器端口[:协议]

单端口映射

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

绑定特定 IP

docker run -d -p 192.168.1.100:8080:80 nginx # 仅限指定 IP 访问 

UDP 端口

docker run -d -p 53:53/udp dnsmasq # 映射 UDP 53 端口
  1. 多端口映射
docker run -d \
  -p 8080:80 \       # HTTP 端口
  -p 443:443/tcp \   # HTTPS 端口(TCP)
  -p 123:123/udp     # NTP 端口(UDP)
  nginx

二、Docker 网络模式详解

Docker 支持 4 种网络模式,通过 --network 参数指定:

  1. bridge 模式(默认)
  • 特点

容器通过虚拟网桥(docker0)与宿主机通信。

容器拥有独立 IP,宿主机可通过端口映射访问容器。

  • 使用场景:单机多容器通信(最常用模式)。
  • 示例
docker run -d --network bridge --name web nginx
  1. host 模式
  • 特点

容器直接使用宿主机网络栈,无网络隔离。

容器 IP、端口与宿主机完全一致(性能最佳)。

  • 使用场景:需要高性能或直接操作宿主机网络的服务(如监控工具)。
  • 示例
docker run -d --network host --name host-nginx nginx
  1. none 模式
  • 特点

容器无网络配置,需手动添加网卡(如 veth 设备)。

完全隔离网络,安全性最高。

  • 使用场景:敏感数据处理或定制化网络方案。
  • 示例
docker run -d --network none --name isolated-container alpine sleep infinity
  1. overlay 模式
  • 特点

跨主机容器通信,支持 Docker Swarm 集群。

通过 VXLAN 实现跨主机二层网络。

  • 使用场景:分布式集群部署(需开启 Swarm 模式)。
  • 示例
# 创建 overlay 网络 
docker network create -d overlay my-overlay

三、容器互联:通过网络名称直接通信

  1. 自定义网络(推荐)
  • 步骤 1:创建专用网络
docker network create -d bridge my-app-network # 创建桥接网络
  • 步骤 2:运行容器并加入网络
# 运行 Web 容器 
docker run -d --network my-app-network --name web-container nginx 
# 运行数据库容器 
docker run -d --network my-app-network --name db-container mysql
  • 通信方式
    容器可直接通过名称访问对方(如 web-container 访问 db-container:3306),无需端口映射或 IP 地址。
  1. 动态加入网络
# 新建容器并加入已有网络
docker run -d --name new-container --network my-app-network alpine sleep infinity  
# 将现有容器加入网络
docker network connect my-app-network existing-container
  1. 设置容器别名
docker run -d --network my-app-network --network-alias app-server nginx  
# 其他容器可通过 app-server 或容器名访问

四、DNS 与主机名配置

  1. 全局 DNS 配置(宿主机层面)
    修改 /etc/docker/daemon.json(Linux),指定所有容器的 DNS 服务器:
{
  "dns": ["114.114.114.114", "8.8.8.8"],
  "dns-search": ["local.example.com"]
}
  • 生效方式:重启 Docker 服务 systemctl restart docker
  1. 单容器 DNS 配置
docker run -it --rm \
  --dns 192.168.1.1 \       # 指定 DNS 服务器
  --dns-search example.com \ # 设置搜索域
  --hostname my-container   # 设置容器主机名
  ubuntu

五、跨平台注意事项

  1. Windows/Mac 系统的网络限制
  • 原因:Docker Desktop 在 Windows/Mac 上通过 Linux 虚拟机运行,宿主机(Windows/Mac)与容器网络需通过虚拟机中转。
  • 解决方案

访问容器服务:使用虚拟机 IP(如 192.168.99.100)而非 localhost

# 查看虚拟机 IP(Windows PowerShell) 
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -q) 

端口映射失效:确保 Docker Desktop 配置中启用了正确的端口转发。

  1. 容器 IP 固定(生产环境)
    通过 --ip 参数为容器指定静态 IP(需先创建自定义网络):
docker network create -d bridge --subnet=172.18.0.0/16 my-static-network  
docker run -d --network my-static-network --ip=172.18.0.2 --name web-server nginx

六、常用网络操作命令

命令

说明

docker network ls

列出所有网络

docker network inspect [网络名]

查看网络详情

docker network rm [网络名]

删除网络

docker exec [容器名] ip addr show

查看容器 IP 配置

docker port [容器名] [容器端口]

查看端口映射

实战案例:搭建 Web 与数据库集群

# 1. 创建应用网络
docker network create -d bridge app-network

# 2. 运行数据库容器(暴露 3306 端口到宿主机)
docker run -d \
  --network app-network \
  --name mysql-container \
  -e MYSQL_ROOT_PASSWORD=secret \
  -p 3306:3306 \
  mysql:5.7

# 3. 运行 Web 容器(通过容器名访问数据库)
docker run -d \
  --network app-network \
  --name web-container \
  -e DB_HOST=mysql-container \
  -p 80:80 \
  nginx

关键逻辑:Web 容器通过 mysql-container 名称直接连接数据库,无需硬编码 IP,提升可维护性。

最后,通过合理使用 Docker 网络功能,可实现容器间灵活通信、跨主机集群部署及网络隔离,满足从开发到生产的全场景需求。

原文链接:,转发请注明来源!