Docker网络模式详解

news2024/9/22 2:41:30

文章目录

  • 一、docker网络概述
    • 1、docker网络实现的原理
      • 1.1 随机映射端口( 从32768开始)
      • 1.2 指定映射端口
      • 1.3 浏览器访问测试
  • 二、 docker的网络模式
    • 1、默认网络
    • 2、使用docker run 创建Docker容器时,可以用--net或--network 选项指定容器的网络模式
  • 三、docker网络模式详解
    • 1、host模式
    • 2、container模式
    • 3、none模式
    • 4、bridge模式
    • 5、自定义网络模式

一、docker网络概述

1、docker网络实现的原理

ocker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP, 同时Docker网桥是 每个容器的默认网关。

因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。

如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

1.1 随机映射端口( 从32768开始)

docker run -d --name test1 -P nginx(镜像)

1.2 指定映射端口

docker run -d --name test2 -p 49156:80 nginx

docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d3c04f57a68 nginx "/docker-entrypoin...." 4 seconds ago Up 3 seconds 0.0.0.0: 49156->80/tcp test2
b04895f870e5 nginx " /docker-entrypoi..." 17 seconds ago Up 15 seconds 0.0.0.0: 49153->80/ tcp test1

在这里插入图片描述

1.3 浏览器访问测试

浏览器访问: http://192.168.229.90;49156 、 http://192.168229.90:49153
在这里插入图片描述
在这里插入图片描述

二、 docker的网络模式

Host:容器不会虚拟出自己的网卡,配置主机的IP等,而是使用宿主机的IP和端口

Container: 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围

None: 该模式关闭了容器的网络功能。

Bridge:默认为该模式,此模式会为每一个容器分配,设置IP等,并将容器连接到一个docker0 的虚拟网桥,通过docker 0 网桥以及iptables nat 表配置与宿主机通信。

自定义网络

1、默认网络

当你安装Docker时,它会自动创建三个网络bridge(创建容器默认连接到此网络)、 none 、host。你可以使用以下docker network ls或者docker network list命令列出这些网络:
在这里插入图片描述

2、使用docker run 创建Docker容器时,可以用–net或–network 选项指定容器的网络模式

host模式:使用–net=host 指定。

none模式:使用–net=none 指定。

container模式:使用–net=container:NAME_ or ID指定。

bridge模式:使用–net=bridge 指定,默认设置,可省略。

三、docker网络模式详解

1、host模式

host 模式 : 使用 --net=host 指定

相当于VMware 中的桥接模式,与宿主机在同一个网络中,但是没有独立IP地址

Docker 使用了Linux 的Namespace 技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace 隔离网络等。一个Network Namespace 提供了一份独立的网络环境,包括网卡,路由,iptable 规则等都与其他Network Namespace 隔离。一个Docker 容器一般会分配一个独立的Network Namespace

但是如果启动容器的时候使用host 模式,那么这个容器将不会获得一个独立的Network Namespace ,而是和宿主机共用一个Network Namespace 。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口范围.此时容器不再拥有隔离的、独立的网络栈。不拥有所有端口资源
在这里插入图片描述

2、container模式

在理解了host模式后,这个模式也就好理解了。

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

新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo网卡设备通信。
在这里插入图片描述

docker inspect -f '{{.State.Pid}}' 155ddb0c29b3                         #查看容器进程PID
22364
ls -l /proc/22364/ns                                                 #查看容器的进程、网络、文件系统等命名空间编号
-----------------------------------------------------------------
总用量 0
lrwxrwxrwx. 1 root root 0 7月  26 17:47 ipc -> ipc:[4026532688]
lrwxrwxrwx. 1 root root 0 7月  26 17:47 mnt -> mnt:[4026532683]
lrwxrwxrwx. 1 root root 0 7月  26 16:35 net -> net:[4026532691]       #查看此项Network Namespace
lrwxrwxrwx. 1 root root 0 7月  26 17:47 pid -> pid:[4026532689]
lrwxrwxrwx. 1 root root 0 7月  26 17:47 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 7月  26 17:47 uts -> uts:[4026532687]
-----------------------------------------------------------------
docker run -itd --name test3 --net=container:155ddb0c29b3 centos bash
docker inspect -f '{{.State.Pid}}' 3a47d5cb641b
23428
ls -l /proc/23428/ns
-----------------------------------------------------------------
总用量 0
lrwxrwxrwx. 1 root root 0 7月  26 17:56 ipc -> ipc:[4026532783]
lrwxrwxrwx. 1 root root 0 7月  26 17:56 mnt -> mnt:[4026532781]
lrwxrwxrwx. 1 root root 0 7月  26 17:56 net -> net:[4026532691]       #container模式的Network Namespace和上面的一致
lrwxrwxrwx. 1 root root 0 7月  26 17:56 pid -> pid:[4026532784]
lrwxrwxrwx. 1 root root 0 7月  26 17:56 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 7月  26 17:56 uts -> uts:[4026532782]
————————————————

