【Docker】(六)使用network完成容器间的网络通信

news2024/12/25 9:31:31

1.前言

本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章:

(一)基本概念与安装使用
(二)如何使用Docker发布一个SpringBoot服务
(三)使用registry远程镜像仓库管理镜像
(四)使用volume持久化Docker容器中的Redis数据
(五)使用bind mounts修改Docker容器中的Nginx配置

在前边介绍了,得益于使用dockerfile创建镜像文件,registry仓库管理镜像文件,我们可以仅通过docker run这个简单的指令,就能创建容器并启动一个服务,减少了繁琐的安装部署流程。容器之所以能够这么强大,除了上述的镜像文件管理以外,还得意于Dockernetwork机制。

可以想象一下,我们可以将已经创建好的容器看作一个轻量级的OS,如果没有网络通信,这个容器就被变成一个孤岛,没有什么存在的意义。所以在容器与宿主机之间、容器与容器之间,通过network建立了网络通信。

network机制中,提供了容器间的网络通信API,这个API封装了对操作系统网络的操作,我们在使用Docker的时候可以不用在意操作系统层面的网络实现细节。

接下来会介绍如何使用这些API,并以Nginx反向代理为例讲述自定义的network存在的意义。

2.network的驱动类型

Docker中的network实际上是使用的插件机制,即提供核心接口,让不同的插件去实现细节,我们一般将这种实现细节的插件叫做驱动。由用户根据需要选择不同的驱动处理不同的业务场景。

Docker官方提供了几个默认的驱动,下面是不同驱动使用场景:

  • bridge:用在单机多容器需要互相通信的场景,是docker的默认网络驱动。
  • overlay:用于多机多容器的网络通信场景,更多的使用在docker swarm中。
  • host:也是用在单机场景,与bridge的区别在于,host会直接使用宿主机的ip和端口。
  • ipvlan:用于用户需要自行操作ip的场景。
  • macvlan:用于用户需要自行操作mac地址的场景。
  • none:禁用网络,自己玩。

一般来说常用的就是bridgeoverlay驱动,如果上述默认的驱动类型还不满足要求的话,也可以在Docker Hub上找自定义的驱动【自定义网络驱动地址】。

3.网络驱动的使用

3.1.bridge模式

使用docker network指令可以管理网络驱动【network指令文档地址】,在docker安装完毕之后,会创建几个默认的网络驱动,如下:

docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
18baf7cfd864   bridge    bridge    local
06fe786c0c48   host      host      local
6844c7218d3f   none      null      local

我们在输入docker run运行容器,如果不显示的指定驱动,则会使用默认的bridge,但是我们在实际使用时,一般不会选择默认的驱动,而是自行创建一个。

docker network create -d bridge my-bridge

这里的-d是指定驱动类型,默认就是bridge,如果想创建一个bridge类型的驱动的话,指令可以简化为:

docker network create my-bridge

此时再查看network列表,就能看到刚刚创建的驱动了。

docker network ls

NETWORK ID     NAME        DRIVER    SCOPE
18baf7cfd864   bridge      bridge    local
06fe786c0c48   host        host      local
8e449b8833ab   my-bridge   bridge    local
6844c7218d3f   none        null      local

为什么要使用自定义的bridge而不使用默认的呢?

自定义bridge有以下的几点优势:

  • 提供了DNS服务
    可以将容器名映射到容器的ip和端口,使用容器名进行网络访问。
  • 可以更好的做到容器隔离
    可以将一组应用放到同一个bridge中,另一组应用放到另一个bridge中,两组应用互不影响。
  • 可以动态的添加和移除网络驱动
    在容器运行的时候,可以通过docker network connect/disconnect指令,连接或移除某一个自定义的网络驱动,这种方式是不需要重启容器的。如果使用默认的bridge则需要重新创建容器。

接下来,以nginx做服务的反向代理的示例,来感受一下自定义network的优势。

在上一篇《使用bind mounts修改Docker容器中的Nginx配置》 中,已经详细的讲述了如何创建nginx容器,并将配置文件挂接到宿主机中,不知道如何在Docker中使用nginx的同学,可以看一下这篇Nginx配置部分,非常简单。在这个例子中,配置了两个SpringBoot的服务,配置如下:

upstream hello-boot {
    server 192.168.200.101:8080;
    server 192.168.200.101:8081;
}

server {
    listen       80;
    listen  [::]:80;
    server_name  192.168.200.101;

    location /hello {
        proxy_pass http://hello-boot;
    }
    
    access_log  /var/log/nginx/hello-boot.access.log  main;
}

配置中的ip地址192.168.200.101是宿主机所在的ip,两个SpringBoot服务所在的容器,映射了宿主机的端口80808081,此时我们访问nginx时,就可以将请求转发到任意一个服务中。

这种方式虽然可以正常使用,但是占用了宿主机的端口,并且还可能存在端口冲突的问题,所以最好是在upstream中配置容器的ip而不是宿主机的ip,而容器间需要网络通信的话,需要将所有的容器都连接到同一个网络驱动中,现在将Nginx和两个SpringBoot的服务都连接到my-bridge
上面提到了,自定义的bridge可以动态的连接或断开连接,所以可以直接使用connect指令,不需要重新创建容器。

docker network connect my-bridge my-nginx
docker network connect my-bridge hello-1
docker network connect my-bridge hello-2

然后使用inspect指令查看容器的网络情况。

docker network inspect my-bridge

在这里插入图片描述
可以看到my-bridge为各个容器分配的ip地址,我们将hello-1hello-2的ip填充到nginx的配置文件中:

upstream hello-boot {
	server 172.18.0.3:8080;
	server 172.18.0.4:8080;
}

这样就不会占用宿主机的端口了,但又引入了新的问题,这里的ip是由my-bridge动态分配的,在hello-1hello-2重新发布时,有可能会被其他的应用占用ip,导致访问异常。
上面我们提到了,自定义的bridge自带了DNS服务,所以我们可以使用容器名代替ip地址,最终的配置文件修改如下:

upstream hello-boot {
	server hello-1:8080;
	server hello-2:8080;
}

server {
    listen       80;
    listen  [::]:80;
    server_name  192.168.200.101;

    access_log  /var/log/nginx/hello-boot.access.log  main;

	location /hello {
		proxy_pass http://hello-boot;
	}
}

重新加载Nginx并尝试访问:

docker exec -it my-nginx nginx -s reload
curl http://192.168.200.101/hello/sayHello?name=挥之以墨

sayHello方法只做了一个返回,输入了name是什么就返回什么,此时会打印出:

hello 挥之以墨

3.2. host模式

host模式创建的容器,不能指定映射的端口,会使用镜像中已经指定好的端口,例如创建一个host模式的nginx。

docker run -d --network=host --name nginx-host nginx

此时,将会占用宿主机的80端口,尝试访问下:
在这里插入图片描述

4.结语

本篇主要讲述了bridge类型的网络驱动是如何使用的,自定义的bridge相对于默认的bridge的优势所在,即:

  • 自带DNS服务
  • 可以动态的连接容器或断开容器而不需要重启
  • 可以有效的隔离不同的应用组

而对于host类型的网络驱动来说,由于或占用主机的端口,而且不能动态指定端口,很容易端口冲突,我们一般不选择这种使用方式。

overlay类型的驱动,主要是用在多机多容器的网络通信场景,由于管理比较复杂,一般是配合多机容器编排机制 Docker Swarm来使用的,在后续的博客中会继续讲述。

下一篇会讲Docker的单机容器编排技术,Docker Compose。


如果觉得本文对你有所帮助,可以帮忙点点赞哦!你的支持是我更新最大的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12、特征值与特征向量

目录 一、特征值和特征向量的定义 二、特征值和特征向量的相关函数 三、特征值和特征向量的计算 一、特征值和特征向量的定义 假设A是一个nn的矩阵,A的特征值问题就是找到下面方程组的解: 其中,λ为标量,V为矢量,若…

【堆的认识及其优先级队列】java代码实现,保姆级教程学习堆和优先级队列

前言: 大家好,我是良辰丫💞💞⛽,我们又见面了,前面我们讲了用链表实现的二叉树,今天我们来接触堆的概念,堆是一种特殊的二叉树,只不过咱们的对底层原理是数组&#xff0c…

大数据监控平台-Prometheus监控Hadoop

简介 本篇主要是使用jmx配合Prometheus监控大数据平台 前提 链接:https://pan.baidu.com/s/1c6nsjOKw4-a_Wqr82l0QhQ 提取码:yyds --来自百度网盘超级会员V5的分享 先安装好Prometheus Flink(Pometheus监控)_顶尖高手养成计划的博客-CSDN博客_${en…

金融实践 | 信创存储 打造安全可控的金融数据底座

本文刊登于《金融电子化》杂志 2023 年 1 月上,作者为中国出口信用保险公司信息科技部张倩,曲文非,庞松松,康达。 2022 年初,中国人民银行《金融科技发展规划(2022—2025 年)》和银保监会《关于…

JAVA语言实验 实验 ( 二 )

JAVA语言实验 :实验 ( 一 ) JAVA语言实验 :实验 ( 二 ) JAVA语言实验 :实验 ( 三 ) 一、实验目的 (1)熟悉 Java 图形界面的基本设计。 (2)熟悉 Java 界面的菜…

【LeetCode每日一题】【2023/1/31】2319. 判断矩阵是否是一个 X 矩阵

