Docker单机网络:解锁本地开发环境的无限潜能

  •  作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
  •  座右铭:   云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
  •  个人主页:团儿.-CSDN博客

目录

前言:

正文:

docker 网络

    这里我们先讨论docker的单主机网络模式,它包括以下4类:

1.1 host

1.2 bridge

1.3 none

1.4 joined-container

2、容器互联(自定义局域网络****)

我们为什么需要自定义网络?

如何自定义网络?

2.1 我们可以通过 docker network create 自定义一个网络

自定义网络:

(1)自定义网络

(2)查看容器网络

接下来,我们启动两个容器,并将其放入我们自定义的网络中

// 1、启动centos01 

// 2、启动centos02    

// 3、查看 tigerNet 网络中的变化

#ping一下两个容器

// 1、centos02 ping centos01 可ping通

// 2、centos01 ping centos02 可ping通

2.2、容器互联(局域网络之间的联通****)

现在构建两个局域网

在 tigerNet 中启动 centos01 和 centos02(2.1中已实现)

在 studiousNet中启动centos03 和 centos04

现在我们来打通局域网与容器之间的通信

我们ping一下试一下

// 1、 centos01 ping centos04 可ping通

// 2、 centos01 ping centos03 测试

3.容器互联(Redis集群实战****)

3.1集群搭建

先下载redis包,使用docker load  -i 导入

① 创建一个redis网络

② 编写 redis.conf 文件

进02,03,04,05,06中修改ip

③ 启动6个redis容器

④ 随便进入一个容器,并创建一个redis集群

⑤ 进入集群,并查看集群信息

⑥ 集群高可用测试

将对应的容器停掉

查看name值(集群搭建成功)

修复 

若02想要回到一开始的主,声明一下即可 


前言:

在当今的软件开发领域,容器化技术以其轻量级、可移植性和高效性,成为了推动应用交付和部署变革的重要力量。而Docker,作为容器化技术的杰出代表,更是凭借其强大的功能和简便的操作,赢得了广大开发者和运维人员的青睐。

在Docker的众多特性中,单机网络(也称为单节点网络)是一个尤为重要的功能。它不仅允许我们在单个Docker主机上创建和管理复杂的网络拓扑结构,实现容器间的互联互通,还为开发者提供了一个高度可控、隔离且安全的本地开发环境。

本文档将深入探讨Docker单机网络的原理、配置方法和实际应用。从基础的网络模式介绍,到高级的网络配置技巧,再到实际场景中的问题解决,我们力求为读者呈现一个全面、系统且实用的知识体系。

无论你是Docker的初学者,还是有一定经验的开发者,都将在本书/本文档中找到适合自己的内容。我们希望通过我们的努力,帮助大家更好地掌握Docker单机网络的技术,从而在实际开发中发挥出更大的潜力。

让我们一同踏上这段探索Docker单机网络的旅程,共同开启软件开发的新篇章!


正文:

docker 网络

1、
    当你开始大规模使用Docker时,你会发现需要了解很多关于网络的知识。
    Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。
    然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。
    因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

    这里我们先讨论docker的单主机网络模式,它包括以下4类:

        host
        bridge
        none
        joined-container
    查看网卡模式命令:
        docker  network ls

1.1 host

    类似于VMware的桥接模式,但没有独立ip;
    
    docker不会为容器创建独有的network namespace;

    使用宿主机的默认网络命名空间,共享一个网络栈;

    表现为容器内和宿主机的IP一致;

    这种模式用于网络性能较高的场景,但安全隔离性相对差一些。

    命令:创建网络为host的容器
    

1.2 bridge

    桥接模式,有点类型VM-NAT,dockerd进程启动时会创建一个docker0网桥,容器内的数据通过这个网卡设备与宿主机进行数据传输。

    docker会为容器创建独有的network namespace,也会为这个命名空间配置好虚拟网卡,路由,DNS,IP地址与iptables规则。

1.3 none

none模式可以说是桥接模式的一种特例,docker会为容器创建独有的network namespace ,但不会为这个命名空间准备虚拟网卡,IP地址,路由等,需要用户自己配置。

1.4 joined-container

容器共享模式,这种模式是host模式的一种延伸,一组容器共享一个network namespace;

