容器访问控制 检查本地系统的转发支持
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通,并成功建立连接。点到点链路不需要子网和子网掩码。