文章目录2319. 判断矩阵是否是一个 X 矩阵方法1:直接遍历2319. 判断矩阵是否是一个 X 矩阵 LeetCode: 2319. 判断矩阵是否是一个 X 矩阵 简单\color{#00AF9B}{简单}简单 如果一个正方形矩阵满足下述 全部 条件,则称之为一个 X 矩阵 : 矩阵对…

spring boot文档阅读笔记——02

spring boot文档阅读笔记——01 目录标题一、日志(一)slf4j logback(spring boot默认方式)1. 获取日志对象方式:2. 设置日志级别:3. 设置日志格式:4. 输出到日志文件:5. 日志文件设置…

关于python的mediapipe库踩过的坑

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页:lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/lbcyllqj?spm1000.2115.3001.5343 哔哩哔哩欢迎关注&…

Nginx 常用配置汇总!

众所周知,Nginx 是 Apache服务不错的替代品。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力在同类型的网页服务器中表现较好,因此国内知名大厂例如:淘宝,京东,百度,新浪&a…

1.10 golang 切片Slice

1. 切片Slice 需要说明,slice 并不是数组或数组指针。它通过内部指针和相关属性引用数组片段,以实现变长方案。 1. 切片:切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。2. 切片的长度可以改变…

零基础机器学习做游戏辅助第六课--猫狗数据集认识卷积神经网络(二)

一、初识卷积 上一课我们已经将图像数据进行了预处理,这节课的重点就是学习卷积神经网络,到底什么是卷积,我们看图 input是我们输入的图像,Kernel是我们设置的3x3卷积核,卷积层将图像和卷积核进行计算提取特征输出神经元。

代码随想录算法训练营第35天 回溯算法 java :455.分发饼干 376. 摆动序列53. 最大子序和

文章目录贪心算法思路LeetCode 455.分发饼干题目详解LeetCode 376. 摆动序列题目详解思路示图LeetCode 53. 最大子序和题目详解思路示图总结贪心算法思路 以局部最优带动全局最优 LeetCode 455.分发饼干 题目详解 我做的是采用 优先满足胃口的思路。 对每个孩子 i&#xff…

【c#系列】PDF进行操作-浏览、分割、合并、插入、删除(2)

这节我们主要实现缩小、旋转、打印、分割、合并、放大等功能 1、 放大功能 单击放大按钮,实现PDF放大预览,效果如下: 设计代码: System.Windows.Forms.ToolStripButton FangDaBT_Tool;FangDaBT_Tool new System.Windows.Form…

GBase GCDW云数仓阿里云版免费试用来了!

GBase GCDW云原生数据仓库(GCDW)在阿里云计算巢上提供免费试用了!简单 3 步,即可获得一个免费试用的GCDW服务实例,您可以定制该服务实例的云主机规格和数据库计算服务节点数等实例参数,该免费试用支持的数据…

LabVIEW NI CompactRIO控制器:性能和吞吐量基准测试

LabVIEW NI CompactRIO控制器:性能和吞吐量基准测试CompactRIO控制器基于LabVIEW RIO架构,采用了功能强大的64位Intel Atom E3800片上系统(SoC)和Xilinx Kintex7 FPGA等最新技术。Intel Atom SoC提供了极高的性能和丰富的功能,包括集成式GPU和…

数据结构实验二 :二叉树的操作与实现

数据结构实验一:线性表,堆栈和队列实现 数据结构实验二 :二叉树的操作与实现 数据结构实验三: 图的操作与实现 数据结构实验四 : 查找和排序算法实现 文章目录一、实验目的:二、使用仪器、器材三、实验内容及原理1、教材P247实验题1:实现二叉树的各种基本…

Mybatis 笔记

一、mybatis简介 1.1 框架概念 软件的半成品,完成软件开发过程中的通用操作,实现特定的功能,从而简化开发人员在软件开发中的步骤,提升开发效率。 1.2 常用框架 MVC框架:简化servlet的开发步骤,与前端交…

java实现oracle和mysql的group by分组功能|同时具备max()/min()/sum()/case when 函数等功能

一、前言oracle和mysql的group by 分组功能大家应该清楚,那如何使用java实现同样的功能呢比如下面这个表idnameagemathEnglish10yujianlin2092.5103ww84102520102611036310351020我们需要按id分组,求最大age和math累计成绩我们的sql应该这样写select id,…

Linux下的安装环境

目录 软件安装常识 Linux软件安装生态 Linux软件生态的本土化 yum的三板斧:查找、安装、卸载 yum补充的3个小知识 软件安装常识 我们知道Linux下有一条命令可以下载安装指令,那就是yum。在了解yum之前得先说一下Linux的整体安装环境。 Linux下用y…

每日学术速递2.1

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.Cv 1.SeaFormer: Squeeze-enhanced Axial Transformer for Mobile Semantic Segmentation 标题:SeaFormer:用于移动语义分割的挤压增强型轴向变换器 作者: Qian…