【Docker】网络配置network详解

一,network的概述

解决痛点(能干什么?):
(1)容器间的互联和通信以及端口映射
(2)容器IP变动时候,可以通过服务名直接网络通信而不受到影响

二,network的基本用法

# 连接容器到网络
docker network connect 网络名 

# 创建网络(使用统一网络的容器,肯定可以ping通)
docker network create  网络名 

# 断开网络
docker network disconnect  网络名

# 查看网络具体信息
docker network inspect  

# 查看所有网络列表
docker network ls   

# 删除无用网络
docker network prune  

# 删除指定的网络
docker network rm 

三,network的五种网络模式

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

(1)桥接模式—— bridge

为每一个容器分配、设置IP等,并将容器连接到docker0的虚拟网桥。若没有特别申明,则为默认自带一个IP以及网络设置。
在这里插入图片描述

  • Docker使用Linux桥接的方式,在宿主机虚拟一个Docker容器网桥(docker0)。
    Docker每启动一个容器时会根据Docker网桥的网段分配给容器一个ip地址。
    同时Docker网桥是每个容器的默认网关。
    同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

  • docker run创建容器的时,未指定network的容器默认的网络模式就是bridge,使用的就是docker0。
    在宿主机ifconfig,就可以看到docker0和自己创建的network:

    • eth0,eth1……代表网卡一,网卡二……
    • lo代表127.0.0.1(localhost)
    • inet addr表示网卡的ip地址
  • 网桥docker0会创建一对对等虚拟设备接口:一个叫veth,另一个叫eth0,成对匹配。
    整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,
    在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
    每个容器实例内部也有一块网卡,每个接口叫eth0;
    docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对。

