docker 上 container 及 host 间通信


本文选择两种方式设置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命令查看ipaddressgateway

      虚拟机110.239.129.33  10.239.128.1

      虚拟机210.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

  ssh root@10.239.129.89

建立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容器上。



























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值