对外表现为他们有共同的IP地址,共享一个网络栈;

kubernetes的pod就是使用的这一模式。


关于跨主机的docker网络通信,包含overlay、macvlan,又包含calico、flannel、weave等方案,不过跨主机的docker网络管理更多的是交给kubernetes或swarm等编排工具去实现了。


2、容器互联(自定义局域网络****)

我们为什么需要自定义网络?

将容器放在自定义的网络(数据局域网)中,容器之间是可以相互通信的,这样的话,我们就不需要使用 --link(旧技术,已淘汰) 来实现通信了。

如何自定义网络?

查看容器网络docker network ls,容器启动时默认的网络是bridge(桥接)模式(即,容器启动时默认是存在--net bridge)


2.1 我们可以通过 docker network create 自定义一个网络

自定义网络:
(1)自定义网络
 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 tigerNet
(2)查看容器网络
docker network ls

接下来,我们启动两个容器,并将其放入我们自定义的网络中
// 1、启动centos01 

          --net tigerNet  将容器发布到我们自定义的网络中去    

docker run --name centos01 -itd --net tigerNet centos:latest
// 2、启动centos02    
docker run --name centos02 -itd --net tigerNet centos:latest
// 3、查看 tigerNet 网络中的变化
    docker network inspect tigerNet

#ping一下两个容器
// 1、centos02 ping centos01 可ping通
docker exec -it centos01 ping centos02

 

// 2、centos01 ping centos02 可ping通
docker exec -it centos02 ping centos01

 

2.2、容器互联(局域网络之间的联通****)

有这么一个需求,我们希望一个局域网中的容器可以与另一个局域网中的容器进行通信,如下:

现在构建两个局域网
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 tigerNet
docker network create --driver bridge --subnet 192.167.0.0/16 --gateway 192.167.0.1 studiousNet

在 tigerNet 中启动 centos01 和 centos02(2.1中已实现)
在 studiousNet中启动centos03 和 centos04
docker run --name centos03 -itd  --net studiousNet centos:latest
docker run --name centos04 -itd  --net studiousNet centos:latest
现在我们来打通局域网与容器之间的通信

docer给我提供了docker network connect命令,可以实现打通局域网与容器之间的通信

将 centos04 添加到 tigerNet 中,我们可以发现原来 docker 是给 centos04 设置了双IP

docker network connect tigerNet centos04
docker network inspect tigerNet

            // 1 我们可以看到tomcat01已经被加到tigerNet中去了

我们ping一下试一下
// 1、 centos01 ping centos04 可ping通
docker exec -it centos01 ping centos04


// 2、 centos01 ping centos03 测试
docker exec -it centos01 ping centos03

3.容器互联(Redis集群实战****)

3.1集群搭建

先下载redis包,使用docker load  -i 导入

通过网盘分享的文件:redis.tar
链接: https://pan.baidu.com/s/1NQeVDycq8Ms8nQzlMA5fDg 提取码: 1jkw

改名:

docker tag redis:5.0.10 redis
① 创建一个redis网络
docker network create redis --subnet 172.38.0.0/16

② 编写 redis.conf 文件

我们打算,使用数据卷挂载 redis 中的redis.conf,所以我们需要宿主机上提前配置到redis集群的配置文件

mkdir -p /home/redis/node0{1..6}/data
vim /home/redis/node01/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.11
cluster-announce-bus-port 16379
appendonly yes
cd /home/redis/node01/
cp redis.conf ../node02/
cp redis.conf ../node03/
cp redis.conf ../node04/
cp redis.conf ../node05/
cp redis.conf ../node06/
进02,03,04,05,06中修改ip
vim ../node02/redis.conf 
cluster-announce-ip 172.38.0.12

3,4,5,6同上

③ 启动6个redis容器
docker run --name redis01 -p 6371:6379 -p 16371:16379 \
-v /home/redis/node01/data:/data  \
-v /home/redis/node01/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis redis-server /etc/redis/redis.conf

docker run --name redis02 -p 6372:6379 -p 16372:16379 \
-v /home/redis/node02/data:/data  \
-v /home/redis/node02/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis redis-server /etc/redis/redis.conf

