【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.hqwc.cn/news/447987.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构—动态查找

动态查找介绍 1. 动态查找的引入:当查找表以线性表的形式组织时,若对查找表进行插入、删除或排序操作,就必须移动大量的记录,当记录数很多时,这种移动的代价很大。 2. 动态查找表的设计思想:表结构本身是…

❤ React18 环境搭建项目与运行(地址已经放Gitee开源)

❤ React项目搭建与运行 环境介绍 node v20.11.0 react 18.2 react-dom 18.2.0一、React环境搭建 第一种普通cra搭建 1、检查本地环境 node版本 18.17.0 检查node和npm环境 node -v npm -v 2、安装yarn npm install -g yarn yarn --version 3、创建一个新的React项目…

tuya-open-sdk-for-device使用体验之Windows 下 MSYS2 编译 T2-U 开发板

tuya-open-sdk-for-device 是一款跨芯片平台、操作系统的 IoT 开发框架。它基于通用南向接口设计,支持 Bluetooth、Wi-Fi、Ethernet 等通信协议,提供了物联网开发的核心功能,包括配网,激活,控制,升级等&…

高通GAIA V3命令参考手册的研读学习(13):GAIA通知、示例以及制造商命令扩展

如前文《高通GAIA V3命令参考手册的研读学习(四)》所述,PDU一共有四种,前面已经讲了命令、回应以及错误码,现在来看最后一种:通知。 4. QTIL GAIA通知 通知发送的方向,是由设备发送到移动应用…

【Linux】日志的实现——日志等级的分类、日志的实现和输出、日志在程序中的应用(以管道通信为例)

文章目录 日志实现1.日志的介绍2.日志的制作(向屏幕直接打印)2.1获取时间2.2输出内容2.3打印方式2.3.1向单个文件打印2.3.2向分类文件打印 3.日志的应用3.1以管道通信为例 日志实现 1.日志的介绍 Linux日志是以时间线-事件的方式记录操作系统和应用的信…

代码随想录算法训练营29期|day38 任务以及具体安排

第九章 动态规划part01 509. 斐波那契数 //非压缩状态的版本 class Solution {public int fib(int n) {if (n < 1) return n; int[] dp new int[n 1];dp[0] 0;dp[1] 1;for (int index 2; index < n; index){dp[index] dp[index - 1] dp[index - 2];}r…

洛谷 P3817 小A的糖果

题目描述 小 A 有 n 个糖果盒&#xff0c;第 i 个盒中有 a【i​】 颗糖果。 小 A 每次可以从其中一盒糖果中吃掉一颗&#xff0c;他想知道&#xff0c;要让任意两个相邻的盒子中糖的个数之和都不大于 x&#xff0c;至少得吃掉几颗糖。 输入格式 输入的第一行是两个用空格隔…

【Java程序设计】【C00230】基于Springboot的高校跳蚤市场平台(有论文)

基于Springboot的高校跳蚤市场平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的高校跳蚤市场 主要功能如下&#xff1a;用户注册和登录登录功能 、个人信息的管理、闲置商品的操作 、购物车的管理操作。 项目…

腾讯云云监控实践:使用云审计 CloudAudit SDK 精准管理腾讯云资源

文章目录 前言一、什么是腾讯云的操作审计 CloudAudit二、CloudAudit 有哪些优势三、CloudAudit 应用场景举例3.1 安全分析3.2 资源变更跟踪3.3 合规性审计 四、使用云审计 SDK 进行云监控4.1 安装环境包 PHP4.2 下载并解压云审计 PHP SDK4.3 创建的腾讯云持久证书&#xff08;…

Kafka集群搭建

Kafka集群是把状态保存在Zookeeper中的&#xff0c;首先要搭建Zookeeper集群。 本期是分享Kafka&#xff0c;若想看zookeeper搭建请看&#xff1a;zookeeper搭建&#xff08;单机模式和集群模式)-CSDN博客 ​​​​​​​ ​​…

Java/Python/Go不同开发语言基础数据结构和相关操作总结-Map篇

Java/Python/Go不同开发语言基础数据结构和相关操作总结 1. Java1.1 基础操作1.1.1 数据结构和定义方式1.1.2 增加1.1.3 修改1.1.4 查询1.1.5 删除1.1.6 获取总长度1.1.7 按key排序1.1.8 按value排序1.1.9 遍历 1.2 常用其他方法1.2.1 几种数据结构的对比 2. Go2.1基础操作2.1.…

从零开始,轻松打造Web自动化测试框架:Python+Selenium实战指南

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…