草庐IT

【Docker 那些事儿】容器跑不动?网络可不背锅

⁠⁡Edison 2023-09-26 原文

文章目录


🌟 前言

上一篇文章讲了 Dockernone 网络和 host 网络:【Docker 那些事儿】容器数据卷的本手
 
本篇文章将继续承接上一篇,继续深入容器的网络

1. container网络

container 是容器网络中一种较为特殊的网络模式。

这个模式指定新创建的容器和已经存在的容器共享一个网络命名空间,而不是和宿主机共享。

新创建的容器没有自己的网卡、IP 地址等,而是和一个指定的容器共享 IP 地址、端口号等。

这两个容器之间不存在网络隔离,而这两个容器与宿主机以及其他容器之间存在网络隔离。如图所示👇

下面搭建一个 container 网络模型并查看效果,首先创建一个普通容器,示例代码如下:

以上示例创建了一个被命名为 test1BusyBox 容器,此时该容器的网络模式默认为 bridge

创建完成后,在容器终端中查看容器 IP 信息,示例代码如下:

以上示例中,通过查看容器 IP 信息得知该容器 IP 地址为 172.17.0.2

下面创建一个网络模式为 container 的容器,示例代码如下:

以上示例创建了一个被命名为 test-containerBusyBox 容器,它与先前的 test1 容器共享网络空间。

其中,在配置 container 网络时,需要添加与新容器共享网络命名空间的容器名称。

下面在 test-container 容器终端中查看其 IP 信息,示例代码如下:

从以上示例中可以看到,容器 test-container 与容器 test1IP 地址是一样的,但不排除容器 test1 在创建之后自动崩溃,新的容器 test-container 沿用了它的 IP 地址的可能。

下面在宿主机终端中查看容器信息,示例代码如下:

以上示例说明这两个容器已经进行了网络空间共享。此时,两个容器之间已经可以进行通信。

2. 多节点容器网络

Docker 多节点网络模式可以分为两种:一种是 Docker1.19 版本开始引入的基于 VxLANVirtual extensible Local Area Network,虚拟可扩展局域网)的对跨界点网络的原生支持;

另一种是通过插件方式引入的第三方实现方案,如 FlannelCalico 等。

🍑 Overlay网络

Overlay 网络是一种实现设备间联通的虚拟网络,Docker1.19 版本中,增加了对 Overlay 网络的原生支持。

Docker 还支持 ConsuletcdZooKeeper3 种分布式存储。

其中,etcd 是一个支持高可用的分布式存储系统,通常 etcd 处理的数据都是控制数据,应用数据是在数据量很小但更新访问频繁的情况下使用 etcd;而 Consul 作为一个分布式数据库用于保存网络状态信息。

Docker 中,Overlay 网络用于连接不同计算机上的 Docker 容器,允许不同计算机上的容器相互通信,同时支持对消息进行加密;

当用户初始化一个集群或是将容器加入到一个集群中时,在 Docker 主机上会出现两种网络:一种是名为 ingressOverlay 网络,用于传递集群服务的控制或数据消息,若在创建容器集群服务时没有指定连接用户自定义的 Overlay 网络,集群将会加入到默认的 ingress 网络。

另一种名为 docker_gwbridge 的桥接网络会连接容器集群中所有独立的 Docker 系统进程。

Overlay 网络架构如图所示👇

🍑 部署Overlay网络

Overlay 网络环境部署需要准备三台机器,其中一台(192.168.56.135)安装分布式数据库,这里以 Consul 为例,另外两台(192.168.56.144 / 192.168.56.145)创建网络,架构如图所示👇

在 Docker 环境下部署 Overlay 网络之前需要先创建 Consul 数据库,具体步骤如下:

1、三台机器部署 Docker 环境,主机名与 IP 地址如表所示:

2、选择一台作为 Consul 服务器用以安装 Consul,此处以 IP 地址为 192.168.56.135 的服务器为例。

这里直接使用镜像的方式启动 Cousul 容器部署 Consul 服务,示例代码如下:

上述示例在第一台宿主机中运行了一个 Cousul 容器。

下面使用浏览器访问 192.168.56.135:8500,查看 Consul,如图所示👇

3、修改两台机器的 Docker daemon 配置文件,示例代码如下:

以上示例中,–cluster-store 指定 Consul 的地址,–cluster-advertise 告知 Consul 该节点的连接地址,192.168.56.135Consul 主机。

将配置文件配置成功之后,使用重启 Docker 的命令会报错。

需要先将配置文件重新加载,再重启 Docker,示例代码如下:

4、查看 Consul 端信息

用浏览器访问 Consul 主页,在 “KEY/VALUE” 下查看两个节点,这就是自动注册到 Consul 数据库中的节点,如图所示👇

Consul 页面中看到图所示结果,即表示 Consul 分布式数据库搭建完成。