在这里插入图片描述
在这里插入图片描述

3、none模式

使用none模式,Docker 容器拥有自己的Network Namespace, 但是,并不为Docker容器进行任何网络配置。

也就是说,这个Docker容器没有网卡、IP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
在这里插入图片描述

4、bridge模式

在这里插入图片描述
bridge模式是docker的默认网络模式,不用–net 参数,就是bridge模式。

相当于Vmware中的nat 模式,容器使用独立network Namespace, 并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、 设置IP等, 并将一个主机上的Docker容器连接到一个虚拟网桥上。

(1) 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

(2) 从docker0子网中分配一-个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建—对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。

(3) Docker将 veth pair设备的一-端放在新创建的容器中,并命名为eth0 ( 容器的网卡),另一端放在主机中,以veth*这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

(4) 使用docker run -p时,docker 实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -nL查看。
在这里插入图片描述

5、自定义网络模式

#直接使用bridge模式,是无法支持指定IP运行docker的,例如执行以下命令就会报错
docker run -itd --name gxd4 --network bridge --ip 172.17.0.10 centos:7 /bin/bash  

在这里插入图片描述
自定义网络模式创建步骤

#可以先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.20.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
 
#docker1 为执行 ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,那你在使用 ifconfig -a 命令查看网络信息时,看到的是类似br-110eb56a0b22 这样的名字,这显然不怎么好记。
#mynetwork为执行docker network list命令时,显示的bridge网络模式名称
  
docker run -itd --name gxd4 --net mynetwork --ip 172.20.0.10 centos:7 /bin/bash
ifconfig                                 #该命令需要安装net-tools

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

代码审计实战3-android java

