docker网络管理
docker网络管理。
在通常情况下,Docker使用网桥(Bridge)与 NAT 的通信模式
(1) 容器访问外部网络 iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE
2) 外部网络访问容器 docker run -d -p 80:80 apache #典型的dnat映射。
会创建如下规则:
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
-b, --bridge=”” 指定 Docker 使用的网桥设备,默认情况下 Docker 会自动创建和使用 docker0 网桥设备,通过此参数可以使用已经存在的设备 --bip 指定 Docker0 的 IP 和掩码,使用标准的 CIDR(思科的表达方式) 形式,如 10.10.10.10/24 --dns 配置容器的 DNS,在启动 Docker 进程是添加,所有容器全部生效 --dns 用于指定启动的容器的 DNS --net 用于指定容器的网络通讯方式,有以下四个值 bridge:Docker 默认方式,网桥模式 none:容器没有网络栈 container:使用其它容器的网络栈,Docker容器会加入其它容器的 network namespace host:表示容器使用 Host 的网络,没有自己独立的网络栈。容器可以完全访问 Host 的网络,不安全 docker内网访问外网,docker之间互相通信,docker 使用网桥和nat技术,docker启动会创建一个docker0的网桥,docker0网桥就是让容器之间能 够相互通信,docker0没有自己的内核,容器会采用一种新的技术叫做名字命名空间,名字叫vethx,每一个容器会连接到名字命名空间上,名字命名空间 又是在我们网桥上创建的,也就是说这些名字命名空间是可以直接通信的,容器又是依附于名字命名空间的,那么容器之间就可以通信了。 网桥和真实网卡采用NAT方式。
/lib/systemd/system/docker.service #systemd管理脚本的存放路径
[root@localhost ~]# docker run --name test1 -itd busybox /bin/sh [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE b0a455e92ba3 bridge bridge local 03cf5e32ed93 host host local 2f461342dd7b none null local
创建两个网桥。
[root@localhost ~]# docker network create -d bridge xdlcom 24477c686a0e0600caa66e60f4f99ad9aff7e73860b4a5ea4b897e80176abe66 [root@localhost ~]# docker network create -d bridge xdlcn b0fa77027d9196d28bd2184b02a283ea1c2477b03bea34eeabe7314d0da9aa60 [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE b0a455e92ba3 bridge bridge local 03cf5e32ed93 host host local 2f461342dd7b none null local b0fa77027d91 xdlcn bridge local 24477c686a0e xdlcom bridge local [root@localhost ~]# docker run --name test2 -itd --network=xdlcn busybox /bin/sh WARNING: IPv4 forwarding is disabled. Networking will not work. d17b4d3e37405b510f8dd930628f13e1047302b3f8a070dc77023b3804272cff [root@localhost ~]# docker run --name test3 -itd --network=xdlcom busybox /bin/sh WARNING: IPv4 forwarding is disabled. Networking will not work. 72b65d74e5d97a2a959cd507cc9b2097ff5f7222e1d58702d556a3d3d6ba2980 [root@localhost ~]# docker inspect test2 |grep xdlcn "NetworkMode": "xdlcn", "xdlcn": {
[root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-br0 [root@localhost network-scripts]# cat ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=9da7ddfe-2ec2-4ded-b740-7b9e118a9a60 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.1.221 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=114.114.114.114 DNS2=8.8.8.8 [root@localhost network-scripts]# cat ifcfg-br0 DEVICE=br0 TYPE=Bridge NBOOT=yes BOOTPROTO=static IPADDR=192.168.1.220 NETMAST=255.255.255.0 GATEWAY=192.168.1.1 DNS1=114.114.114.114 DNS2=8.8.8.8
[root@localhost ~]# yum -y install git [root@localhost ~]# git clone https://github.com/jpetazzo/pipework [root@localhost ~]# cp -a pipework/pipework /usr/local/bin/ [root@localhost ~]# chmod a+x /usr/local/bin/pipework [root@localhost ~]# docker run --name test -itd --network=none busybox /bin/sh 691c26e4ad93ad1cb845517068c9c365cb36a97033f8ac67a8b8c5609fa58201 [root@localhost ~]# docker inspect test |grep "Networks" -A 10 #没有IP地址。 "Networks": { "none": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "2f461342dd7b14742487da9f129557566bdc7fe5b83bbf6b235c7357881cf3b2", "EndpointID": "5aae491bb1bac76ac78bcbf2783ea746207ca8c49d70db6f1465d7705d7fce8d", "Gateway": "", "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "",