一、端口映射进阶:-p与-P的核心差异
- 随机映射(-P)
- 场景:快速启动服务,自动分配宿主机端口(适用于开发测试)。
docker run -d -P nginx # 容器 80 端口随机映射到宿主机高端口(如 32768)
- 查看映射:
docker port [容器名或ID] 80 # 输出宿主机端口(如 0.0.0.0:32768)
- 指定映射(-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 端口
- 多端口映射
docker run -d \
-p 8080:80 \ # HTTP 端口
-p 443:443/tcp \ # HTTPS 端口(TCP)
-p 123:123/udp # NTP 端口(UDP)
nginx
二、Docker 网络模式详解
Docker 支持 4 种网络模式,通过 --network 参数指定:
- bridge 模式(默认)
- 特点:
容器通过虚拟网桥(docker0)与宿主机通信。
容器拥有独立 IP,宿主机可通过端口映射访问容器。
- 使用场景:单机多容器通信(最常用模式)。
- 示例:
docker run -d --network bridge --name web nginx
- host 模式
- 特点:
容器直接使用宿主机网络栈,无网络隔离。
容器 IP、端口与宿主机完全一致(性能最佳)。
- 使用场景:需要高性能或直接操作宿主机网络的服务(如监控工具)。
- 示例:
docker run -d --network host --name host-nginx nginx
- none 模式
- 特点:
容器无网络配置,需手动添加网卡(如 veth 设备)。
完全隔离网络,安全性最高。
- 使用场景:敏感数据处理或定制化网络方案。
- 示例:
docker run -d --network none --name isolated-container alpine sleep infinity
- overlay 模式
- 特点:
跨主机容器通信,支持 Docker Swarm 集群。
通过 VXLAN 实现跨主机二层网络。
- 使用场景:分布式集群部署(需开启 Swarm 模式)。
- 示例:
# 创建 overlay 网络
docker network create -d overlay my-overlay
三、容器互联:通过网络名称直接通信
- 自定义网络(推荐)
- 步骤 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 地址。
- 动态加入网络
# 新建容器并加入已有网络
docker run -d --name new-container --network my-app-network alpine sleep infinity
# 将现有容器加入网络
docker network connect my-app-network existing-container
- 设置容器别名
docker run -d --network my-app-network --network-alias app-server nginx
# 其他容器可通过 app-server 或容器名访问
四、DNS 与主机名配置
- 全局 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。
- 单容器 DNS 配置
docker run -it --rm \
--dns 192.168.1.1 \ # 指定 DNS 服务器
--dns-search example.com \ # 设置搜索域
--hostname my-container # 设置容器主机名
ubuntu
五、跨平台注意事项
- 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 配置中启用了正确的端口转发。
- 容器 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 网络功能,可实现容器间灵活通信、跨主机集群部署及网络隔离,满足从开发到生产的全场景需求。