Docker network 四种网络模式及自定义网络的简单使用介绍
  HataGTb8c2ak 2023年11月02日 27 0

docker network 简单介绍


安装了docker 服务之后

使用 ip a 查看生成一个 名为 docker0 的虚拟网桥

通过下图中的这个ip地址(虚拟网桥)跟宿主机以及容器之间的网络通信

Docker network 四种网络模式及自定义网络的简单使用介绍_docker

安装完docker之后,会默认创建3大网络模式 (常用的是图中红框中的)


Docker network 四种网络模式及自定义网络的简单使用介绍_Linux_02


docker 四种网络模式及自定义网络模式的简单介绍

网络模式

简介

bridge

为每一个容器分配、设置IP等,并将容器链接到一个"docker0"

虚拟网桥,默认为该模式

host

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

none

容器有独立的network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥链接、IP等

container

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

一、bridge
docker network inspect birdge     查看birdge网络配置信息 如下图所示

Docker network 四种网络模式及自定义网络的简单使用介绍_Linux_03

[root@localhost ~]# docker run -it --name aaa01 ubuntu bash
[root@localhost ~]# docker run -it --name aaa02 ubuntu bash    使用ubuntu镜像创建两个aaa01、aaa02的容器
[root@localhost ~]# docker inspect aaa01 | tail -n 20 				
[root@localhost ~]# docker inspect aaa02 | tail -n 20 		查看容器01、02信息(查看后面20行左右的信息)如图所示

Docker network 四种网络模式及自定义网络的简单使用介绍_tomcat_04

[root@localhost ~]# docker rm -f aaa02      								此时删除02容器 
[root@localhost ~]# docker run -it --name aaa03 ubuntu bash 创建03容器
[root@localhost ~]# docker inspect aaa03 | tail -n 20 			查看已经删除02容器的IP自动被配置成为了03容器的ip,如下图所示

PS:

表示 bridge网络模式下:docker容器内部的IP是有可能会发生改变的

(02容器宕机或者下线后,在重新重建容器,会自动配置宕机或下线容器的IP)

Docker network 四种网络模式及自定义网络的简单使用介绍_Linux_05

bridge 网卡模式案例:

1、整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫做veth,在本地主机和容器内分别创建一个虚拟接口,并让他们批次联通(这中一对接口叫做 veth pair)

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

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

例:

[root@localhost ~]# docker run -d -p 8081:8080 --name tomcat001 billygoo/tomcat8-jdk8
[root@localhost ~]# docker run -d -p 8082:8080 --name tomcat002 billygoo/tomcat8-jdk8 创建两个tomcat容器 (001、002)
[root@localhost ~]# ip addr    如图所示 多了两组网卡(该网卡与上方创建的001、002容器的内部eth0网卡匹配)

Docker network 四种网络模式及自定义网络的简单使用介绍_tomcat_06

[root@localhost ~]# docker exec -it tomcat001 bash    进入到001容器内
root@4adadd3a872c:/usr/local/tomcat# ip addr 					查看网卡确认与宿主机的网卡veth一一对应(如图所示)

如图所示:

001 容器内的网卡对应宿主机的16 veth网卡

002 容器内的网卡对应宿主机的18 veth网卡

Docker network 四种网络模式及自定义网络的简单使用介绍_docker_07


二、host

host 网络模式 直接使用宿主机的IP进行与外界进行通信,不再需要额外进行NAT转换

也就是说在host网络模式下,容器不会虚拟出自己的IP,而是直接使用宿主机的IP和端口

[root@localhost ~]# docker run -d -p 8083:8080 --network host --name tomcat003 billygoo/tomcat8-jdk8

#--network host  指定了host网络模式进行启动容器 并映射8083端口
#指定host网络模式 虽然映射了8083 但是ps 查看 端口显示为空  也会出现一个警告   如图所示

Docker network 四种网络模式及自定义网络的简单使用介绍_tomcat_08

PS: 指定了host网络模式,启动容器时 使用 -p 映射端口无效果,直接跳过-p 映射去启动容器

例:

[root@localhost ~]# docker rm -f tomcat003     删除003容器
tomcat003
[root@localhost ~]# docker run -d --network host --name tomcat003 billygoo/tomcat8-jdk8 
重新创建 不指定映射  (就不会有警告 因为host模式使用的是宿主机ip,所以无需映射端口)

[root@localhost ~]# docker inspect tomcat003 | tail -n 20
如图所示  因为host模式使用的是宿主机ip, 既不会有IP和网关地址

Docker network 四种网络模式及自定义网络的简单使用介绍_tomcat_09

验证一:在宿主机下 ip addr 查看 和进入到003容器下 ip addr 查看  网卡内容一样

Docker network 四种网络模式及自定义网络的简单使用介绍_tomcat_10

验证二:通过宿主机的IP地址访问 tomcat   如图所示:直接使用宿主机ip和8080端口


Docker network 四种网络模式及自定义网络的简单使用介绍_tomcat_11

三、none

在 none的网络模式下: 将禁用网络功能,ip addr 查看IP地质信息,将只有 lo 标识(就是本地127.0.0.1 的本地回环地址)


就是说这个docker 容器没有网卡、IP、路由等信息,只有一个lo

需要自己为docker容器配置添加网卡和IP等信息

[root@localhost ~]# docker run -d -p 8084:8080 --network none --name tomcat004 billygoo/tomcat8-jdk8
指定 none 模式 创建004容器   如图所示   none模式下 没有IP及网关,进入到容器内查看IP地址 只有一个lo的回环地址

Docker network 四种网络模式及自定义网络的简单使用介绍_Linux_12

四、container

