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

网络在Docker的技术体系中,是一个不容易搞清楚的要点。因此,希望您读完本文之后,对 Docker 网络有一个通透的理解。

网络定义

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

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

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

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

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

节点与节点连接起来,就组成网络。中心节点对(网络)内起着与其他终端节点沟通的作用,对(网络)外起着与外部连接的功能,甚至是连接外部的唯一通道。

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

Docker 网络

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

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
  1. 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原创发布,转载请注明出处。

Docker 网络解读的更多相关文章

  1. 【转】Docker网络详解及pipework源码解读与实践

    好文必转 原文地址: http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-prac ...

  2. 深入解读docker网络与kubernetes网络

    前言:你是否学习使用k8s很久很久了可是对于网络这块仍旧似懂非懂呢? 您是否对网上一堆帖子有如下的抱怨: 打开多个博客,然后发现有区别么? 明显是直译过来的,越看越迷糊 “因为xxx,所以yyy”,. ...

  3. Docker 网络详解及 pipework 源码解读与实践

    转载自:https://www.infoq.cn/article/docker-network-and-pipework-open-source-explanation-practice/ Docke ...

  4. Docker网络解决方案-Flannel(转)

    转自https://www.cnblogs.com/kevingrace/p/6859114.html Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Ope ...

  5. 理解Docker(5):Docker 网络

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  6. docker网络配置方法总结

    docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...

  7. Docker网络模式

    [编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...

  8. docker网络-如何让外部网络访问容器资源

    docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...

  9. docker网络解析

    Docker概念和默认网络 什么是Docker网络呢?总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器.具体来说,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会通过容 ...

随机推荐

  1. 创建react项目并集成eslint/prettier/commit-lint

    创建 react 项目 npx create-react-app jira-new --template typescript 如果不想使用 TS,而要用 JS 的话,则删除 -template ty ...

  2. java变量及常量

    变量 本质:就是代表一个"可操作的存储空间",空间位置是确定的,但是里面放置什么值不确定.我们可通过变量名来访问"对应的存储空间",从而操纵这个"存储 ...

  3. 扩展ADO.net实现对象化CRUD(.net core/framework)

    扩展ADO.net实现对象化CRUD(.net core/framework) 安装nuget包:CRL using CRL; 实现数据操作 获取数据访问连接IDbConnection dbConne ...

  4. javascript的getTime函数

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...

  5. 《机器学习Python实现_10_10_集成学习_xgboost_原理介绍及回归树的简单实现》

    一.简介 xgboost在集成学习中占有重要的一席之位,通常在各大竞赛中作为杀器使用,同时它在工业落地上也很方便,目前针对大数据领域也有各种分布式实现版本,比如xgboost4j-spark,xgbo ...

  6. Centos ulimit设置

    1.三处配置 1. 系统编译时默认设置文件(centos7新增) 服务配置 /etc/systemd/system.conf 用户配置 /etc/systemd/user.conf 2. PAM模块配 ...

  7. 关于.Net Core使用Elasticsearch(俗称ES)、Kibana的研究说明

    关于ElasticSearch Elasticsearch是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本.数字.地理空间.结构化和非结构化数据.Elasticsearch 在 Apa ...

  8. Vsftpd虚拟用户登陆配置(Centos7)

    1 安装Vsftpd服务 # yum install vsftpd -y vsftp虚拟用户是为了保证FTP服务器的安全性,由vsftpd服务器提供的非系统用户账号, 相对于FTP的本地用户来说,虚拟 ...

  9. bcprov-jdk15-145.rar

    javapdf文件操作,加密包 bcprov-jdk15-145.rar https://files.cnblogs.com/files/blogs/692137/bcprov-jdk15-145.r ...

  10. bugKu管理员系统

    先F12看看,有啥发现的,发现一段注释... 感谢那个群友分享了怎么辨别base64编码,通常是A-Z,a-z,0-9,+,/,=.最后通常有0个到2个等号,我也成功用在线解码器,确实是base64编 ...