首页 > 系统相关 >Linux docker的网络隔离方案和网络模式的使用问题

Linux docker的网络隔离方案和网络模式的使用问题

时间:2023-02-24 10:02:49浏览次数:41  
标签:容器 00 网络 ff Linux docker root


       Linux docker的网络隔离方案和网络模式的使用问题

docker的网络管理比较复杂,是由于它的网络是基于Linux内核的namespace开始。

docker刚安装完毕后,最开始的docker网络模式只有三种,如下:

 

#查看Docker默认的三种网络
root@centos6:~$ docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
7f6b9cbd3eec        bridge              bridge              local               
0cb106f52e66        host                host                local               
cfb50541161b        none                null                local

network ID 是系统随机分配的,不必过于关注,name是可以自定义的,driver,也就是驱动类型,比较常用的有

bridge,host,null,macvlan。此时的宿主机上应该会有两个虚拟网卡,名称为 docker0和vetha98e3a4,这个vetha98e3a4名字不是固定的,也是随机的。如果不指定网络模式启动一个镜像,那么,镜像使用的IP会为172.17.0.2,快速查询容器使用的IP:

docker inspect -f '{{ .NetworkSettings.Networks.容器所使用的网络名称}}' 容器ID

容器所使用的网络名称指的是 运行容器时所指定的网络模式所对应的网络名称,如果启动容器时没有指定,默认使用的是bridge这个网络名称,也就是上面  docker network ls 命令所查询的 name 中的 bridge。

前面也说了 ,可以自定义网络驱动,如何自定义?

docker network create -d bridge --subnet=172.19.0.0/24   --gateway=172.19.0.1 mynet  这样就自定义了一个驱动为bridge的名称为mynet的,网段为172.19.0.0,网关为172.19.0.1的网络模式。(不能设定为宿主机的网段,别的网段任意指定,不过通常还是使用172.x.0.0网段)

在执行之前的查询网络命令:docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
aa0502db03d3        bridge              bridge              local
14950d3c5ac1        host                host                local
53e6c0e615ab        mynet               bridge              local
e65fc7e1ed66        none                null                local

为什么说是网络模式呢? 如果运行容器的时候指定了 网络模式为 mynet这个,那么  所有使用该网络模式启动的容器都是同一个网络段。这样就达到了容器之间的网络隔离。(由于是桥接到了宿主机,因此只能和宿主机通信,无法和宿主机以往的主机通信)

那么,现在启动一个容器,指定使用mynet网络模式:

[root@centos7 first]# docker run --net mynet -itd --name mycentos1 centos
69a45a00631834206ead0df18dc685c3fff93fedc7d29850cfdae8f717ea9b4a
[root@centos7 first]# docker exec -it 69a45 /bin/bash
[root@69a45a006318 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:13:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.19.0.2/16 brd 172.19.255.255 scope global eth0
valid_lft forever preferred_lft forever

 可以发现,指定了网络模式为自定义的mynet(使用的驱动是bridge)后,新启动的容器名称为mycentos2的

网络段为172.19.0.0/16了。在启动一个容器呢?

[root@centos7 first]# docker run --net mynet -itd --name mycentos2 centos
d7bc415cd8e8283c90ed4c07c512ba740b7130b7aa2fb414db1cb4df4bff1ca8
[root@centos7 first]# docker exec -it d7bc4 /bin/bash
[root@d7bc415cd8e8 /]# ifconfig
bash: ifconfig: command not found
[root@d7bc415cd8e8 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:13:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.19.0.3/16 brd 172.19.255.255 scope global eth0
valid_lft forever preferred_lft forever

使用默认的网络模式启动一个新的容器呢?

 

 

[root@centos7 first]# docker run  -itd --name mycentos3 centos
e2c92188cb1eaf0f83c414576b6507d66ad6c62831858ac5f23188097a59fb04
[root@centos7 first]# docker exec -it e2c92 /bin/bash
[root@e2c92188cb1e /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

这时候的容器名称为mycentos3的IP为172.17.0.3.  总结一下:

mycentos1 的IP为172.19.0.2,使用的为mynet网络模式。容器内使用的虚拟网卡为 eth0@if12

mycentos2 的IP为172.19.0.3    使用的为mynet网络模式。容器内使用的虚拟网卡为 eth0@if14

mycentos2 的IP为172.17.0.3    使用的为默认的bridge模式。容器内使用的虚拟网卡为 eth0@if16

可以得出一个结论,容器内使用的网卡形式为eth0,后面接编号以区分不同的容器网络,主要是使用的IP是从172.17.0.2开始,下一个网络模式就使用172.17.0.2开始,通过自定义网络模式,在启动容器的时候指定使用哪个网络模式从而将需要一个网段的容器启动到一起,这样就人为的达到了容器之间的网络隔离。(毫无疑问,172.17.0.0网段 是不能和172.17.0.0网段通信的)

===============================================================================================

macvlan模式的建立:

需要真实的宿主机的子网网段,宿主机的网关,宿主机的网卡名称

[root@centos7 first]# docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=ens33 myvlan
a9ebbb73eedabcc7f6b02c5b7456195366fceec4775dcf249e181c243bc1ac26
[root@centos7 first]# docker network ls
NETWORK ID NAME DRIVER SCOPE
aa0502db03d3 bridge bridge local
14950d3c5ac1 host host local
53e6c0e615ab mynet bridge local
a9ebbb73eeda myvlan macvlan local
e65fc7e1ed66 none null local

macvlan模式的使用:

root@centos7 first]# docker run -itd --net myvlan --name ^Ccentos4 centos
[root@centos7 first]#
[root@centos7 first]# docker run -itd --net myvlan --name mycentos4 centos
31dbed41e48417f3a6e5cc002fb3d86f0f788a4a8e76fc2b50d6932548de312c
[root@centos7 first]# docker exec -it 31dbe /bin/bash
[root@31dbed41e484 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
20: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 02:42:c0:a8:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever

容器和宿主机在一个网段了,相当于一个真实的仿真的虚拟机了。

=========================================================================

docker run -itd --name mycentos5 --net=none centos

#已无网络模式启动一个容器,那么这个容器没有网络连接。彻底的隔离了。

 

标签:容器,00,网络,ff,Linux,docker,root
From: https://blog.51cto.com/u_15966109/6082659

相关文章

  • Linux centos7升级内核(两种方法:内核编译和yum更新)
          Linuxcentos7升级内核(两种方法:内核编译和yum更新)Linux的内核概念不用说大家也很清楚,正是内核版本的不同,才有Linux发行版本的说法,现在主流的centos应该都......
  • docker commit 和docker build (实战使用以及区别)
                     dockercommit和dockerbuild(实战使用以及区别)还是需要从docker三要素说起,docker的镜像和容器是指的一种实例状态,镜......
  • Linux docker的网络独立IP的配置(pipework实现方式)
         Linux docker的网络独立IP的配置(pipework实现方式)docker一个镜像作为容器启动后,通常会在宿主机同时生成一个名称为docker0的虚拟网卡,该网卡作为桥接网卡......
  • 网络时间同步设备(时钟同步)产品的功能及技术参数
    网络时间同步设备(时钟同步)产品的功能及技术参数网络时间同步设备(时钟同步)产品的功能及技术参数京准电子科技官微——ahjzsz 前言   随着计算机和网络通信技术的飞......
  • docker 安装rabbitmq3.11-management
    1,dockerpullrabbitmq:3.11-managementmanagement版本表示带有web管理后台2,创建映射目录mkdir-p/docker/rabbitmq/data3,启动dockerrun-p5672:5672-p15672......
  • 吴恩达神经网络与深度学习——深度学习引言
    一、深度学习引言1.应用对于图像应用,我们经常在神经网络上使用卷积(ConvolutionalNeuralNetwork),通常缩写为CNN。对于序列数据,例如音频,语言,英语和汉语字母表或单词,......
  • [人工智能] 贝叶斯网络-条件独立性判断(D-separation)
    贝叶斯网络的一个核心点就是条件独立性的存在通过条件独立性,就能使用贝叶斯网络来代替复杂的联合概率分布。如何判断贝叶斯网络中任意两个随机变量的独立性呢?D-separatio......
  • 在 银河麒麟操作系统 v10 中离线安装 docker 环境
    详情请参考以下链接:https://blog.csdn.net/qq_30665009/article/details/125938033https://little-star.love/posts/6da98871简略版本:#查看系统版本cat/etc/os-rel......
  • Linux学习总结
    Linux学习笔记一、基本Liunx命令二、管道符、重定向与环境变量三、Vim编辑器四、Shell命令脚本五、用户身份与文件权限六、存储结构与磁盘划分七、RAID与LVM磁盘阵列技......
  • linux 移植 i2CTools
    一、I2C-Tools介绍i2c-tools工具是一个专门用来调试i2c的。并且是开源的。它可以:1、检测有几组i2c总线在系统上。2、查看挂载在i2c上面设备寄......