本文选择两种方式设置network通信: 同一个bridge上不同container 通信; 在同一个bridge下,从外网访问bridge下的container
docker network 常用命令:
docker network create my-bridge 创建自己的bridge
docker network ls 查看所有的network
docker network connect my-bridge 连接上我的bridge
docker network disconnect my-bridge 断开连接
docker network inspect my-bridge 查看bridge上具体配置
docker network rm my-bridge 移除bridge
brctl show 查看bridge具体id及interface
brctl delbr bridge 删除bridge(有时显示 can't delete bridge ,bridge is still up , 此时需要执行 ifconfig bridge down ,再执行 brctl delbr bridge)
模式一:同一个bridge 上不同container 通信
方法一: 直接创建,attach,并使用ping工具,这里的IP是docker随机生成 的
首先创建bridge
root@ubuntu-daisy:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
9889c9181a96 bridge bridge local
000afc2d4dc4 host host local
e000afb442a6 none null local
root@ubuntu-daisy:~# docker network create te-bridge
bce348e2d96b7cc20f2b70cf791eab7e287c896f3ceb1fa37c1f5bcca0b4bd4c
root@ubuntu-daisy:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
9889c9181a96 bridge bridge local
000afc2d4dc4 host host local
e000afb442a6 none null local
bce348e2d96b te-bridge bridge local
可用ifconfig 查看host 网络,docker0
使用inspect 查看bridge具体参数:此时container中为空的
root@ubuntu-daisy:~# docker network inspect bridge
向bridge中添加新的container,此时containers中内容有两个container
root@ubuntu-daisy:~# docker run -itd --name=container1 busybox
63bcb63c337d526cb6f496bf66bca95feef7a7fdcacb9132d47be0da10ca5238
root@ubuntu-daisy:~# docker run -itd --name=container2 busybox
8cf4dd7c28e05a1ca4702a8b4f6201600174ac97a2afc4173561e4595644b258
root@ubuntu-daisy:~# docker network inspect bridge
[
{
"Name": "bridge",
"Id":"9889c9181a960ba5cc9dd5a8d0b0b8b60e747b0754e561917b57e080ea7f7e9a",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6":false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Containers": {
"63bcb63c337d526cb6f496bf66bca95feef7a7fdcacb9132d47be0da10ca5238":{
"Name": "container1",
"EndpointID": "0620074b917da94b5ff84911240a86e6985e61a26686b32c71cfcb31088b7a3a",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"8cf4dd7c28e05a1ca4702a8b4f6201600174ac97a2afc4173561e4595644b258":{
"Name": "container2",
"EndpointID":"463093ce1658e9f171385a13205d161600bf1d35cb37d778e165badf0e6d163f",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4":"0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
从此处查看两个container的IP进入container1中,尝试连接container2,进行通信
root@ubuntu-daisy:~# docker attach container1
/ # ifconfig
eth0 Linkencap:Ethernet HWaddr 02:42:AC:12:00:02
inetaddr:172.18.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr:fe80::42:acff:fe12:2/64 Scope:Link
UP BROADCASTRUNNING MULTICAST MTU:1500 Metric:1
RXpackets:16 errors:0 dropped:0 overruns:0 frame:0
TX packets:8errors:0 dropped:0 overruns:0 carrier:0
collisions:0txqueuelen:0
RXbytes:1296 (1.2 KiB) TX bytes:648 (648.0B)
lo Linkencap:Local Loopback
inetaddr:127.0.0.1 Mask:255.0.0.0
inet6 addr:::1/128 Scope:Host
UP LOOPBACKRUNNING MTU:65536 Metric:1
RX packets:0errors:0 dropped:0 overruns:0 frame:0
TX packets:0errors:0 dropped:0 overruns:0 carrier:0
collisions:0txqueuelen:1
RX bytes:0(0.0 B) TX bytes:0 (0.0 B)
/ # ping -w3 172.18.0.3
PING 172.18.0.3 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.105 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.049 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.047 ms
--- 172.18.0.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
发现ping成功,可以成功接收container2传递的包。也就是说在同一个bridge上,不同的container间是可以通信的
方法二:使用pipework工具,设定自己的container IP进行通信
首先安装pipework 工具
# wget https://github.com/jpetazzo/pipework/archive/master.zip
# unzip master.zip
# cp pipework-master/pipework /usr/local/bin/
# chmod +x /usr/local/bin/pipework
# which pipework
接下来创建及连接网桥
我的实例是已知两个container ip:虚拟机1和虚拟机2,通过route命令查看ipaddress和gateway:
虚拟机1:10.239.129.33 10.239.128.1
虚拟机2:10.239.173.55 10.239.173.1
在同一个bridge下两个container通信:bridge name 为bri0
root@ubuntu-daisy:~/daisy_dockerbuild#pipework bri0 $(docker run -d -it --net=none --name testduliip007 busybox ) 10.239.129.33/24@10.239.128.1
Warning: arping not found; interfacemay not be immediately reachable
root@ubuntu-daisy:~/daisy_dockerbuild#brctl show
bridge name bridge id STP enabled interfaces
bri0 8000.42ac3eb8618c no
veth1pl106144
docker0 8000.024230377c78 no
root@ubuntu-daisy:~/daisy_dockerbuild#pipework bri0 $(docker run -d -it --net=none --name testduliip008 busybox ) 10.239.173.55/24@10.239.173.1
Warning: arping not found; interfacemay not be immediately reachable
root@ubuntu-daisy:~/daisy_dockerbuild#brctl show
bridge name bridge id STP enabled interfaces
bri0 8000.42ac3eb8618c no
veth1pl106144
veth1pl106309
docker0 8000.024230377c78 no
root@ubuntu-daisy:~/daisy_dockerbuild#docker attach testduliip008
/ # ping 10.239.173.55
PING 10.239.173.87 (10.239.173.87): 56data bytes
64 bytes from 10.239.173.87: seq=0ttl=64 time=0.051 ms
64 bytes from 10.239.173.87: seq=1ttl=64 time=0.030 ms
64 bytes from 10.239.173.87: seq=2ttl=64 time=0.029 ms
^C
--- 10.239.173.87 ping statistics ---
3 packets transmitted, 3 packetsreceived, 0% packet loss
round-trip min/avg/max =0.029/0.036/0.051 ms
模式二:在同一个的bridge下通信,从外网访问bridge下的container
建立通信步骤:
第一步:在本机上sh startbr.sh ,完成后本机物理接口已经与建立的虚拟网桥接上,本机通信断掉,需要从其他机器登录跳转到本机进行下面操作
第二步:建立container,设定IP
第三步:添加网关,允许外网访问本机内部container IP
For example:
root@ubuntu-daisy:~/bamboo# ls
master.zip mydockerbuild pipework-master startbr.sh web
root@ubuntu-daisy:~/bamboo#
root@ubuntu-daisy:~/bamboo# cat startbr.sh
#! /bin/sh
IP_ADDR=`/sbin/ifconfig enp3s0f3 | grep "inetaddr" | tr -s ' ' | cut -d ' ' -f3 | cut -d ":" -f2`
NETMASK=`/sbin/ifconfig enp3s0f3 | grep "inetaddr" | tr -s ' ' | cut -d ":" -f4`
/sbin/brctl addbr bri0
/sbin/brctl addif bri0 enp3s0f3
ifconfig enp3s0f3 0.0.0.0 promisc
ifconfig bri0 ${IP_ADDR} netmask ${NETMASK} up
root@ubuntu-daisy:~/bamboo#
root@ubuntu-daisy:~/bamboo# sh startbr.sh
登录其他host:10.239.128.245
建立container前检查所设IP可以使用
root@ubuntu-daisy:~# ping 10.239.129.14
PING 10.239.129.14 (10.239.129.14) 56(84) bytes of data.
64 bytes from 10.239.129.14: icmp_seq=1 ttl=64 time=0.317 ms
64 bytes from 10.239.129.14: icmp_seq=2 ttl=64 time=0.183 ms
64 bytes from 10.239.129.14: icmp_seq=3 ttl=64 time=0.183 ms
^C
--- 10.239.129.14 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time2000ms
rtt min/avg/max/mdev = 0.183/0.227/0.317/0.065 ms
root@ubuntu-daisy:~# pipework bri0 $(docker run -d -it --net=none --name testduliip001 busybox ) 10.239.129.14/23@10.239.128.1
root@ubuntu-daisy:~# ping 10.239.128.12
PING 10.239.128.12 (10.239.128.12) 56(84) bytes of data.
64 bytes from 10.239.128.12: icmp_seq=1 ttl=64 time=0.430 ms
64 bytes from 10.239.128.12: icmp_seq=2 ttl=64 time=0.146 ms
64 bytes from 10.239.128.12: icmp_seq=3 ttl=64 time=0.172 ms
64 bytes from 10.239.128.12: icmp_seq=4 ttl=64 time=0.126 ms
^C
--- 10.239.128.12 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time2999ms
rtt min/avg/max/mdev = 0.126/0.218/0.430/0.124 ms
root@ubuntu-daisy:~# pipework bri0 $(docker run -d -it --net=none --name testduliip002 busybox ) 10.239.128.12/23@10.239.128.1
Warning: arping not found; interface may not be immediatelyreachable
root@ubuntu-daisy:~# brctl show
bridge name bridgeid STP enabled interfaces
bri0 8000.001e67e6c02a no enp3s0f3
veth1pl6754
veth1pl6933
docker0 8000.02420270a92d no
virbr0 8000.525400f5b743 yes virbr0-nic
建立网关,开始ping
root@ubuntu-daisy:~# route add default gw 10.239.128.1
root@ubuntu-daisy:~# ping 10.239.128.12
PING 10.239.128.12 (10.239.128.12) 56(84) bytes of data.
64 bytes from 10.239.128.12: icmp_seq=1 ttl=64 time=0.189 ms
64 bytes from 10.239.128.12: icmp_seq=2 ttl=64 time=0.116 ms
64 bytes from 10.239.128.12: icmp_seq=3 ttl=64 time=0.165 ms
64 bytes from 10.239.128.12: icmp_seq=4 ttl=64 time=0.125 ms
^C
--- 10.239.128.12 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time2997ms
rtt min/avg/max/mdev = 0.116/0.148/0.189/0.033 ms
ping成功,外网可以访问虚拟网桥连接的container,实现container与外部通信。
方法三 container间互联 --link
使用—link参数可以让容器间安全的进行交互
步骤: 首先创建新的数据库容器
然后创建新的web容器,并将它连接到db容器
查看互联关系,使用ping工具测试连通
For example:
root@ubuntu-daisy:~# sudo docker run -d --name dbtraining/postgres
root@ubuntu-daisy:~# sudo docker run --rm --nameweb2 --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=c7fbbfa069e7
DB_PORT=tcp://172.18.0.2:5432
DB_PORT_5432_TCP=tcp://172.18.0.2:5432
DB_PORT_5432_TCP_ADDR=172.18.0.2
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/root
root@ubuntu-daisy:~# sudo docker run -t -i --rm--link db:db training/webapp /bin/bash
root@7e18b848e602:/opt/webapp# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2 db 5e0dc1987672
172.18.0.4 7e18b848e602 //可以看到有两个host
root@7e18b848e602:/opt/webapp# ping db //用Ping来测试db容器(172.18.0.2)
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from db (172.18.0.2): icmp_seq=1 ttl=64time=0.085 ms
64 bytes from db (172.18.0.2): icmp_seq=2 ttl=64time=0.030 ms
64 bytes from db (172.18.0.2): icmp_seq=3 ttl=64time=0.030 ms
64 bytes from db (172.18.0.2): icmp_seq=4 ttl=64time=0.029 ms
^C
--- db ping statistics ---
4 packets transmitted, 4 received, 0% packet loss,time 3000ms
rtt min/avg/max/mdev = 0.029/0.043/0.085/0.024 ms
用户可以链接多个子容器到父容器,比如链接多个web到db容器上。