docker run --name redis03 -p 6373:6379 -p 16373:16379 \
-v /home/redis/node03/data:/data \
-v /home/redis/node03/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis redis-server /etc/redis/redis.conf


docker run --name redis04 -p 6374:6379 -p 16374:16379 \
-v /home/redis/node04/data:/data \
-v /home/redis/node04/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis redis-server /etc/redis/redis.conf


docker run --name redis05 -p 6375:6379 -p 16375:16379 \
-v /home/redis/node05/data:/data  \
-v /home/redis/node05/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis redis-server /etc/redis/redis.conf


docker run --name redis06 -p 6376:6379 -p 16376:16379 \
-v /home/redis/node06/data:/data \
-v /home/redis/node06/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis redis-server /etc/redis/redis.conf
④ 随便进入一个容器,并创建一个redis集群
docker exec -it redis01 /bin/bash
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

⑤ 进入集群,并查看集群信息
redis-cli -c cluster nodes

redis-cli -c cluster info 


⑥ 集群高可用测试

存入一个name值到redis集群中,查看

set k1 1

将对应的容器停掉
docker stop redis02
查看name值(集群搭建成功)
get k4

修复 
docker start redis02

若02想要回到一开始的主,声明一下即可 


期待您的关注~ 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang 八股(持续补充...)

目录 进程、线程、协程 Go语言——垃圾回收 GC的触发条件 GC调优 GMP调度和CSP模型 Groutine的切换时机 Goroutine调度原理 Goroutine的抢占式调度 Context结构原理 Context原理 Golang内存分配机制 竞态、内存逃逸 golang内存对齐机制 golang中new和make的区别&a…

手机中的核心SOC是什么?

大家好,我是山羊君Goat。 常常听说CPU,中央处理器等等的,它是一个电脑或单片机系统的核心,但是对于SOC可能相比于CPU了解的人没有那么广泛。 所以SOC是什么? SOC全称是System on Chip,就是片上系统&#…

绿虫光伏设计系统:清洁能源的未来

煤炭、石油、天然气是我们现在依赖的重要能源,但这些能源难以再生,而且开采过程中会产生污染。太阳能发电作为清洁能源的一种重要形式,受到了越来越多的关注。绿虫光伏发电系统,不仅考虑到其发电效率,还可以考虑其经济…

R语言 | ComplexHeatmap 画注释若干基因的热图 //todo

一般顺序: 先用 pheatmap 聚类再用 ComplexHeatmap 做可视化:添加顶部、左侧聚类颜色,显示若干代表性基因 genec("Gene18", "Gene19", "Gene7","Gene3", "Gene9", "Gene15") …

springmvc的简介

SpringMVC的介绍与第一个程序的开发步骤 1. 介绍 SpringMVC是一个实现了MVC架构模式的Web框架,底层基于Servlet实现。 SpringMVC已经将MVC架构模式实现了,因此只要我们是基于SpringMVC框架写代码,编写的程序就是符合MVC架构模式的。&#x…

Java Web 4 Maven

本文详细介绍了Maven的用途,包括依赖管理、项目结构统一和构建流程标准化;然后讲解了Maven的安装、IDEA中的集成以及依赖管理的核心概念。 1 什么是Maven? 什么是apache? 2 Maven的作用 (1)方便依赖管理 有…

基于SpringBoot+Vue的宠物咖啡馆系统-无偿分享 (附源码+LW+调试)

目录 1. 项目技术 2. 功能菜单 3. 部分功能截图 4. 研究背景 5. 研究目的 6. 可行性分析 6.1 技术可行性 6.2 经济可行性 6.3 操作可行性 7. 系统设计 7.1 概述 7.2 系统流程和逻辑 7.3 系统结构 8. 数据库设计 8.1 数据库ER图 (1)宠物订…

flex: 1 display:flex 导致的宽度失效问题

flex: 1 & display:flex 导致的宽度失效问题 问题复现 有这样的一个业务场景,详情项每行三项分别占33%宽度,每项有label字数不固定所以宽度不固定,还有content 占满标签剩余宽度,文字过多显示省略号, 鼠标划入展示…

利用tablesaw库简化表格数据分析

