15: docker networking

来源:互联网 发布:mac手写输入如何选字 编辑:程序博客网 时间:2024/06/05 08:00

在Docker 1.9之后,Docker正式宣布可以将Networking应用于生产环境中,并且可以与Swarm以及Compose进行较好的结合。与传统的Links相比,Networking具有以下优势:

  • 允许不同物理主机或者虚拟主机上的容器进行通信

  • 使用了Networking的容器可以很方便地进行停止、启动或者重启等操作而不用担心会影响到与其他容器之间的连接

  • 并不需要在连接到某个容器之前就直接创建它,换言之,Networking不再像原本的Links一样会依赖某个容器而存在

Single Host Networking

可以直接使用docker network命令来使用Networking,其中可以使用docker network create来创建一个新的网络,在这个示例中,我们会创建一个叫做frontend的网络并且在其中运行一个nginx容器:

$ docker network create frontend$ docker run -itd --net=frontend --name web nginx

我们使用网络来分割应用,乃至于分割应用中的不同模块。在本例子中,我们可以创建另一个包含了应用程序的网络app,然后将这个网络与frontend网络相连,命令如下所示:

$ docker network create app$ docker run -itd --name myapp --net=app <my application container>$ docker network connect app web

这样我们的Nginx服务器就可以使用myapp.app这个主机名来连接到应用程序中。我们创建两个基于busybox的容器来进行尝试:

$ docker run -d --name rose --net=frontend busybox topc1fa2dc7fa3a412b52b53f5facd25ba11e99c362d77be8cea4ff49f3d5e2cafc$ docker run --rm --net=frontend busybox ping -c 4 rosePING rose (172.19.0.2): 56 data bytes64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.122 ms64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.078 ms64 bytes from 172.19.0.2: seq=2 ttl=64 time=0.098 ms64 bytes from 172.19.0.2: seq=3 ttl=64 time=0.241 ms

我们已将第二个容器附着到frontend网路中,并且用ping命令来进行内建的容器发现,我们可以用inspect命令来查看网络的详情:

$ docker network inspect frontend[    {        "Name": "frontend",        "Id": "a639a457122020faa69a4ab906bc33217c9c6d73048f3dbbb69e53dbe5e0952c",        "Scope": "local",        "Driver": "bridge",        "IPAM": {            "Driver": "default",            "Config": [                {}            ]        },        "Containers": {            "c1fa2dc7fa3a412b52b53f5facd25ba11e99c362d77be8cea4ff49f3d5e2cafc": {                "EndpointID": "976bab21d4a11cd21d5d1c1560f67f39ef15245662aeacf097eb1d5c148ed748",                "MacAddress": "02:42:ac:13:00:02",                "IPv4Address": "172.19.0.2/16",                "IPv6Address": ""            }        },        "Options": {}    }]

在前端网络之外,我们也可以创建一个自定义的后端网络,用于连接其他容器:

$ docker network create backend09733cac7890edca439cdc3d476b4cd1959e44065217aa581d359575b8d2288f$ docker network connect backend rose$ docker network inspect backend    {        "name": "backend",        "id": "09733cac7890edca439cdc3d476b4cd1959e44065217aa581d359575b8d2288f",        "scope": "local",        "driver": "bridge",        "ipam": {            "driver": "default",            "config": [                {}            ]        },        "containers": {            "c1fa2dc7fa3a412b52b53f5facd25ba11e99c362d77be8cea4ff49f3d5e2cafc": {                "endpoint": "438730c588915dd54dc694efdb3a15c77bc5e86c744f5f87a65f6ac46b43e5ad",                "mac_address": "02:42:ac:14:00:02",                "ipv4_address": "172.20.0.2/16",                "ipv6_address": ""            }        },        "options": {}    }]

再看一下容器中具体的网络的设置:

$ docker inspect -f '{{ json .NetworkSettings }}' rose{  "Bridge": "",  "SandboxID": "b600bebe1e2bb6dee92335e6acfe49215c30c4964d7a982711ec12c6acca3309",  "HairpinMode": false,  "LinkLocalIPv6Address": "",  "LinkLocalIPv6PrefixLen": 0,  "Ports": {},  "SandboxKey": "/var/run/docker/netns/b600bebe1e2b",  "SecondaryIPAddresses": null,  "SecondaryIPv6Addresses": null,  "EndpointID": "",  "Gateway": "",  "GlobalIPv6Address": "",  "GlobalIPv6PrefixLen": 0,  "IPAddress": "",  "IPPrefixLen": 0,  "IPv6Gateway": "",  "MacAddress": "",  "Networks": {    "backend": {      "EndpointID": "438730c588915dd54dc694efdb3a15c77bc5e86c744f5f87a65f6ac46b43e5ad",      "Gateway": "172.20.0.1",      "IPAddress": "172.20.0.2",      "IPPrefixLen": 16,      "IPv6Gateway": "",      "GlobalIPv6Address": "",      "GlobalIPv6PrefixLen": 0,      "MacAddress": "02:42:ac:14:00:02"    },    "frontend": {      "EndpointID": "976bab21d4a11cd21d5d1c1560f67f39ef15245662aeacf097eb1d5c148ed748",      "Gateway": "172.19.0.1",      "IPAddress": "172.19.0.2",      "IPPrefixLen": 16,      "IPv6Gateway": "",      "GlobalIPv6Address": "",      "GlobalIPv6PrefixLen": 0,      "MacAddress": "02:42:ac:13:00:02"    }  }}

而在容器中使用ifconfig命令查看时:

$ docker exec rose ifconifgeth0      Link encap:Ethernet  HWaddr 02:42:AC:13:00:02          inet addr:172.19.0.2  Bcast:0.0.0.0  Mask:255.255.0.0          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:27 errors:0 dropped:0 overruns:0 frame:0          TX packets:16 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:0          RX bytes:2238 (2.1 KiB)  TX bytes:1208 (1.1 KiB)eth1      Link encap:Ethernet  HWaddr 02:42:AC:14:00:02          inet addr:172.20.0.2  Bcast:0.0.0.0  Mask:255.255.0.0          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:16 errors:0 dropped:0 overruns:0 frame:0          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:0          RX bytes:1296 (1.2 KiB)  TX bytes:648 (648.0 B)lo        Link encap:Local Loopback          inet addr:127.0.0.1  Mask:255.0.0.0          UP LOOPBACK RUNNING  MTU:65536  Metric:1          RX packets:0 errors:0 dropped:0 overruns:0 frame:0          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:0          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

而如果要将某个容器从网络中断开时,可以使用如下命令:

docker network disconnect backend rose

这种网络配置方式的初衷即将服务独立出来成为一个网络中不同的容器之间相互交流的唯一信息。换言之,在实践中,需要构建出大量的小型网络,每个网络中只负责某个服务的通信,并且不同的网络之间应该是相互隔离的。一个典型的例子就是负载均衡器、前端、后端以及一个数据库。

Network Customization

在创建网络的时候我们也可以设置很多的自定义的配置:

  --aux-address=map[]      auxiliary ipv4 or ipv6 addresses used by Network driver  -d, --driver="bridge"    Driver to manage the Network  --gateway=[]             ipv4 or ipv6 Gateway for the master subnet  --help=false             Print usage  --ip-range=[]            allocate container ip from a sub-range  --ipam-driver=default    IP Address Management Driver  -o, --opt=map[]          set driver specific options  --subnet=[]              subnet in CIDR format that represents a network segment

我们首先来看下--driver选项,该选项可以来选定具体的网络驱动方式来管理网络,目前Docker提供了如下两种驱动器:

  • bridge -- This driver provides the same sort of networking via veth bridge devices that prior versions of docker use, it is the default.

  • overlay -- Not to be confused with the "overlay" storage driver (thanks overlayfs), this driver provides native multi-host networking for docker clusters. When using swarm, this is the default driver.

另一个常用的选项是--ipam-driver,用来确定IP地址是如何分配的。目前Docker仅内置了一种IP地址分配方案,未来会添加上DHCP IAMP方式。

0 0
原创粉丝点击