[root@localhost ~]# docker network inspect bridge
[
    {
        "Name": "bridge",                     # 网络名称
        "Id": "73992551d4270844e6aaab67e4d2030e24b5670c1502d34d29070d6a871c4a4e",    # 网络ID
        "Created": "2024-01-05T16:06:44.585112632+08:00",   # 网络创建时间
        "Scope": "local",             # 网络作用范围
        "Driver": "bridge",           # 网络驱动
        "EnableIPv6": false,          # 网络是否支持ipv6
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",     # 网络网段
                    "Gateway": "172.17.0.1"		   # 网络ip
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "411008ba764f9209982cae4ddda07e12f851d88b00432e5b6819895fabcabfb6": {
                "Name": "ubt03",    # 使用改网络的容器名称
                "EndpointID": "1bdc19dd16fe96a8fe570dd89516f58e58ee54decd7d71f8df51dd483053d1f7",
                "MacAddress": "02:42:ac:11:00:03",    # 使用改网络的容器的MAC地址
                "IPv4Address": "172.17.0.3/16",       # 使用改网络的容器的IP地址
                "IPv6Address": ""
            },
            "75e8ed5431da1c1558a440eb26a62648e4ee2bdffa09b68adddcc486b69d8a35": {
                "Name": "ubt01",     # 使用改网络的容器名称
                "EndpointID": "c9756c4ebe3b887fa82baec3c9019ccc4ad23aff6307760b7bab5e52f7dfd9fa",
                "MacAddress": "02:42:ac:11:00:02",   # 使用改网络的容器的MAC地址
                "IPv4Address": "172.17.0.2/16",      # 使用改网络的容器的IP地址
                "IPv6Address": ""
            },
            "7b738c8435c3973bf7d23d97bd5a91a9d67b53eb7bf545413935db33af95dc7c": {
                "Name": "ubt02",     # 使用改网络的容器名称
                "EndpointID": "966dfe49dd8c49c44e018bdc84d7a7366c1d1f0d53035a833c367dff62266084",
                "MacAddress": "02:42:ac:11:00:04",   # 使用改网络的容器的MAC地址
                "IPv4Address": "172.17.0.4/16",      # 使用改网络的容器的IP地址
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",   # docker0 默认就是bridge网络模式
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

(2)主机模式—— host

容器不会虚拟出自己的网卡、IP等,而是使用宿主机的IP和端口。
host模式
注意:在创建的时候,将不在指定 -p 8083:8080,无意义,运行时候会警告,但是不报错。因为该容器和主机ip和端口同步。

[root@localhost ~]# docker network inspect host
[
    {
        "Name": "host",     # 网络名称 
        "Id": "3aa406c8eaa186507ced3f3ff72710d350b363b5993159449de623188dd7d5e7",
        "Created": "2023-12-15T14:18:11.018657826+08:00",    # 网络创建时间
        "Scope": "local",				 # 网络作用范围
        "Driver": "host",                # 网络驱动
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "18720ac44b136684644e17d8deea38b74db76d8ef0f1fc342340180148377310": {
                "Name": "redis-node-3",   # 使用该网络的容器名称
                "EndpointID": "3a18044ac33afd2da1b3cadd1dd28735c278119a1b1b5f1def96f206b84d8efb", 
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            },
            "2b2987704c6da591e321fe75f9a1518f4e4488285f0c3a20d53d32a8cf9d24da": {
                "Name": "redis-node-2",    # 使用该网络的容器名称
                "EndpointID": "825830dd9adf559a9d99e0e8dad1fd3a4ef14b137e322f2c78d9b090ad0d9390",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            },
            "e2304c8acbd676f76fcde5faf0f26555bedf61148ab858c22bc32c2ab9ff4a9b": {
                "Name": "redis-node-1",    # 使用该网络的容器名称
                "EndpointID": "a255555c3c7f7dffcf2c7e26a3dd752a43b826a8ccebb9f41f65bf400cb5e56d",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

(3)容器模式—— container

新创建的容器不会创建自己的网卡,没有自己的IP,也不会进行相应的配置。而是和一个指定的容器共享IP端口范围等。
container模式
说明:当192.168.20.2容器停掉后,192.168.20.3的网络也会同时停掉!

--network container:共享的容器名/ID

注意: 在测试的时候,由于tomcat容器的端口,不可共用,所以在测试的时候,还是用Alpine(简单、小巧、安全)小插件来测试:

# 创建alpine1
$ docker run -it                              --name alpine1 alpine /bin/sh

# 创建alpine2,通过--network container:alpine1,共用网络
$ docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh

(4)none模式—— none

容器有自己独立的Network namespace,但是没有进行任何的相关配置。即禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)

  • 在none模式下,并不为Docker容器进行任何网络配置。
    也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo。
    需要我们自己为Docker容器添加网卡、配置IP等。
[root@localhost ~]# docker network inspect none
[
    {
        "Name": "none",   # 网络名称
        "Id": "9939d4b66231cc6e90ffca805518059ab077e5b04d4933a4b69f279e91f314dd",  # 网络id
        "Created": "2023-12-15T14:18:10.956266297+08:00",  # 网络创建时间
        "Scope": "local",    # 网络作用范围
        "Driver": "null",    # 网络驱动
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

(5)自定义网络

为使得众多的容器,进行分门别类,方便管理的情况下,而且通过服务名来ping通,所以采用自定义网络进行管理!
解决痛点:可以通过服务名ping通。

#创建新的网络,默认为bridge模式
docker network create new_net

# 新创建两个容器tomcat81和tomcat82,并调用新建的自定义网络
docker run -d -p 8081:8080 --network new_net --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network new_net --name tomcat82 billygoo/tomcat8-jdk8

tomcat81和tomcat82 是在同一个网段,通过ip来ping肯定能够通,并且通过服务器也可以ping通。

总结,自定义网络本身就维护好了主机名和ip的对应关系( ip和域名都能通)

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

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

相关文章

小白水平理解面试经典题目_数组类Leetcode 412. Fizz Buzz【数学解法】

412 FizzBuzz 小白渣翻译: 给定一个整数 n ,返回一个字符串数组 answer (从 1 开始索引),其中: answer[i] “FizzBuzz” 如果 i 能被 3 和 5 整除。answer[i] “Fizz” 如果 i 能被 3 整除。answer[i]…

大数据信用报告查询费用一般要多少钱?

一些不少朋友在申贷的时候被拒贷之后,得到的原因就是因为大数据不良被拒,这时候很多人都反过来查询自己的大数据信用报告,而查询的价格也是不少朋友都比较关注的,那大数据信用报告查询费用一般要多少钱呢?下面本文就为你介绍一下…

069:vue中EventBus的使用方法(图文示例)

第069个 查看专栏目录: VUE ------ element UI 本文章目录 示例背景示例效果图示例源代码父组件:子组件A:子组件B:eventbus/index.js: EventBus的基本使用方法: 示例背景 在Vue中,使用EventBus可以实现组件…

flask基于Python的期货交易模拟系统的django-afl61-vue

期货交易模拟系统是一个便于用户在线查看期货投资、取消投资、风险控制、账户资金、持仓资金等,管理员进行管理的平台。因此本文主要论述了系统开发的过程和实现的功能,结合Web技术来实现的期货交易模拟系统。本系统以软件工程理论为开发基础&#xff0c…

【差分数组 区间的综合用例】

根据前面两篇文章 区间合并 差分数组 对差分数组和合并区间的介绍,以下是两道相关的例题,其中综合题融合了区间合并和差分数组,非常经典,也有点难度,值得仔细琢磨 最合适的价格 (差分数组) 给…

Java线程是怎么实现run方法的执行的呢?【 多线程在JVM中的实现原理剖析】

Java线程是怎么实现run方法的执行的呢?【 多线程在JVM中的实现原理剖析】 查看naive state0 方法JVM_StartThread 方法创建操作系统线程操作系统线程执行 本文转载-极客时间 我们知道Java线程是通过行start()方法来启动的,线程启动后会执行run方法内的代…

【Linux网络编程三】Udp套接字编程(简易版服务器)

【Linux网络编程三】Udp套接字编程(简易版服务器) 一.创建套接字二.绑定网络信息1.构建通信类型2.填充网络信息①网络字节序的port②string类型的ip地址 3.最终绑定 三.读收消息1.服务器端接收消息recvfrom2.服务器端发送消息sendto3.客户端端发送消息sendto4.客户端…

Python使用分治算法作归并排序

对于分治算法的一个较为常规的应用中,归并排序是一个使用分治算法的排序方式。给定一个随机排序的数组,我们要将其元素按照升序或者降序的方式进行排序,可以设想到这样的一种算法,如果一个数组的上半部分和下半部分已经排好序&…

Vue打包Webpack源码及物理路径泄漏问题解决

修复前: 找到vue.config.js文件,在其中增加配置 module.exports {productionSourceMap: false,// webpack 配置configureWebpack: {devtool: false,}}其中打包的物理路径泄露我这边试了好多次,发现只有打包的时候NODE_ENVproduction 才能保…

JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】

JSP和JSTL板块:第三节 JSP四大域对象 一、page范围二、request范围三、session范围四、application范围 在服务器和客户端之间、各个网页之间、哪怕同一个网页之内,总是需要传递各种参数值,这时JSP的内置对象就是传递这些参数的载具。内置对象…

Iceberg从入门到精通系列之二十三:Spark查询

Iceberg从入门到精通系列之二十三:Spark查询 一、使用 SQL 查询二、使用 DataFrame 进行查询三、Time travel四.Incremental read五、检查表六、History七、元数据日志条目八、Snapshots九、Files十、Manifests十一、Partitions十二、所有元数据表十三、参考十四、使…

泰克示波器(TBS2000系列)触发功能使用讲解——边沿触发

# Trigger区域 触发区域用于对触发功能进行配置。示波器的触发功能用于采集(Acquire)那些在瞬间出现的信号,便于我们分析观察,此时可以当做逻辑分析仪使用。触发区域按钮包括:menu、Level\Force Trig三个。 目录 1.1 …

【机器学习 深度学习】卷积神经网络简述

🚀个人主页:为梦而生~ 关注我一起学习吧! 💡专栏:机器学习 欢迎订阅!相对完整的机器学习基础教学! ⭐特别提醒:针对机器学习,特别开始专栏:机器学习python实战…

telnet笔记

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、场景二、介绍1.测试端口2.访问百度3. 简单的爬虫 前言 最近telnet命令用的比较多,所以记录一下。 一、场景 ping应该是大家最常用的命令&…

unity角色触摸转向

1、挂载脚本到角色的父物体A上 2 、以屏幕左边的触摸为移动,右边为转向操作 3、加载角色时,将角色的父物体设置为A,须将角色的位置和角度置0 using System; using System.Collections; using System.Collections.Generic; using UnityEngin…

python之组合数据类型-字典dict

字典 字典的定义与特点操作字典创建字典字典的增删改查添加键值对删除键值对修改键值对访问元素 遍历字典 嵌套 字典的定义与特点 字典:字典是一系列键值对,是一种无序的数据集合,它是通过键来访问的,而不是索引 字典的特点&#…

【Go语言成长之路】安装Go

文章目录 安装Go一、下载Go语言安装包二、删除以前安装的Go版本三、添加/usr/local/go/bin到环境变量内四、确认安装成功 安装Go Note: 这里只演示安装Linux版本的Go,若为其它版本,请按照官网的安装教程进行安装即可。 一、下载Go语言安装包 ​ 在浏览…

Unity | Spine动画记录

https://blog.csdn.net/linshuhe1/article/details/79792432 https://blog.csdn.net/winds_tide/article/details/128925407 1.需要的三个文件 通常制作好的 Spine 动画导出时会有三个文件: .png 、.json 和 .atlas: skeleton-name.json 或 skeleton-…

Blender教程(基础)-面的法向-12

一、准备 新建如下图所示立方体演示面的法向 默认法向方向 二、显示法向 再菜单栏右上角、找到网络编辑模式,最下面的显示发法线打勾,如下图所示,出现的浅蓝色线条就是代表法向方向。 调整大小显示 三、正面 再显示叠加层菜单下找到面…

pytorch调用多个gpu训练,手动分配gpu以及指定gpu训练模型的流程以及示例

torch.device("cuda" if torch.cuda.is_available() else "cpu") 当使用上面的这个命令时,PyTorch 会检查系统是否有可用的 CUDA 支持的 GPU。如果有,它将选择默认的 GPU(通常是第一块,即 “cuda:0”&#xf…