libra0 2019-06-28
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" }
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通,并成功建立连接。点到点链路不需要子网和子网掩码。