在Docker实战中,创建一个点到点(Point-to-Point, P2P)连接通常是指在两个容器之间直接建立一条专用通信链路。以下是一个简化版的示例步骤:
步骤1:启动两个容器并进入它们的网络命名空间
首先,以无网络模式(--net=none
)启动两个容器,并获取它们的进程ID,以便创建网络命名空间链接。
docker run -it --rm --net=none --name container1 base /bin/bash
docker run -it --rm --net=none --name container2 base /bin/bash
步骤2:查找并创建网络命名空间软链接
使用 docker inspect
获取每个容器对应的PID,并为它们创建软链接到 /var/run/netns/
目录下,这样可以通过ip命令来配置网络设备。
# 获取第一个容器的PID
container1_pid=$(docker inspect -f '{{ .State.Pid }}' container1)
# 创建网络命名空间链接
sudo mkdir -p /var/run/netns
sudo ln -s /proc/$container1_pid/ns/net /var/run/netns/container1_ns
# 对第二个容器做同样的操作
container2_pid=$(docker inspect -f '{{ .State.Pid }}' container2)
sudo ln -s /proc/$container2_pid/ns/net /var/run/netns/container2_ns
步骤3:创建一对虚拟网卡并配置点到点连接
在宿主机上创建一对虚拟网卡(如veth pair),并将一端放入每个容器的网络命名空间中,并配置IP地址和点对点连接。
# 创建veth pair
ip link add veth_container1 type veth peer name veth_container2
# 将一端放入container1的网络命名空间
ip link set veth_container1 netns $container1_pid
ip netns exec container1_ns ip addr add 10.0.0.1/30 dev veth_container1
ip netns exec container1_ns ip link set veth_container1 up
# 将另一端放入container2的网络命名空间
ip link set veth_container2 netns $container2_pid
ip netns exec container2_ns ip addr add 10.0.0.2/30 dev veth_container2
ip netns exec container2_ns ip link set veth_container2 up
# 在宿主机上配置路由,允许容器间的通信
ip route add 10.0.0.0/30 dev veth_container1
现在,两个容器已经通过点到点链路建立了直接连接,它们可以通过分配的IP地址相互通信。在实际生产环境中,这种配置可能需要结合具体的网络需求和安全策略进行调整。同时,自Docker 1.9版本以后引入了网络插件和网络驱动功能,上述手动设置网络的方式逐渐被Docker原生的overlay网络、macvlan等高级网络功能所替代。在现代Docker实践中,更推荐使用这些内置功能实现容器间的直接通信或隔离。