Docker网络network详解

news2025/1/16 1:11:59

一、概述

Docker容器每次重启后容器ip是会发生变化的。

这也意味着如果容器间使用ip地址来进行通信的话,一旦有容器重启,重启的容器将不再能被访问到。

Docker 网络就能够解决这个问题。

Docker 网络主要有以下两个作用:

  • 容器间的互联和通信以及端口映射

  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响

因此只要是处于同一个Docker 网络下的容器就可以使用服务名进行直接访问,而无需担心重启。

这也是Docker 网络最基本和常用的应用场景。

二、Docker的四种网络模式

网络模式命令指定方式描述
bridge–network bridge为每一个容器分配、设置 ip ,并将容器连接到 docker0 虚拟网桥上,这也是默认网络模式
host–network host容器不会创建自己的网卡,配置 ip 等,而是使用宿主机的 ip 和端口
container–network 容器名称或id新创建的容器不会创建自己的网卡和配置自己的ip,而是和一个指定的容器共享ip、端口范围
none–network none容器有独立的Network namespace,但并没有对其进行任何网络设置

如果觉得–network太长了也可以使用简写-net,效果是一样的

Docker 安装完成时,一般会自动创建三个网络:

NETWORK ID          NAME                DRIVER              SCOPE
40547f9137a5        bridge              bridge              local
b40bdb8f0356        host                host                local
0c7f9938f868        none                null                local

可以使用下列命令查看:

docker network ls

2.1 桥接模式–bridge

Docker服务启动 时,默认会创建一个名称为 docker0 网桥(其上有一个名称为 docker0 内部接口)。

该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker会 默认指定docker0ip地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

1)桥接模式原理图

在这里插入图片描述

2)桥接模式解析

  • Docker使用Linux桥接的方式,在宿主机虚拟一个Docker容器网桥(docker0)。

    Docker每启动一个容器时会根据Docker网桥的网段分配给容器一个ip地址。

    同时Docker网桥是每个容器的默认网关。

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

  • docker run创建容器的时,未指定network的容器默认的网络模式就是bridge,使用的就是docker0

    在宿主机ifconfig,就可以看到docker0和自己创建的network

    • eth0eth1……代表网卡一,网卡二……
    • lo代表127.0.0.1(localhost)
    • inet addr表示网卡的ip地址
  • 网桥docker0会创建一对对等虚拟设备接口:一个叫veth,另一个叫eth0,成对匹配。

    • 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth

      在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);

    • 每个容器实例内部也有一块网卡,每个接口叫eth0

    • docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对。

2.2 主机模式–host

不创建任何网络接口,直接使用宿主机的 ip地址与外界进行通信,不再需要额外进行NAT转换。

在主机模式下不能publish port

1)主机模式原理图

在这里插入图片描述

2)主机模式解析

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace

容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

容器共享宿主机网络ip,这样的好处是外部主机与容器可以直接通信。

小拓展:

Docker启动时指定--network=host-net=host,如果还指定了-p映射端口,此时就会有如下警告:

NARNING: Published ports are discarded when using host network mode

并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。

可以选择无视这个警告或者使用Docker的其他网络模式,例如--network=bridge

2.3 容器模式–container

1)容器模式原理图

在这里插入图片描述

2)容器模式解析

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。

新创建的容器不会创建自己的网卡,配置自己的ip,而是和一个指定的容器共享ip、端口范围等。

两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

2.4 none模式

none模式下,并不为Docker容器进行任何网络配置。

也就是说,这个Docker容器没有网卡、ip、路由等信息,只有一个lo接口。

lo标识代表禁用网络功能,即:127.0.0.1,本地回环的意思

需要我们自己为Docker容器添加网卡、配置IP等。

三、常用命令

在学习Docker 各种网络模式前,先要了解Docker 网络的常用命令。

2.1 查看网络

docker network ls

2.2 创建网络

# 基础用法
docker network create 网络名称

# 创建网络时是可以添加一系列参数的:
# --driver:驱动程序类型
# --gateway:主子网的IPV4和IPV6的网关
# --subnet:代表网段的CIDR格式的子网
# mynet:自定义网络名称
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 mynet

不指定任何选项的时候默认的–driver(网络模式)也是bridge(桥接)

但是gateway和subnet会自动生成

2.3 查看网络数据源

docker network inspect 网络名称 

2.4 将容器连接到指定网络

docker network connect 网络名称 容器名称

2.5 断开容器的网络

docker network disconnect 网络名称 容器名称

2.6 删除所有不在使用的网络

docker network prune

2.7 删除一个或多个网络

docker network rm 网络名称 

四、使用示例

4.1 创建容器时挂载网络

1)创建一个桥接类型的网络

docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet1

2)创建并运行容器时指定网络

docker run --name containerName -p 80:80 -d --network myNet1 myNginx

3)不想用时可以断开网络

docker network disconnect myNet1 myNginx

4.2 容器已存在时连接到新网络

1)创建一个桥接类型的网络

docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet2

2)为容器连接新的网络

# 执行后myNginx容器的网络就变成了myNet2
docker network connect myNet2 myNginx

3)不想用时可以断开网络

docker network disconnect myNet2 myNginx

4.3 使用docker-compose给一组容器挂载网络

有如下docker-compose.yml文件。

一般来说此时使用如下面命令编排的一组容器时会默认创建一个网络,并且这组容器全部都会加入到网络当中。

docker-compose up -d

这也是这一组容器之间可以直接使用服务名去直接通信的原因。

version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx-dev
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
    volumes:
      - /usr/local/docker/workspace/nginx/html:/usr/share/nginx/html
      - /usr/local/docker/workspace/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
      
  mysql:
    image: mysql:8
    container_name: mysql-dev
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=89225300
      - MYSQL_DATABASE=nacos_config
      - MYSQL_USER=gddst
      - MYSQL_PASSWORD=123456
    ports:
      - "3306:3306"
    volumes:
      - /usr/docker/docker/workspace/mysql/data:/var/lib/mysql
      - /usr/docker/docker/workspace/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
      - /usr/docker/docker/workspace/mysql/initdb:/docker-entrypoint-initdb.d

但是如果想要显示的指定网络,可以参考如下配置:

networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

配置好网络后,在每个服务下可以指定使用的网络,这里就以nginx为例:

version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx-dev
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
    volumes:
      - /usr/local/docker/workspace/nginx/html:/usr/share/nginx/html
      - /usr/local/docker/workspace/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
      - mynet
      
networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

这样容器编排时,所有容器都会加入到mynet这个自定义网络当中了。

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

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

相关文章

【ROS2入门】理解 ROS 2 节点

大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从ROS1切换到ROS2,在上一篇中,我们依托Turtlesim演示节点来逐步展开,介绍了rqt工具,这一章,我们将围绕ROS2中主要…

jvm快速入门

1.JVM介绍 1.什么是jvm Java Virtual Machine(java二进制字节码运行环境) 好处: 一次编译,好处运行自动内存管理,垃圾回收机制数组下标越界检查多态 比较JVM\JRE\JDK jvm屏蔽java代码与底层操作系统的差异 JREJVM基…

基于 java springboot+layui仓库管理系统设计和实现

基于 java springbootlayui仓库管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

基于基于jsp+mysql+Spring+mybatis的SSM汽车保险理赔管理系统设计和实现

基于基于jspmysqlSpringmybatis的SSM汽车保险理赔管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐…

12图、网络、关联矩阵

