Docker 网络 101
Docker是一个很棒的工具,开发人员可以在其中构建和运行他们的应用程序。
有趣的事实:实际上是PaaS(平台即服务)公司DotCloud在内部创建了它作为一种内部工具!
然而,该公司很快意识到了它的真正潜力,并在2013年将其作为开源项目提供。我们现在所知的Docker Inc很快变得流行起来,并与Red Hat、IBM、Microsoft、Google和思科系统等公司建立了重大合作伙伴关系,拥有成千上万的用户!
今天的软件开发需要敏捷性和快速变更响应。我们用故事点评估我们的工作,参与站立会议,并使用Scrum等方法论。Docker可以支持我们的敏捷性。
您必须意识到,任何软件开发的部署阶段都是昂贵的。而这就是Docker平台的用武之地。它通过使用操作系统级虚拟软件将软件放入容器中来简化部署。
这个平台的好处在于,它将应用程序及其所有依赖项(如二进制文件、库、配置文件、脚本、jar文件等)捆绑到一个简单易用的包中。这是一种简单且标准化的方法,为世界各地的软件开发人员提供了更简单的生活!
Docker简化了跨平台的协作和网络
在Docker出现之前,通常需要组合多种技术,如virtual machines、配置管理工具、软件包管理系统和复杂的库依赖网络,来管理开发流水线中的软件移动。为了维护和管理这些工具,需要熟练的工程师,大多数情况下需要定制的设置。
Docker通过使参与这个过程的所有工程师能够用一种语言进行通信,简化了协作。
通过主机机器,Docker容器使用Docker网络与彼此和外部世界进行通信。容器网络模型(CNM)控制Docker网络,使用了几种不同的网络驱动程序。网络选择标准将基于容器的功能和目的。
它们非常强大,因为它们可以将其他平台上的工作负载与Docker服务和容器连接起来。无论它们运行的是Windows还是Linux,您都可以使用Docker以平台中立的方式管理您的Docker hosts。
Docker网络是如何工作的?
Docker已经指定了一种称为容器网络模型(CNM)的基本网络模型,具有实现容器网络的任何软件都必须满足的规范。CNM将网络配置保存在控制台样式的分布式键值存储中。
CNM的三个组件是沙盒、端点和网络:
- 沙盒:沙盒是容器的网络配置的容器。在容器内部,它作为一个网络堆栈工作。
- 端点:端点是一个网络的接口,通常成对出现。我们通过将一端放入所选网络,将另一端放入沙盒中来配置这对端点。此外,端点只加入一个网络,而单个网络沙盒可能包含多个端点。
- 网络:它由具有直接通信能力的一组端点组成。
在沙盒中,即使存在多个端点,每个端点也只能有一个网络连接。网络是几个或多个相互连接的端点的分组。
Docker网络中的网络驱动程序将CNM思想付诸实践。Docker使用两种不同类型的网络驱动程序:本地网络驱动程序和远程网络驱动程序。本地网络驱动程序通常称为内置驱动程序,由Docker提供并随Docker引擎一起提供。而供应商提供的第三方驱动程序称为远程网络驱动程序。
可以设计包含特定功能的驱动程序。
Docker网络
Docker中主要有五个网络 – 桥接、主机、覆盖、无和macvlan。
桥接网络是Docker中的默认网络。关于这些网络的介绍在我之前的一篇文章中已经给出了。
在本文中,我将向您展示Docker网络的实际部分。您将了解如何检查Docker网络详细信息,如何连接到网络,如何创建您的网络等。所以,让我们开始吧。
每当您运行一个Docker容器时,除非指定了其他网络,否则默认情况下会关联一个名为docker0的默认桥接网络。例如,当我运行ifconfig
命令时,您将获得桥接类型的docker0网络的详细信息,以及其他网络详细信息。
osboxes@worker2:~$ ifconfig
docker0: flags=4099 mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:f6:59:4a:5f txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp0s3: flags=4163 mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::763e:c0b4:14df:b273 prefixlen 64 scopeid 0x20
ether 08:00:27:68:64:9a txqueuelen 1000 (Ethernet)
RX packets 2157 bytes 2132896 (2.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 952 bytes 151610 (151.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp0s8: flags=4163 mtu 1500
inet 192.168.56.102 netmask 255.255.255.0 broadcast 192.168.56.255
inet6 fe80::20a:6c57:839d:2652 prefixlen 64 scopeid 0x20
ether 08:00:27:53:45:82 txqueuelen 1000 (Ethernet)
RX packets 10597 bytes 1497146 (1.4 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12058 bytes 1730219 (1.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 1196 bytes 105396 (105.3 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1196 bytes 105396 (105.3 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
列出网络
运行ls
命令以检查当前主机上运行的所有网络。您可以看到,目前存在七个网络,包括在安装Docker时自动创建的桥接、主机和无网络。根据我过去运行的容器,还有其他自定义网络的详细信息。
yaoweibin@yaoweibin:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
fec751a6ae21 bridge bridge local
21943b20735d docker_gwbridge bridge local
f51d1f3379e0 host host local
ppp8i7tvrxa0 ingress overlay swarm
ba68f73abeed mean-app_default bridge local
d466e75d86fa mean_default bridge local
5e5d9a192c00 none null local
检查网络
您可以运行inspect
命令获取有关网络类型的所有详细信息。它提供关于网络的信息,包括名称、ID、创建时间、范围、驱动程序、配置详细信息(如子网和网关地址)。如果有任何容器正在运行,则还将提供容器详细信息。否则,它将返回一个空字符串。
yaoweibin@yaoweibin:~$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "fec751a6ae21f20a06cdc6eb823e773caec063b6bf9a388016594e59fd1db475",
"Created": "2019-08-01T10:30:27.595054009-04: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,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"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": {}
}
]
创建网络
使用create
命令,您可以创建自己的网络。您需要使用--driver
标志指定驱动程序类型,在下面的示例中,我使用的是bridge类型。
yaoweibin@yaoweibin:~$ docker network create --driver bridge yaoweibin_network
08e0da91f6de6c640b1b6f8a8602973f310b8ee9b04961389b7dfda842ccc409
运行ls命令检查网络是否已创建。
yaoweibin@yaoweibin:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
fec751a6ae21 bridge bridge local
21943b20735d docker_gwbridge bridge local
08e0da91f6de yaoweibin_network bridge local
f51d1f3379e0 host host local
ppp8i7tvrxa0 ingress overlay swarm
ba68f73abeed mean-app_default bridge local
d466e75d86fa mean_default bridge local
5e5d9a192c00 none null local
现在,我将在我创建的网络上运行一个docker容器。在下面的命令中,我运行了一个简单的apache服务器容器。
yaoweibin@yaoweibin:~$ docker run -it -d --network=yaoweibin_network httpd
38a0b0646da1a0045afcf7aa0cd6228b851f74107a6718bb19d599e896df1002
运行inspect命令以检查yaoweibin_network的所有信息。您可以在此inspect输出中找到此次的容器详细信息,容器名称为determined_dubinsky。
yaoweibin@yaoweibin:~$ docker network inspect yaoweibin_network
[
{
"Name": "yaoweibin_network",
"Id": "08e0da91f6de6c640b1b6f8a8602973f310b8ee9b04961389b7dfda842ccc409",
"Created": "2019-09-03T13:56:36.244295204-04:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"38a0b0646da1a0045afcf7aa0cd6228b851f74107a6718bb19d599e896df1002": {
"Name": "determined_dubinsky",
"EndpointID": "30d252720e0f381ba01d6f5414525dff8587abcf3c4920100f112898a52c8a23",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
断开网络
要从容器中断开网络,请运行以下命令。您需要在断开命令中指定网络名称和容器名称。
yaoweibin@yaoweibin:~$ docker network disconnect yaoweibin_network determined_dubinsky
此网络将不再运行 determined_dubinsky 容器;容器字段将为空。
yaoweibin@yaoweibin:~$ docker network inspect yaoweibin_network
[
{
"Name": "yaoweibin_network",
"Id": "08e0da91f6de6c640b1b6f8a8602973f310b8ee9b04961389b7dfda842ccc409",
"Created": "2019-09-03T13:56:36.244295204-04:00",
"Scope": "本地",
"Driver": "桥接",
"EnableIPv6": false,
"IPAM": {
"Driver": "默认",
"Options": {},
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
要创建桥接网络以外的网络,您需要在桥接之外提及驱动程序名称。要创建 overlay 网络,请运行以下命令。
yaoweibin@manager1:~$ docker network create --driver overlay yaoweibin_network_2
ynd2858eu1cngwhpc40m3h1nx
yaoweibin@manager1:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
fec751a6ae21 bridge bridge 本地
21943b20735d docker_gwbridge bridge 本地
08e0da91f6de yaoweibin_network bridge 本地
f51d1f3379e0 host host 本地
ppp8i7tvrxa0 ingress overlay swarm
ba68f73abeed mean-app_default bridge 本地
d466e75d86fa mean_default bridge 本地
5e5d9a192c00 none null 本地
ynd2858eu1cn yaoweibin_network_2 overlay swarm
要创建主机网络,请使用 –driver 标志提及主机。下面的示例返回错误,因为只允许一个 host 网络实例,而这个实例在之前已经运行。因此,此命令不会创建另一个主机网络。
yaoweibin@manager1:~$ docker network create --driver host yaoweibin_network_3
Error response from daemon: 只允许一个 "host" 网络实例
结论
这就是关于 Docker 网络和如何连接、断开、创建和检查 Docker 网络的全部内容。尝试使用这些命令来熟悉 Docker 网络。如果您对学习网络开发感兴趣,请查看这个链接。