容器访问控制 检查本地系统的转发支持

sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1  # 手动打开
如果在启动Docker服务的时候设定--ip-forward=true,Docker会自动设定

容器之间相互访问,需要:

1 容器的网络拓扑是否已经互联,默认连接在docker0网桥
2 本地防火墙是否允许通过

访问所有端口

默认情况下,不同容器之间是允许网络互通的, 为了安全,可以禁止。

vim /etc/default/docker
DOCKER_OPTS=--icc=false

访问指定端口

通过 -icc=false 关闭网络访问后,还可以通过 --link=CONTAINER_NAME:ALIAS 来访问容器的开放端口

容器访问外部实现

docker run -p or -P 本质是在本地iptables的nat表添加相应的规则 
iptables -t nat -nL  # 查看主机的NAT规则

如果希望永久绑定到某个固定的IP地址
vim /etc/docker/daemon.json

{
    "ip":"0.0.0.0"
}

配置docker0网桥

Docker服务默认会创建一个docker0网桥,在内核层联通了其他的物理或者虚拟网卡,将所有的容器和本地主机都放到同一个物理网络。
Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

查看网桥和端口连接信息

yum install bridge-utils -y
brctl show

每次新创建一个容器的时候,Docker从可用的地址段中选择一个空闲的IP分配给容器的eth0端口,使用本地的docker0接口IP作为所有容器的默认网关。
sudo docker run -it --rm base /bin/bash
ip addr show eth0
ip route

自定义网桥

启动Docker服务时使用 -b BRIDGE 或 --bridge=BRIDGE 来指定使用的网桥

若服务已运行,先停止服务并删除旧的网桥
sudo systemctl stop docker
sudo ip link set dev docker0 down
sudo brctl delbr docker0

然后创建一个新的网桥bridge0
sudo brctl addbr bridge0
sudo ip addr add 192.168.5.1/24 dev bridge0
sudo ip link set dev bridge0 up

ip addr show bridge0  # 查看确认网桥创建并启动

vim /etc/docker/daemon.json  将Docker默认桥接到创建的网桥上。
{
    "bridge": "bridge0",
}

外部工具

pipework  # shell脚本,可以帮助用户在比较复杂的场景中完成容器的连接
playground Docker容器网络拓扑管理的Python库,包括路由器、NAT防火墙,以及其他一些基本服务。

编辑网络配置文件

Docker 1.2.0以后支持在运行中的容器编辑 /etc/hosts, /etc/hostname, /etc/resolve.conf文件
但是这些修改都是临时的,只在运行中的容器中保留。

创建点对点的连接

用户需要有时候在两个容器之间可以直连通信,而不用通过主机网桥进行桥接。
解决方法是:创建一对peer接口,分别放到两个容器中,配置成点对点链路。

1 启动两个容器
docker run -it --rm --net=none base /bin/bash
docker run -it --rm --net=none base /bin/bash

2 找到进程号,然后创建网络命名空间的跟踪文件
docker inspect -f '{{.State.Pid}}' e9f076fc2447
docker inspect -f '{{.State.Pid}}' 762086c10c65

sudo mkdir -p /var/run/netns
sudo ln -s /proc/2989/ns/net /var/run/netns/2989
sudo ln -s /proc/3004/ns/net /var/run/netns/3004

3 创建一对peer接口,然后配置路由
sudo ip link add A type veth peer name B

sudo ip link set A netns 2989
sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
sudo ip netns exec  2989 ip link set A up
sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A

sudo ip link set B netns 3004
sudo ip netns exec 3004 ip addr add 10.1.1.1/32 dev B
sudo ip netns exec  3004 ip link set B up
sudo ip netns exec 3004 ip route add 10.1.1.2/32 dev B

到此2个容器可以相互ping通,并成功建立连接。点到点链路不需要子网和子网掩码。

EngineerLeo
598 声望38 粉丝

专注于云原生、AI等相关技术