第 12 讲 图、网络、关联矩阵 Graphs,networks,incidence matrices 本讲讨论线性代数在物理系统中的应用。 图和网络 Graphs & Networks “图”就是“结点”和“边”的一个集合。 边线上的箭头代表从结点流出的正方向。 关联矩阵(I…

独立开发变现周刊(第87期):靠写简历如何每年赚24万美元?

分享独立开发、产品变现相关内容,每周五发布。目录1、mall4cloud: 开源的微服务B2B2C电商商城系统2、restorePhotos:开源的老照片修复系统3、JSON Crack——开源、免费的JSON可视化应用程序4、靠写简历如何每年赚24万美元?1、mall4cloud: 开源…

干货:用户分析的六大方法论(一)

​在日常的用户分析中,常用的有六大分析方法论: 1、行为事件分析2、点击分析模型3、用户行为路径分析4、用户健康度分析5、漏斗模型6、用户画像分析 1.行为事件分析 “行为事件分析”是用户分析的第一步,也是用户分析的核心和基础。一般来说…

代码随想录训练营第五十九天

1.下一个更大元素II 题503 循环数组有两种方法&#xff0c;一是用同一个数组拼接成两个数组&#xff0c;实现假循环&#xff1b;二是遍历两遍&#xff0c;用求余的方法。求余的方法更简便。 class Solution { public:vector<int> nextGreaterElements(vector<int>…

虚拟化技术学习笔记9

KVM存储虚拟化配置&#xff1a; 学习目标&#xff1a; 能够通过virt-manager添加硬盘&#xff1b;能够通过virsh添加硬盘&#xff1b;能够通过xml文件添加硬盘&#xff1b;能够了解本地存储的作用&#xff1b;能够设置本地存储&#xff1b;能够了解网络存储的作用&#xff1b…

黑马程序员SSM框架教程_Spring+SpringMVC+MyBatisPlus笔记(自学用,持续更新)

Spring的实现有两种方式&#xff0c;一是配置&#xff0c;二是注解 目录Spring_day01IOC、DIBean的基本配置、实例化、生命周期Bean的基本配置bean的实例化训练中的不足1&#xff1a;bean的生命周期DI相关内容setter注入构造器注入小结自动注入集合注入Spring_day02Spring_day0…

深入理解计算机系统_程序的加载过程和运行过程

这篇博客记录编译得到可执行目标文件后&#xff0c;加载和运行的过程。 编译得到可执行目标文件后&#xff0c;就可以将“可执行目标文件”加载“运行地址”所指的内存位置&#xff0c;然后运行了。下面记录Linux虚拟内存运行的运行过程。 2.1 程序的加载过程 当在windows下双…

【Java AWT 图形界面编程】LayoutManager 布局管理器 ③ ( BorderLayout 布局 )

文章目录一、BorderLayout 布局二、BorderLayout 构造函数 API三、BorderLayout 代码示例1、BorderLayout 基本用法代码示例2、BorderLayout 区域占用代码示例3、BorderLayout 同一区域显示多个组件代码示例一、BorderLayout 布局 BorderLayout 布局 将 Container 容器 分割成 …

深度学习PyTorch 之 DNN-二分类

本节开始说一下DNN分类的pytorch实现&#xff0c;先说一下二分类 流程还是跟前面一样 #mermaid-svg-7Bxg4CYlbKjYOMMf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7Bxg4CYlbKjYOMMf .error-icon{fill:#552222;}…

从校园到职场,听听他们的成长之路

背景介绍 这次分享主题是「从校园到职场 -- 我的成长之路」&#xff0c;视频内容可以查看 B 站链接&#xff1a;从校园到实习再到秋招。 上次的面试分享之后&#xff0c;阿卡拉提到关于刚毕业的学生也会有很多找工作的困扰&#xff0c;而且这个阶段能获取到的信息相对比较有限&…

Java API文档的使用详解

文章目录1. 概念2. 使用Java编程基础教程系列学会使用 API 文档是一个开发者基本的素养&#xff0c;而许多初学者并不会在意 API 文档的使用&#xff0c;甚至从来没有接触过&#xff0c;所以写下这篇文章探讨 API 文档的使用&#xff0c;希望能够帮助到你&#xff0c;先赞后看&…

正点原子嵌入式linux第二期

目录 第5讲 IMX6U芯片介绍 第6讲 6.1汇编LED驱动实验-原理分析 6.2 汇编LED驱动实验-汇编基本语法 ​编辑6.3 驱动编写 6.4 编写驱动 6.5烧写bin文件到SD卡并运行 第七讲 IMX启动方式&#xff08;没怎么听懂&#xff09; 7.1启动设备的选择 7.2 IVT表和BootData详解 7.3D…

从面试官的角度带你从源码分析关于vue(v2.7.10)的面试题

我们在面试的时候经常会被问到vue框架的原理类问题&#xff0c;我今天整理了一些常见问题和答案&#xff0c;希望有不正确之处还请指正。 1.new Vue时发生了什么 首先实例化一个对象&#xff0c;该对象执行init方法初始化生命周期等等&#xff0c;随后执行$mount方法开始生成v…

时间序列模型SCINet(代码解析)

前言 SCINet模型&#xff0c;精度仅次于NLinear的时间序列模型&#xff0c;在ETTh2数据集上单变量预测结果甚至比NLinear模型还要好。在这里还是建议大家去读一读论文&#xff0c;论文写的很规范&#xff0c;很值得学习&#xff0c;论文地址SCINet模型Github项目地址&#xff…

SpringBoot文件上传功能实现、异常处理

目录 一、文件上传 1、页面表单 2、文件上传代码 3、自动配置原理 二、异常处理 错误处理 1、默认规则 2、定制错误处理逻辑 3、异常处理自动配置原理 4、异常处理步骤流程 一、文件上传 1、页面表单 <form method"post" action"/upload" e…

详细实例说明+典型案例实现 对递归法进行全面分析 | C++

第二章 递归法 目录 ●第二章 递归法 ●前言 ●一、递归法是什么&#xff1f; 1.简要介绍 2.生活实例 ●二、递归法的典型案例——阶乘函数&斐波那契数列 1.阶乘函数 2.斐波那契数列 ●总结 前言 简单的来说&#xff0c;算法就是用计算机程序代码来实现数学…