tableaw是处理表格数据的优秀工具。它提供了一组强大而灵活的功能,使操作、分析和可视化数据表变得容易。在这篇博文中,我们将介绍tableaw的主要特性、如何使用这些特性,以及如何使用tableaw处理表格数据的一些示例。 tablesaw简介 tableaw…

【看海的算法日记✨优选篇✨】第二回:流动之窗,探索算法的优雅之道

🌈 个人主页:谁在夜里看海. 🔥 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 一、算法思想 双指针 滑动窗口 二、具体运用 1.⻓度最⼩的⼦数组 算法思路 算法流程 代码 2.最⼤…

MicroBlaze软核开发(一):Hello World

实现功能:使用 MicroBlaze软核 串口打印 Hello World Vivado版本:2018.3 目录 MicroBlaze介绍 vivado部分: 一、新建工程 二、配置MicroBlaze 三、添加Uart串口IP 四、生成HDL文件编译 SDK部分: 一、导出硬件启动SDK 二、…

camera驱动开发(初学)

camera驱动开发 初学camera驱动开发 随笔记一下顺便整理一下初学的学习路线。内容来源于各大网站,大自然的搬运工。 一、camera基本概念 ①三路电压 camera包含的三路电压为模拟电压(VCAMA),数字电压(VCAMD&#x…

在Ubuntu22.04.5上安装Docker-CE

文章目录 1. 查看Ubuntu版本2. 安装Docker-CE2.1 安装必要的系统工具2.2 信任Docker的GPG公钥2.3 写入软件源信息2.4 安装Docker相关组件2.5 安装指定版本Docker-CE2.5.1 查找Docker-CE的版本2.5.2 安装指定版本Docker-CE 3. 启动与使用Docker3.1 启动Docker服务3.2 查看Docker…

C# 编程效率提升指南:掌握算数运算、循环与方法封装

在这篇文章中将带你深入探索C#中的几大关键技术点,从如何精准进行算数运算、灵活运用循环控制结构,到通过方法封装提升代码的复用性,再到正确使用可空类型避免潜在的空值引用异常,这些概念和技巧无一不是编写清晰、高效、健壮代码…

常见Linux命令(详解)

文章目录 常见Linux命令文件目录类命令pwd 打印当前目录的绝对路径ls 列出目录内容cd 切换路径mkdir 建立目录rmdir 删除目录touch 创建空文件cp 复制文件或目录rm 移除文件或者目录mv 移动文件与目录或重命名cat 查看文件内容more 文件分屏查看器less 分屏显示文件内容head 显…

html+css网页设计 旅游 马林旅行社3个页面

htmlcss网页设计 旅游 马林旅行社3个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&#…

【目标跟踪】AntiUAV600数据集详细介绍

AntiUAV600数据集的提出是为了适应真实场景,即无人机可能会随时随地出现和消失。目前提出的Anti-UAV任务都只是将其看做与跟踪其他目标一样的任务,没有结合现实情况考虑。 论文链接:https://arxiv.org/pdf/2306.15767https://arxiv.org/pdf/…

网络——HTTP与HTTPS三次握手和四次挥手

HTTP协议本身并不直接处理TCP连接的建立和关闭,这些是由底层的TCP协议来完成的。但是,由于HTTP通常运行在TCP之上,因此理解TCP的三次握手(用于建立连接)和四次挥手(用于关闭连接)对于理解HTTP通…

Issue id: AppLinkUrlError 应用intent-filter 配置深链接 URL 问题分析 | AndroidManifest

AndroidManifest.xml 配置文件中&#xff0c;对 activity 组件进行声明的时候&#xff0c;独立应用在 IDE 显示 intent-filter 报错&#xff0c;但不影响实际编译&#xff0c;因为是系统应用&#xff0c;肯定会有此 URL 的存在。 AOSP 源码&#xff1a; <activity android:…

Scala中的正则表达式

它是一种强大的文本处理工具&#xff0c;通过定义一系列的字符和操作符组合来描述这些模式。简单来说&#xff0c;它就像一种文本模式的“配方”。 package test9object test9_1 {//正则表达式def main(args: Array[String]): Unit {//定义一个正则表达式//1.[ab]:表示匹配一个…