第八节 Docker 容器网络连接与通信实战
一、容器端口映射机制
(一)端口映射核心参数
Docker 提供两种端口映射方式,通过 -p 和 -P 参数实现容器与宿主机的端口互联:
参数 | 映射方式 | 示例 | 应用场景 |
-P | 随机映射容器端口到宿主机 | docker run -d -P nginx | 快速部署测试环境 |
-p | 自定义映射宿主机端口到容器 | docker run -d -p 8080:80 nginx | 生产环境固定端口访问 |
(二)高级端口映射技巧
1. 绑定指定IP地址
# 仅允许本地环回地址访问容器端口
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
# 端口映射结果
docker ps
# 输出:127.0.0.1:5001->5000/tcp
2. UDP端口映射
# 映射UDP端口(需明确指定协议)
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
# 验证UDP映射
netstat -an | grep 5000
3. 快捷查看端口映射
# 通过容器名查看端口映射
docker port adoring_stonebraker 5000
# 输出:127.0.0.1:5001
二、容器互联与网络配置
(一)自定义网络创建
# 创建bridge类型网络
docker network create -d bridge test-net
# 查看网络列表
docker network ls
# 输出示例:
# NETWORK ID NAME DRIVER SCOPE
# ab283fcd3b16 test-net bridge local
(二)容器连接到自定义网络
1. 启动容器并加入网络
# 启动第一个容器
docker run -itd --name test1 --network test-net ubuntu /bin/bash
# 启动第二个容器
docker run -itd --name test2 --network test-net ubuntu /bin/bash
2. 验证容器互联
# 进入test1容器
docker exec -it test1 /bin/bash
# 安装ping工具
apt-get update && apt-get install -y iputils-ping
# ping测试2容器(可直接使用容器名)
ping test2
# 输出:
# PING test2 (172.21.0.3) 56(84) bytes of data.
# 64 bytes from test2.test-net (172.21.0.3): icmp_seq=1 ttl=64 time=0.123 ms
三、DNS配置与网络优化
(一)全局DNS配置
1. 修改Docker守护进程配置
# /etc/docker/daemon.json
{
"dns": ["114.114.114.114", "8.8.8.8"],
"dns-search": ["local.com"]
}
2. 重启Docker服务
sudo systemctl restart docker
3. 验证DNS配置
# 启动临时容器查看DNS配置
docker run -it --rm ubuntu cat /etc/resolv.conf
# 输出:
# nameserver 114.114.114.114
# nameserver 8.8.8.8
# search local.com
(二)单容器DNS定制
# 启动容器时指定DNS和搜索域
docker run -it --rm \
-h host_ubuntu \
--dns=114.114.114.114 \
--dns-search=test.com \
ubuntu \
bash
# 查看容器DNS配置
cat /etc/resolv.conf
# 输出:
# search test.com
# nameserver 114.114.114.114
四、Windows环境网络特殊处理
(一)Windows端口映射问题
1. 问题现象
- 容器端口映射后,宿主机浏览器无法通过localhost:端口访问
2. 原因分析
- Windows下Docker容器运行在VirtualBox虚拟机中
- localhost指向宿主机,而非虚拟机IP
(二)解决方案
1. 获取虚拟机IP
# Docker Toolbox环境
docker-machine ip default
# 输出示例:192.168.99.100
2. 访问容器服务
# 格式:http://虚拟机IP:映射端口
http://192.168.99.100:8888
3. 完整操作流程
# 1. 启动容器并映射端口
docker run -it -p 8888:8888 conda:v1
# 2. 查看容器IP(可选)
docker inspect <容器ID> | grep IPAddress
# 3. 在容器内启动服务
jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --allow-root
五、容器网络高级实践
(一)多端口映射案例
# 同时映射多个端口
docker run -d \
-p 80:80 \
-p 443:443 \
-p 22:22 \
nginx
# 查看多端口映射
docker ps
# 输出:
# 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:22->22/tcp
(二)网络别名与服务发现
# 创建网络并设置别名
docker network create -d bridge \
--alias web-server \
--alias app-backend \
app-network
# 启动容器并指定别名
docker run -d \
--name webapp \
--network app-network \
--network-alias frontend \
training/webapp