Docker 网络进阶

Docker 容器在运行时,会涉及多个容器相互链接,甚至与宿主机上的应用链接的问题。既然须要产生链接,那么就必然要依赖网络。

网络在Docker的技术体系中,是一个不容易搞清楚的要点。所以,但愿您读完本文以后,对 Docker 网络有一个通透的理解。php

网络定义

首先,咱们花几分钟的时间,回顾网络是什么。web

网络不只仅是计算机术语,在咱们的生活中,网络无处不在。docker

任何一个被称之为网络的事物都是由“终端节点+中心节点”组成。若是多个小的网络联合起来,就组成了大网络。
shell

  • 在计算机网络中这个中心节点可被称之为:网桥或交换机或HUB。
  • 在快递业网络中这个中心节点可被称之为:转运中心或中心仓
  • 在人际关系网络这个中心节点可被称之为:核心人物或有影响力的人
  • 在陆地的水网中这个中心节点可被称之为:湖泊或多河交汇处
  • 在太阳系网络中这个中心节点能够被成为:太阳

这里有一个概念值得注意,不论是是终端节点仍是中心节点,它们都是节点。即它们的“物理属性”是一个层面,而逻辑上的分工又不是一个层面。安全

节点与节点链接起来,就组成网络。中心节点对(网络)内起着与其余终端节点沟通的做用,对(网络)外起着与外部链接的功能,甚至是链接外部的惟一通道。服务器

其实,只要可以分辨清楚哪些是终端节点,哪些是中心节点,就彻底从宏观上把握住了网络。剩下的,就是搞清楚它们之间的数据流向。网络

Docker 网络

为了了解 Docker 网络,咱们先在已经运行 Docker 的主机上运行一条命令spa

docker network ls
[root@iZ8vb7iZ ~]# docker network ls
NETWORK ID          NAME                      DRIVER              SCOPE
06008f57697f        blogwebsoft9com_default   bridge              local
f13768fd7a20        bridge                    bridge              local
7d6412aa6e40        host                      host                local
e5e6049b8d9f        none                      null                local
29eae24dae84        portainer_default         bridge              local
b286f40bc93d        websoft9com_default       bridge              local

以上显示的就是 Docker 管辖的全部中心节点网卡(先不称之为网络)名称。而容器内部也有网卡,但不会在此命令中列出。计算机网络

网卡也被称之为网络接口

Docker 的网络中,每个运行中的容器就是网络中的终端节点,这个很好理解。设计

那么谁是 Docker 网络的中心节点呢?

要正确理解这个问题,先熟悉一个 Docker 网络相关的设计:在安装 Docker 时,Docker 会自动建立三个(虚拟)中心节点网卡,同时宿主机上建立一个名称为 docker0 的(虚拟)中心网卡。

下面分别介绍 Docker 内部的三个网卡:

1.Bridge 网卡(默认):若是建立容器的时候选择链接此网卡,Docker 会为每个容器分配、设置IP等,并经过宿主机的 docker0 网卡与外部通讯。

sudo docker run -it  phpmyadmin

2.host 网卡:若是建立容器的时候选择链接此网卡,Docker 不会为容器建立网卡和IP地址,而是直接使用宿主机的IP和端口。

sudo docker run -it --net="host" phpmyadmin

3.None 网卡:若是建立容器的时候选择链接此网卡,则觉得着 Docker 关闭了容器的网络功能。

若是您读到此处,仍然只知其一;不知其二,我想可能须要向您澄清一些概念。

网卡、中心节点和网络

网络上绝大部分关于 Docker 网络相关的博客,都没有仔细斟酌网络这个词的用法,不应出现“网络”的地方错用了这个词,很容易让读者没法理解本质。

因此咱们再回顾一次:

  • 网卡:用户与外部通讯的计算机网络组建,它能够是虚拟的,也能够是物理上存在看得见的网卡。在如今这个软件定义网络的时代,网卡通常都是虚拟的。但不论是哪一种形式的网卡,经过ifconfig命令查看,可知其格式基本一致
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:f6ff:fead:46  prefixlen 64  scopeid 0x20<link>
        ether 02:42:f6:ad:00:46  txqueuelen 0  (Ethernet)
        RX packets 2831  bytes 2150398 (2.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2406  bytes 682422 (666.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.26.72.241  netmask 255.255.240.0  broadcast 172.26.79.255
        inet6 fe80::216:3eff:fe0a:e07c  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:0a:e0:7c  txqueuelen 1000  (Ethernet)
        RX packets 1146393  bytes 760158453 (724.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 836693  bytes 355058824 (338.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 中心节点:网卡中有一种特殊网卡,咱们称之为中心节点网卡或网桥,其余的网卡都与之相连,由它负责内部网卡之间的通讯和外部的通讯出口中转。
  • 网络:多个网卡之间经过某种形式组合起来,能够按设计进行通讯,就造成了网络。网络通常采用“中心节点+多个终端节点”的组网模式。

端口

容器中端口与服务器的端口是一个概念。

端口即应用程序在网卡中占用的访问通道。例如:一个容器中安装了 Apache 和 MySQL 两个软件,而这个容器只有一个虚拟网卡,如何保证两个软件均可以被外界访问又互不干扰?

计算机的设计者会给网卡虚拟不少访问通道,并给与从0到65535的数字编号,这个编号就是端口。须要用到网络通道的软件能够配置不一样的数字编号,好比:Apache 使用 80 端口,MySQL 使用 3306 端口。

拿一个真实世界的例子可能更有助于理解端口。

好比去一栋办公大楼(只有一个门牌地址),如何保证各类不一样的人群安全有序的进出?

通常来讲,管理很是规范的办公楼可能会有:员工通道(001号门)、访客通道(002号门)、消防通道(003号门)、物流通道(004号门)等各类不一样的门,不一样的人群经过不一样的通道进出,其中每个门就至关于一个端口。

外网访问

理解了上面的 Docker 网络模式以后,在设置 Docker 容器被外网访问就变得很是简单。
常见的容器通讯常见包括:

  • 容器之间通讯
  • 容器与宿主机通讯
  • 容器直接与外部网络通讯

常见问题

容器互联 -link 有什么做用?

用于在两个容器之间建立一个之间链接的虚拟通道(在 /etc/hosts 文件中增长被链接的容器名称和IP信息),而没必要经过网桥链接。

能够直接修改 iptable 实现容器的外网访问控制吗?

能够,可是比较复杂。

建立容器的时候,不指定容器的网卡名称系统会自动命名吗?

会。通常以当前目录文件夹名称+default,例如:blogwebsoft9com_default 这个网卡的名称来源于在blog.websoft9.com目录下基于 docker-compose 建立容器。

docker-compose 启动容器(组)会自动建立中心网卡吗?

会。

docker run 启动容器会自动建立网卡吗?

不会,默认使用已经存在的 bridge。

docker network ls 查看到的网卡与宿主机下 ifconfig 有什么联系?

docker network ls 查看到的网卡也会被显示到宿主机下。

本文由 Websoft9原创发布,转载请注明出处。
相关文章
相关标签/搜索