Docker-12-容器网络

要构建具有安全的一致行为的web应用程序,可以使用Docker网络特性.根据定义,网络为容器实现了完全隔离.因此,控制应用程序所在的网络很重要,Docker容器网络为您提供了这种控制能力.

默认网络

docker提供了三种网络,可以通过docker network ls命令去查看,结果如下:
image

前面三个就是docker默认提供的,运行容器的时候可以通过--net来指定网络,先来看下这三个默认的网络分别是怎样的

  • bridge: 表示所有Docker安装中都存在的docker0网络. 除非使用docker run --net=<network>选项另行指定,否则Docker守护进程默认情况下会将容器连接到此网络,在主机上使用ifconfig命令,可以看到此网桥是主机的网络堆栈的一部分
  • none: 意味着不指定网络,使用这个网络的容器中没有网卡.
  • host: 会将容器加入宿主机所在的网络中,在使用这个网络的容器中其网络配置和宿主机一样

bridge网络详解

查看bridge网络的详细信息,命令如下:

1
docker network inspect bridge

返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[
{
"Name": "bridge",
"Id": "e73fffb9d7ea78c02f9fdcabd33377054ae1f391ed883d8b4c6141f2ee99b101",
"Created": "2019-04-23T09:36:04.07923852+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {
"dc37d28c293f8568e396f2c788b43f1fc1e293b88f85232a6c5ae550a099493e": {
"Name": "registry",
"EndpointID": "8d31b605406c7aa857366af422eca1e859cbb6610bb4a166c61c893866f006df",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/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": {}
}
]

看一下返回值中的Containers,就是所有使用这个网络的容器的信息,上面这个返回值里面的容器就是我们上文中搭建docker仓库的那个容器

在这个网络中的容器,互相之间可以通过ip进行通信,Docker不支持默认的bridge网络上的服务发现(automatic service discovery),如果你希望默认的bridge网络上的容器之间能够通过名字互相通信,需要在docker run命令中指定--link标识

默认的docker0网络上支持通过端口映射或是使用–link来进行通信,但这种方法很笨重且容易出错,不建议在以后的应用中使用.

自定义网络

为了很好的实现容器之间的网络隔离,可以使用自定义网络,Docker提供了一些网络驱动器(network driver)来方便用户自定义网络,你可以创建bridge networkoverlay network,也可以通过创建自己的网络插件.

你可以创建许多网络,Docker支持将一个容器加入多个网络,只有在同一个网络中的容器之间才可以相互通信,而不能跨网络通信.

创建bridge网络

创建自定义网络最简单的方式就是创建一个bridge网络.这样创建的网络和之间介绍的docker0网络很像. 命令如下:

1
docker network create --driver bridge isolated_nw

image

创建完成之后,容器就可以使用了.在docker run命令中加入参数,--net=isolated_nw就ok了

同时在容器运行过程中,也可以指定网络,命令如下:

1
docker network connect 网络名/id 容器名/id

我们上面创建的这个网络中,加入这个bridge网络的容器必须在同一个宿主机上,同一个网络中的容器之间可以直接通信,但不能和不同网络的容器通信.其示意图如下:
image

在用户自定义的bridge网络中,--link是不支持的,如果你希望外部网络可以访问容器中的应用,可以通过对外暴露端口(expose port)的方式完成.

如果你希望在单个宿主机上创建一个小型网络,bridge网络是很有用的.但如果想创建更大的网络,尤其是跨越多个宿主机的网络,那就需要创建overlay网络

overlay网络这里先不做介绍,想了解的同学可以看这里:原文地址