jks java keystore 作用:保证应用的唯一性 简介:可以理解为java的密钥库,是一个用来存放密钥和证书的仓库。 (而keytool就是密钥和证书的管理工具,它把key(密钥)和certificate(证…

一零五六、Jsp+mysql 实现学生选课系统(附源码及数据库)

目录 实现效果 项目代码 数据库 结语 实现效果 login.jsp index.jsp course_query.jsp course_selection.jsp course_withdraw.jsp selection_query.jsp 项目代码 checkSelectionStatus.jsp % page contentType"text/html;charsetUTF-8" language"java&q…

图像处理:均值滤波算法

目录 前言 概念介绍 基本原理 Opencv实现中值滤波 Python手写实现均值滤波 参考文章 前言 在此之前,我曾在此篇中推导过图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)。这在此基础上,我想更深入地研…

4月23号软件更新资讯合集.....

微软发布 Web 渲染引擎 Babylon.js 6.0 Babylon.js 是一个强大、简单、开放的游戏和 Web 渲染引擎,并被封装在一个友好的 JavaScript 框架中。 Babylon.js 6.0 带来了性能改进、渲染增强和一系列新功能。 新物理插件 Havok 团队通过一个特殊的新 WASM 插件和对 Ba…

sar基本命令格式操作及使用方法学习笔记

目录 SAR说明Centos7安装Sar命令sar命令显示时间改为24小时制查询某天某个时间段内的数据 SAR说明 sar是一个采集,报告和存储计算机负载信息的工具。自下载安装好后每10分钟对系统性能进行一次采集,每天的日志文件保存再/var/log/sa/下,sa17…

Docker 部署Redis

由于项目需要,上了redis。公司用的是OKD4.x,所以在自己的环境上也直接上docker,比下载、编译、安装省心多了。 1、下载镜像 官网地址:https://hub.docker.com/_/redis 我选择的是docker pull redis:7.0-bullseye 具体版本号的含…

Web3D包装生产线 HTML5+Threejs(webgl)开发

生产线三维可视化解决方案就是通过物联网、虚实联动和三维建模等先进技术,以一个3D立体模型展现出来,可以让我们很直观的看到生产线的运作以及对数据的监控。3D运用数据孪生技术可以让工业3D物联网管理系统的界面变得非常的简单易看,并且能够…

软件测试的新技术和方法

作为一位资深的IT领域博主,我一直在关注软件测试领域的发展趋势。随着技术的不断发展,软件测试领域也在不断更新换代。在本文中,我将分享一些最新的软件测试技术和方法,希望能对广大软件测试工程师提供一些参考。 一、自动化测试…

【教程】保姆级红米AX6000刷UBoot和OpenWrt固件

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 目录 开启SSH 刷入UBoot 刷入Openwrt 设置Openwrt 刷回小米原厂固件 开启SSH 1、下载官方指定版本固件:https://share.qust.me/redmi-ax6000-1.2.8.bin 2、进入路由器后台升级固件:h…

Nginx +Tomcat 负载均衡,动静分离集群

介绍 通常情况下,一个 Tomcat 站点由于可能出现单点故障及无法应付过多客户复杂多样的请求等情况,不能单独应用于生产环境下,所以我们需要一套更可靠的解决方案 Nginx 是一款非常优秀的http服务软件,它能够支持高达 50000 个并发…

IndexedDB的包装器JsStore - 分页功能

JsStore是IndexedDB的包装器。它提供了简单的SQL像api,这是容易学习和使用。IndexedDb查询可以在web worker内部执行,JsStore通过提供一个单独的worker文件来保持这种功能。 由于之前使用IndexedDB时,提供api不太丰富,就自己写了一…

Ubuntu2204安装pycharm社区版

最近在学习人工智能相关的知识,比较流行的开源框架对windows操作系统的支持并不太友好,因此把学习测试的环境搭在了Ubuntu2204上。一开始我都是在win10系统中的pycharm上写python代码,然后再上传到Ubuntu2204中运行测试,这么做降低…

GIS基础概念与开发实践

GIS的应用价值 呈现、还原、规划空间信息数据挖掘、统计分析等等 Q:这么多软件可以做GIS,但是格式又不一样,怎么办?这普需要一个标准的出现。 GIS标准:OGC标准 不同GIS软件对空间数据定义和存储结构不同&#xff0…

远程访问及控制ssh

SSH远程管理 OpenSSH服务器 SSH(Secure Shell) 协议 是一种安全通道协议。主要用来实现字符界面的远程登录、远程复制等功能。对通信数据进行了加密处理,用于远程管理其中包括用户登录时输入的用户口令。因此SSH协议具有很好的安全性------------(同样…

C嘎嘎~~ 【初识C++ 下篇】

初识C 下篇 1.引用1.1引用的概念1.2引用的特点1.3常引用1.4引用使用的场景1.5引用和指针的区别 2.指针空值 --- nullptr3.内联函数3.1 内联函数的概念3.2内联函数的使用场景3.3内联函数的特性 1.引用 1.1引用的概念 相信大家小时候, 肯定有小名、绰号、亲朋好友的昵…

查询提速 20 倍,Apache Doris 在 Moka BI SaaS 服务场景下的应用实践

导读: MOKA 主要有两大业务线 MOKA 招聘(智能化招聘管理系统)和 MOKA People(智能化人力资源管理系统),MOKA BI 通过全方位数据统计和可灵活配置的实时报表,赋能于智能化招聘管理系统和人力资源…

scratch甲壳虫走迷宫 中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析2023年3月

目录 scratch甲壳虫走迷宫 一、题目要求 1、准备工作 2、功能实现 二、案例分析

ESP32学习二-环境搭建(ESP-IDF V5.0,Ubuntu18.4)

一、准备事项 Ubuntu 18.04.5。具体安装可以参考如下链接。使用VMware安装Ubuntu虚拟机和VMware Tools_t_guest的博客-CSDN博客 乐鑫官方也提供了安装的相关操作。有兴趣可以参考。 快速入门 - ESP32 - — ESP-IDF 编程指南 v5.0.1 文档 注:提前说明,因…

Android权限描述

问题 我们常常在写apk的时候申请一些相关权限。想知道每个权限的作用&#xff0c;可以查询权限声明的地方。 1、三方页面&#xff1a; https://manifestdestiny.reveb.la/ 2、源码注释 /frameworks/base/core/res/AndroidManifest.xml <!-- SystemApi TestApi Allows a…

部署 Exsi 7.0.3

文章目录 1. 下载介质2. u盘引导安装启动盘3. 硬件连接4. 安装 EXSI 7.0.3 1. 下载介质 下载 VMware-VMvisor-Installer-7.0U3l-21424296.x86_64.iso 安装 EXSI 7.0.3 可参考: https://www.dinghui.org/vmware-iso-download.html 2. u盘引导安装启动盘 工具 https://www.v…