container 网络模式 表示新建的一个容器可以指定一个已经创建过的容器共享同一个IP、端口范围等

只是共享IP等信息,其他的文件系统、服务进程等信息不会共享

PS:使用服务镜像(例如tomcat)进行创建容器并指定端口会遇到报错  

例:使用tomcat镜像创建两个容器tomcat005、tomcat006  

[root@localhost ~]# docker run -d -p 8085:8080 --name tmocat005 billygoo/tomcat8-jdk8
创建一个 005的容器,并映射8085端口

[root@localhost ~]# docker run -d -p 8086:8080  --network container:tomcat005 --name tmocat006 billygoo/tomcat8-jdk8
docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
See 'docker run --help'.
创建一个006的容器 并使用container模式共享已经创建过容器005的ip、端口等信息
上述报错内容粗俗来说就是 006和005共用一个ip 一个端口 导致冲突

使用 “Alpine” 镜像来做演示

例:

[root@localhost ~]# docker run -it --name alpine007 alpine /bin/sh
启动一个 alpine007 的容器 注意后面使用的是 /bin/sh

[root@localhost ~]# docker run -it --network container:alpine007 --name alpine008 alpine /bin/sh
启动一个 alpine008 的容器 并指定共享007的IP等信息

验证一: 是否共享成功 共用同一个网桥,且如果被共享的007容器停掉之后008容器是否还会保留共享的地址

如图所示: 进入到007、008容器内查看ip  共用了同一个ip地址

Docker network 四种网络模式及自定义网络的简单使用介绍_tomcat_13

验证二:如果被共享的007容器停掉之后008容器是否还会保留共享的地址

如图所示: 007停掉之后 008地址也会消失,只剩下本地的一个lo的回环地址

Docker network 四种网络模式及自定义网络的简单使用介绍_Linux_14

自定义网络模式

为了测试自定义网络模式 找一台测试机删除所有创建的只保留三个默认的bridge、host、none

且为了测试更直观 删除所以创建的容器 “从头来过”


在网络规划中,尽量不能将IP地址写固定死,上面也测试过,服务器停掉之后它的ip会被新创建的容器默认分配使用,为了避免使用IP地址去调用时出错,所以尽量以主机名为准,下列演示使用自定义网络之前与之后的测试。


使用自定义网络之前
[root@localhost ~]# docker run -d -p 8081:8080 --name tomcat001 billygoo/tomcat8-jdk8
[root@localhost ~]# docker run -d -p 8082:8080 --name tomcat002 billygoo/tomcat8-jdk8
创建两台容器 001 及 002  并映射端口 8081 及 80802  此时没有指定网络模式 默认的为网桥模式(bridge)

[root@localhost ~]# docker exec -it tomcat001 bash
[root@localhost ~]# docker exec -it tomcat002 bash    
进入到两台容器内 测试是否能ping通对方的ip及主机名称  如图所示

PS:如果不用自定义网络使用默认网络模式创建容器的时候,ip地址分配的都在同一网段中,所以能PING 通,但是如果使用服务 器主机名称去PING 则不通

bridge

host

none

Docker network 四种网络模式及自定义网络的简单使用介绍_Linux_15

 

使用自定义网络之后
[root@localhost ~]# docker network create aabb_network   创建一个网络
[root@localhost ~]# docker network ls 
NETWORK ID     NAME           DRIVER    SCOPE
5a63f5546b31   aabb_network   bridge    local         驱动模式还是为bridge


[root@localhost ~]# docker run -d -p 8083:8080 --network aabb_network --name tomcat003 billygoo/tomcat8-jdk8
创建003 容器 映射8083端口 加入到新创建的网络 aabb_network 中

[root@localhost ~]# docker run -d -p 8084:8080 --network aabb_network --name tomcat004 billygoo/tomcat8-jdk8
创建004 容器 映射8084端口 加入到新创建的网络 aabb_network 中

[root@localhost ~]# docker exec -it tomcat003 bash 
[root@localhost ~]# docker exec -it tomcat004 bash
进入到 003、004 容器进行对主机名的ping 测试ping测成功  如图所示

Docker network 四种网络模式及自定义网络的简单使用介绍_Linux_16

PS: 自定义网络本身就维护好了主机名和IP地址的对应关系(IP和域名都能互相PING通)


docker network 常用指令

docker network ls     			 查看当前网络列表
docker network create “xxx”  创建网络
docker network rm “xxx”			 删除网络
docker network inspect “xxx” 查看网络数据源 如下图所示

Docker network 四种网络模式及自定义网络的简单使用介绍_Linux_03

[root@localhost ~]# docker network ls            新安装的docker服务之后 使用这条命令能列出如下网络信息(默认的三个)     
NETWORK ID     NAME      DRIVER    SCOPE
ce48a1e9659b   bridge    bridge    local
c70522a93b6c   host      host      local
191eae66604e   none      null      local
[root@localhost ~]# docker network create network_01    	创建网络network_01
0c49d120fdb5d42a03fdde8a488ccc60909d73f337e083523c0303324fe4e4ee
[root@localhost ~]# docker network ls 
NETWORK ID     NAME         DRIVER    SCOPE
269dd2775e63   bridge       bridge    local
c70522a93b6c   host         host      local
0c49d120fdb5   network_01   bridge    local								#新创建的network_01
191eae66604e   none         null      local
[root@localhost ~]# docker network rm network_01					删除
network_01
[root@localhost ~]# docker network ls 
NETWORK ID     NAME      DRIVER    SCOPE
269dd2775e63   bridge    bridge    local
c70522a93b6c   host      host      local
191eae66604e   none      null      local
[root@localhost ~]#

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
HataGTb8c2ak