Docker补充知识点--自定义网络实现直连容器

news2024/12/23 20:48:15

前面介绍docker镜像的秘密这篇知识点的时候,https://blog.csdn.net/dudadudadd/article/details/128200522,提到了docker容器也有属于自己的IP的概念,默认的Docker容器是采用的是bridge网络模式。并且提到了一嘴自定义网卡配置,本来是打算不写这篇博文,让大家自己去查的,因为命令中有一个CIDR值要有点网络基础,要不然配不明白。

到最近机缘巧合之下,和朋友说起这个事情,灵光一闪想到原理虽然复杂,但是可以只说表象就够用了,所以决定补充一篇docker容器自定义网卡配置让其他设备可以直接访问容器。

首先我们要知道,docker容器的网络配置自带了三种模式,除了默认的bridge模式之外,还有其他的,我们可以用命令查看当前docker有几种网络模式。

[root@hdp3 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
e8e4f692235d        bridge              bridge              local
4d563e307658        host                host                local
7bfee5177ee6        none                null                local

上面的查询主要是为了让大家有docker网络模式这个概念。我们自定义网络,不用自带的,因为自带的bridge,相当于VMware的NAT,可出于某种不可描述的原因,导致它和不指定网络模式创建的容器中的bridge模式存在DNS有无的差异,就是说上面通过命令查出来的bridge网络模式是有DNS的,而你不指定网络模式创建的容器中所使用的bridge网络模式是没有DNS功能的,这点就很诡异。host模式,很少使用,它是指容器完全没有自己的网络配置,直接使用宿主机的网卡,这种网络模式如果你只是使用容器做IP映射可以用一用,其他更灵活的使用方式根本不考虑这种网络模式。最后一个nono是预留的空网络无法使用。

而我们自定义网络模式的时候用的是macvlan模块(DRIVER),这是docker后期版本中提出的一种新型的网络模块,可以提供更加灵活的网络。

配置的时候,你需要先运行下面的命令,创建一个网络模式。注意网络策略用宿主机的。注意,从实现上来说,完全可以使用自定义网络模式,配置其他网段,但是那样就和bridge一样的效果了,没有再自定义的意义

docker network create  clu --driver macvlan --subnet=192.168.88.0/24 --gateway=192.168.88.2 -o macvlan_mode=bridge -o parent=ens33

clu:这个是你的网络模式名字,你可以自定义
--driver macvlan:使用macvlan网络模块
--gateway:该网络模式使用的网关
-o:是详情配置,上面命令是指基于bridge模式,并继承宿主机的网卡,ens33是你宿主机的网卡名
--subnet:是最特别的一个配置,它的值要求是CIDR格式,最后我再说怎么写这个配置

当你创建好了网络模式,你就可以查询到了

[root@hdp3 ~] docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
e8e4f692235d        bridge              bridge              local
2cd5c6656669        clu                 macvlan             local
4d563e307658        host                host                local
7bfee5177ee6        none                null                local

当你创建容器的时候你要使用如下命令

docker run -it --net clu --ip 192.168.88.191 centos:7.8.2003

--net:指定网络模式
--ip:是给容器一个IP,其实可以在不指定用随机的,还可以在创建网络模式的时候用–ip-range参数限制随机的ip范围,但是正式使用都是静态IP

上面这种命令创建容器之后,该容器就和你的宿主机所在同一网段,并且可以被其他的设备直接发现,比如我在本地Windows上ping一下
在这里插入图片描述


但是一般情况docker容器是没有系统命令使用权限的,而一般配置了这样的网络模式后,就会同样的有使用systemctl等系统命令的需求延伸出来,这种时候你就要用特权模式创建容器,注意特权模式如果不用守护进程方式启动,则会出现阻塞进程的情况,到之后只能ctrl+c了,但容器很可能会被关闭。

docker run -d --net clu --ip 192.168.88.190 --privileged=true centos:7.8.2003 /usr/sbin/init

以特权模式启动的容器,连接时必须指定登录口,如/bin/bash

docker exec -it f063be0bd990 /bin/bash

多数情况下当你的容器和宿主机在同一网段,可以被其他设备发现,并且以特权模式启动之后,很大概率就会又有一个需求延伸出来,就是脱离宿主机,直接SSH连接,这个时候你就需要在容器里面做下面的操作

首先在容器里面运行命令,生成一条用户登录信息,这里直接用root了,并且根据提示输入这个用户的密码认证

[root@f063be0bd990 /] passwd # add root
Changing password for user root.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

随后安装SSH

yum install -y openssh-* initscripts

最后如果你有需要可以改ssh的配置文件/etc/ssh/sshd_config,或者使用默认不做更改,随后包ssh启动,启动的时候只能直接调用命令,service在新版本的docker中是不让使用的及时你用的是特权容器,因为docker的官方核心思想就是用后即焚的东西,所以官方也不推荐在容器里在装服务

[root@test01 /] /etc/init.d/sshd start
Starting sshd (via systemctl):  [  OK  ]

[root@test01 /] /etc/init.d/sshd status
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2022-12-10 09:25:10 UTC; 20s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 368 (sshd)
   CGroup: /system.slice/docker-2441cd39fce5d3de267a18ff2076c970eb7e61505db88c4bcf9b72e9ab5b17e0.scope/system.slice/sshd.service
           └─368 /usr/sbin/sshd -D
           ‣ 368 /usr/sbin/sshd -D

Dec 10 09:25:10 test01 systemd[1]: Starting OpenSSH server daemon...
Dec 10 09:25:10 test01 sshd[368]: Server listening on 0.0.0.0 port 22.
Dec 10 09:25:10 test01 sshd[368]: Server listening on :: port 22.
Dec 10 09:25:10 test01 systemd[1]: Started OpenSSH server daemon.

此时你就可以用你的连接工具直接连接了,我之所以叫test01,是因为我把容器的主机名也改了,看的更像一个单独的系统
在这里插入图片描述


如果你看着容器的默认主机名不顺眼,这个也可以改,你需要关闭容器、关闭 docker 服务!!!!一定要关闭,之后进入容器在宿主机上的配置文件中,就在你本地docker仓库的containers文件夹下,根据容器id进入对应的文件夹找到,搜索含有你要修改的容器id的配置文件

[root@hdp3 2441cd39fce5d3de267a18ff2076c970eb7e61505db88c4bcf9b72e9ab5b17e0]# pwd
/opt/docker/containers/2441cd39fce5d3de267a18ff2076c970eb7e61505db88c4bcf9b72e9ab5b17e0
[root@hdp3 2441cd39fce5d3de267a18ff2076c970eb7e61505db88c4bcf9b72e9ab5b17e0]# ll
总用量 32
-rw-r----- 1 root root    0 12月 10 16:55 2441cd39fce5d3de267a18ff2076c970eb7e61505db88c4bcf9b72e9ab5b17e0-json.log
drwx------ 2 root root 4096 12月 10 16:55 checkpoints
-rw------- 1 root root 2959 12月 10 16:59 config.v2.json
-rw-r--r-- 1 root root 1201 12月 10 16:59 hostconfig.json
-rw-r--r-- 1 root root   13 12月 10 16:55 hostname
-rw-r--r-- 1 root root  150 12月 10 16:59 hosts
drwx------ 3 root root 4096 12月 10 16:55 mounts
-rw-r--r-- 1 root root   53 12月 10 16:55 resolv.conf
-rw-r--r-- 1 root root   71 12月 10 16:55 resolv.conf.hash

随后你要修改两个文件分别是config.v2.json、hostname中的容器id对应的值,比如本例中要修改的容器id是2441cd39fce5,则就要去找配置文件中的内容做修改

config.v2.json
在这里插入图片描述
hostname
在这里插入图片描述
最后重启docker服务和容器,进入容器你就会发现主机名成功修改

[root@hdp3 2441cd39fce5d3de267a18ff2076c970eb7e61505db88c4bcf9b72e9ab5b17e0] docker exec -it 2441cd39fce5 /bin/bash
[root@test01 /]# 

最后我们说一下创建网络模式时的CIDR取值问题。

CIDR的格式是IP/网络ID,前面的IP你可以看做是一个配合网关表示网络IP段的表达式,重点是网络ID,这个ID是让人迷糊的罪魁祸首。如果你使用的网络是IPV4的时候,它最大有效值是32,它的作用是用来表示网络策略所用的IP类型。

传统的意义上,网络IPV4类型分为三类ABC,总共是四组二进制,但用十进制展示的数字来表示,而A类网络的默认起始掩码是255.0.0.0,B类默认起始是255.255.0.0,C类默认起始是255.255.255.0。翻译成二进制来看,也就是说,整个传统网络IPV4策略中,从a到c类的子网默认掩码的范围是11111111.00000000.00000000.0000000011111111.11111111.11111111.11111111而这里面,所以网络ID其实是你所处网段所用掩码翻译成二进制后,有几个1。当然这只是为了让大家明白这里用到的网络ID是什么,真正的要说了解网络掩码的原理,是一个很复杂庞大的东西,大家如非需要,则没必要了解太深。

所以我上面因为我用的是vmware虚拟机,用的是192的一个c类地址,所以我的子网掩码应该是255.255.255.0,换算成CIDR网络ID就是24

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

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

相关文章

java基于Springboot的健身房课程预约平台-计算机毕业设计

项目介绍 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven 本健身网站系统是针…

Unity纹理优化:缩小包体

Android打包apk大小约:475M 查看打包日志:Console→Open Editor Log; 或者依赖第三方插件:build reports tool(在unity store里可以下载); 定位问题 经过排查后,发现项目中纹理占比很高&#…

分布式能源的不确定性——风速测试(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

(6)Pytorch数据处理

Pytorch 数据处理 要点总结 1、功能 Dataset:准备数据集,一般会针对自己的数据集格式重写Dataset,定义数据输入输出格式 Dataloader:用于加载数据,通常不用改这部分内容 2、看代码时请关注 Dataloader中collate_fn 传入…

【云原生】K8s Ingress rewrite与TCP四层转发讲解与实战操作

文章目录一、背景二、K8s Ingress安装三、K8s Ingress rewrite 讲解与使用1)配置说明2)示例演示1、部署应用2、配置ingress rewrite转发(http)3、配置ingress rewrite转发(https)【1】创建证书(…

音视频- iOS图像采集

本文主要总结一下,如何使用AVFoundation的功能来实现图像的采集,主要用到了AVFoundation中的一些类,采集的结构如下图,引用自iOS开发者官网: AVCaptureSession 采集会话,其主要功能从整体上来掌管图像采集的…

MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(五)交流耦合栅极驱动电路

交流耦合栅极驱动电路 1.计算耦合电容 2.耦合电容器的启动瞬变 3.总结 栅极驱动路径中的交流耦合可为栅极驱动信号提供简单的电平位移。交流耦合的主要作用是修改主MOSFET 的开通和关断栅极电压,而高侧栅极驱动则不同,它最需要关注的是缩小较大的电势差…

软件安全测试-web安全测试基础

目录 1. Web安全的测试范围 2.Web安全的四要素 3. Web安全的分类 4. Web安全的类别排名​ 5. 零时差攻击 6. Web安全的载体 7. 了解软件安全测试相关的Cooike,Session,Token 7.1 会话级鉴权及认证技术 7.2 会话安全管理需要授权和鉴权两个步骤 …

单例模式(史上最全)

文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

0121 动态规划 Day10

剑指 Offer 46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。…

Python——翻转字符串

题目介绍 以空格为分割,将字符串中的每个单词的字母位置不变,单词顺序从后往前翻转 例如:I am a student. 变成:student. a am I Python中的标准库是为了提高程序员开发效率,减少学习成本,而设计的一系列方…

spring——Spring Bean定义

在 XML 配置的<beans> 元素中可以包含多个属性或子元素&#xff0c;常用的属性或子元素如下表所示。 属性名称描述idBean 的唯一标识符&#xff0c;Spring IoC 容器对 Bean 的配置和管理都通过该属性完成。id 的值必须以字母开始&#xff0c;可以使用字母、数字、下划线等…

SpringCloud Gateway网关的使用与介绍

目录 1. gateway简介 1.1 是什么 1.2 作用 1.3 主要特征 1.4 与zuul的主要区别 1.5 主要组件 1.6 架构图 2. 开发示例 2.1 创建一个gateway模块 2.2 与nacos结合使用 2.2.1 默认规则 2.2.2 通过配置文件配置路由 2.2.3 动态路由 1. gateway简介 1.1 是什么 Spri…

Vulnhub靶机:PRIME_ 1

目录介绍信息收集主机信息探测主机信息探测网站探测目录爆破排雷dirsearch强制访问文件包含漏洞利用WordPress提权wordpress配置文件内核提权介绍 系列&#xff1a;Prime&#xff08;此系列共1台&#xff09; 发布日期&#xff1a;2019年9月1日 难度&#xff1a;初-中 运行环境…

在 Istio 服务网格中使用 Argo Rollouts 实现智能的渐进式发布

1 Argo Rollouts 介绍 Kubernetes 原生的 Deployment 利用 Rolling Update 滚动更新的策略在应用升级时提供基本的安全保证&#xff08;例如就绪探针&#xff09;。然而默认的滚动更新策略存在着一些明显的缺点&#xff0c;例如&#xff1a; 无法控制流向新版本的流量。无法控…

tensorflow入门(四)如何用tensorflow训练神经网络

参考 如何用tensorflow训练神经网络 - 云社区 - 腾讯云 在使用神经网络解决实际的分类或回归问题时需要设置好参数取值。下面介绍使用监督学习的方式来合理地设置参数取值&#xff0c;同时也将给出tensorflow程序来完成这个过程。设置神经网络参数的过程就是神经网络的训练过…

基于JDBC的MySQL数据库编程

✨博客主页: 荣 ✨系列专栏: MySQL ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录一. JDBC概述二. JDBC前置工作1. 准备好MySQL驱动包2. 创建项目三. JDBC的使用步骤1. 创建数据源DataSourece2. 连接数据库3. 构造并执行sql语句4. 释放资源5. sql语句不要写死(以插入为例)…

C++入门基础07:函数定义与声明、函数传参(传值、传地址、传引用)、函数重载

C入门基础07&#xff1a;函数定义与声明、函数传参&#xff08;传值、传地址、传引用&#xff09;、函数重载 1、函数定义与声明 函数是一起执行一个任务的一组语句。每个程序&#xff08;C/C&#xff09;都有一个主函数 main() &#xff0c; 所有简单的程序都可以定义其他额…

1563_AURIX_TC275_EVR的控制寄存器

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 1. 连续的写入必须确保是解锁状态&#xff0c;否则的话可能会导致所有的总线阻塞。 2. 多核系统中&#xff0c;尽量写入之后再读取一下确认写入的状态。 这里是过压以及欠压的几个监控结果…

if、for、while结构的用法

分支与循环的流程控制一、分支流程控制1. if分支语句结构1). 单分支2). 双分支3). 三元运算符&#xff08;双分支的简化&#xff09;4). 多分支二. 循环流程控制1. while循环语句语法结构1.while循环用法2.while 的死循环3. while else的用法2. for循环语句语法结构1. for和ran…