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的三个组件是沙盒、端点和网络:

  1. 沙盒:沙盒是容器的网络配置的容器。在容器内部,它作为一个网络堆栈工作。
  2. 端点:端点是一个网络的接口,通常成对出现。我们通过将一端放入所选网络,将另一端放入沙盒中来配置这对端点。此外,端点只加入一个网络,而单个网络沙盒可能包含多个端点。
  3. 网络:它由具有直接通信能力的一组端点组成。

在沙盒中,即使存在多个端点,每个端点也只能有一个网络连接。网络是几个或多个相互连接的端点的分组。

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 网络。如果您对学习网络开发感兴趣,请查看这个链接。

合作作者:Surobhi.

类似文章