# 指定端口映射docker run -d -p 8080:80 nginx# 宿主机 8080 → 容器 80# 多端口映射docker run -d -p 8080:80 -p 8443:443 nginx# 随机端口映射docker run -d -P nginx# Docker 随机分配宿主机端口# 指定 IPdocker run -d -p 127.0.0.1:8080:80 nginx# 只允许本地访问# UDP 端口docker run -d -p 5353:53/udp dns-server# 查看端口映射docker port web
6.4 网络隔离
# 创建两个网络docker network create frontenddocker network create backend# Web 服务器在 frontenddocker run -d --network frontend --name web nginx# 数据库在 backenddocker run -d --network backend --name db mysql# 连接 web 到 backend(web 可以访问 db)docker network connect backend web# 结果:# web: frontend + backend# db: backend# 外部 → frontend → web → backend → db ✅# 外部 → backend → db ❌(没有映射端口)# web → frontend → 外部 ✅
6.5 DNS 与服务发现
# Docker 内置 DNS(127.0.0.11)# 自定义网络中,容器名自动注册为 DNS 记录docker network create mynetdocker run -d --network mynet --name api nginxdocker run -d --network mynet --name web nginx# web 可以通过容器名访问 apidocker exec web ping api # ✅docker exec web curl http://api # ✅# 自定义 DNSdocker run -d --dns 8.8.8.8 --dns-search example.com nginx# 查看 DNS 配置docker exec web cat /etc/resolv.conf
6.6 跨主机网络
overlay 网络(Swarm 模式)
# 初始化 Swarmdocker swarm init# 创建 overlay 网络docker network create -d overlay --attachable my-overlay# 跨主机容器通信# 在 node1 上docker run -d --network my-overlay --name web nginx# 在 node2 上docker run -d --network my-overlay --name app nginx# app 可以通过容器名访问 web
第三方方案
flannel:Kubernetes 默认网络插件
weave:mesh 网络
Calico:网络策略 + BGP
6.7 网络故障排查
# 检查容器网络配置docker inspect --format '{{.NetworkSettings.Networks}}' web# 进入容器测试网络docker exec -it web shping google.comcurl -v http://api:8080nslookup api# 检查端口是否监听docker exec web netstat -tlnp# 检查 iptables 规则(宿主机)sudo iptables -t nat -L -n | grep DOCKER# 重置网络(谨慎)docker network prunedocker system prune -a