下面开始构建 Overlay 网络。

5、在一台节点主机中创建 Overlay 网络,示例代码如下:

注意,此处的 -d 参数用以指定创建 Overlay 网络。

下面查看网络是否创建成功,示例代码如下:

从以上示例中可以看到,已经成功创建了一个名为 ov-testOverlay 网络。

下面切换到另一台节点主机查看网络信息,示例代码如下:

以上示例中,在另一台节点主机中也能够看到 Overlay 网络。

这是因为网络类型为 global,即同时可以在多台节点主机查看到该网络,创建网络时,主机将信息存入 Consul 中,另一台主机会读取到新网络信息,同时,在主机上对网络的操作会同步到 Consul 中。

6、在网络中运行容器。

Docker-1 中运行一个容器,查看并测试其网络,示例代码如下:

以上示例中,新建容器可以连通外网,并且容器有两个网卡,一个 eth0,连接 Overlay 网络,另一个 eth1,连接主机的 docker_gwbridge,为访问外网的容器提供出口。

在另一台 Docker-2 中运行容器,查看并测试其网络,示例代码如下:

以上示例中,Docker-2 与 Docker-1 中的容器可以 ping 通。

这是因为在同一个 Overlay 网络下的容器使用 eth0 网卡通信,使用 eth1 网卡访问外网。

7、在 Docker-2 主机中创建一个 Overlay 网络,示例代码如下:

以上示例新创建了一个名为 ov-test2Overlay 网络。

在新的网络中创建一个容器,并测试其能否与 ov-test 网络中的容器互通,示例代码如下:

以上示例中,10.0.0.2ov-test 网络中容器的 IP 地址,却无法 ping 通。这是因为不同 Overlay 网络中的容器在正常情况下是无法互相通信的,并且不同 Overlay 网络之间是隔离的。

要让两个 Overlay 网络中的容器通信,可以将其中一个容器连到另一个容器所在的 Overlay 网络中,示例代码如下:

以上示例将 ov-test2 网络中的 test3 容器连接到 ov-test 网络。

下面回到 test3 容器终端,再次尝试连接 ov-test 网络中的容器,示例代码如下:

以上示例中,test3 容器连接到 ov-test 网络中之后,即可 pingov-test 网络中的所有容器。

8、IP 地址管理

Overlay 网络默认分配的子网为 10.0.X.0/24,用户也可以通过 –subnet 指定 IP 地址范围,示例代码如下:

以上示例创建了一个被命名为 ov-test3Overlay 网络,并将其网段指定为 10.8.8.0/24

下面在 ov-test3 网络中创建一个容器,并查看其 IP 地址,示例代码如下:

以上示例中,由于在创建 Overlay 网络时指定了 10.8.8.0/24 的网段,在网络中新建的容器分配到了指定网段的 IP 地址。

3. Macvlan网络

Macvlan 网络可以实现 Docker 容器的跨主机通信。

通过为物理网卡额外添加 MACMedia Access Control,媒体存取控制)地址的形式来复用物理网卡,也就是说 Macvlan 网络直接使用服务器上的网卡让不同主机上的容器进行通信。

创建 Macvlan 网络的原理是,在宿主机物理网卡上虚拟出多个子网卡,通过不同的 MAC 地址在数据链路层(Date Link Layer)进行网络数据转发,如图所示👇

下面通过 docker network create 命令创建网络模式为 Macvlan 的容器网络。

在创建时,用户无须手动为网卡添加 MAC 地址,但是必须明确指定使用的子网掩码(subnet)、网关(gateway)以及所使用的父网卡。

首先,在两台服务器上分别创建 Macvlan 网络,示例代码如下:

以上示例分别在 Docker-1Docker-2 两台服务器上创建了 Macvlan 网络,并指定了 Macvlan 网络的子网掩码与网关。

其中,parent 指定了流量在 Docker 主机上实际通过的接口。

然后分别在主机 Docker-1Docker-2 中的 Macvlan 网络中创建容器,并查看其 IP 地址,示例代码如下:

注意,在 Macvlan 网络模式下创建容器一定要指定 IP 地址,否则容易造成 IP 地址冲突。

最后使用以上两个容器中任意一个容器终端 ping 另外一个容器,测试其连通性,示例代码如下:

从以上示例可以看出,两个容器已经可以互相通信。

4. 小结

本章详细系统地介绍了 Docker 容器的网络结构,包括 none 网络、host 网络、bridge 网络、container 网络以及跨主机容器的网络。
 
相信通过本章的学习能够熟练掌握 Docker 容器网络技术。

有关【Docker 那些事儿】容器跑不动?网络可不背锅的更多相关文章

  1. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  2. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  3. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  4. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

  5. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

    我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

  6. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  7. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

  8. 常见网络安全产品汇总(私信发送思维导图) - 2

    安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un

  9. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  10. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

随机推荐