Docker的网络模式和网络隔离

简介: RT

一、Docker的网络模式

docker的网络模式有Bridge、Host、Container、None四种模式

Bridge

当docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的docker容器默认会连接到这个虚拟网桥上;虚拟网桥的工作方式类似于物理交换机,主机上的所有容器就通过虚拟网桥连在一个二层网络中。
默认,Docker会从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
在主机上创建一对虚拟网卡br设备,docker将br设备的一端放在新创建的容器中,并命名为eth0(容器内部网卡),另一端放在主机中,以br-xxx这样类似的名称命名,并将这个网络设备加入到docker0(网桥中)。
如果有多个容器之间需要互相通信,使用Docker Compose或k8s编排工具。

[root@919 ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
br-3721cd5a380d        8000.0242fae4b5b4    no        
br-c1a81e911a92        8000.0242bf8de935    no        
docker0                8000.0242ce2c4c07    no    

Host

如果启动容器时使用host模式,那么这个容器将不会获取一个独立的“network namespace”,而是和宿主机共用一个“network namespace”。容器将不会虚拟出自己的网卡、配置自己IP等,而是直接使用宿主机的IP和端口;但是,容器的其他方面,如文件系统、系统进程等还是和宿主机隔离开的。

Container

这个模式指定新创建的容器和已经存在的容器共享一个“network namespace”,而不是和宿主机共享;新创建的容器也不会自己创建网卡、IP等。同样两个容器除了网络外,其他的还都是属于隔离;两个容器的进程可以通过宿主机的lo网卡设备进行通信。

[root@919 ~]# docker run -it --name centos1 centos1/centos:v1

[root@5b475c57a4b0 /]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@5b475c57a4b0 /]# read escape sequence

[root@919 ~]# docker run -it --name centos2 --net=container:centos1 centos1/centos:v1

[root@5b475c57a4b0 /]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

None

使用none模式,docker容器拥有自己的network namespace,但是,并不为docker容器进行任何网络配置;也就是说,这个docker容器没有网卡、IP、路由等信息,需要我们自己为docker容器添加网卡、配置IP等。

二、Docker网络隔离、独立IP设置

在通常情况下,docker使用网桥(Bridge)与NAT的通信模式

netfilter规则

(1)容器访问外部网络

# SNAT
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE

(2)外部网络访问容器

# DNAT
docker run -d -p 80:80 apache

iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER

iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

docker网络模式修改

(1)docker进程网络修改
只要修改了进程网络后面的容器都会生效,主从的关系

-b,--bridge:
指定docker使用的网桥设备,默认情况下docker会自动创建和使用docker0网桥设备,通过此参数可以使用已经存在的设备。

[root@919 ~]# ifconfig docker0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:ceff:fe2c:4c07  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ce:2c:4c:07  txqueuelen 0  (Ethernet)
        RX packets 35126  bytes 6686759 (6.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 42464  bytes 86634276 (82.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

--bip:
指定docker0的IP和掩码,使用标准的CIDR形式,如10.10.10.10/24

--dns:
配置容器的DNS,在启动docker进程时添加,所有容器全部生效

(2)docker容器网络修改
只在启动的容器生效

--dns:
用于指定启动的容器的DNS

--net:
用于指定容器的网络通讯方式,有如下四个值

  • bridge:docker默认方式,网桥模式
  • none:容器没有网络栈
  • container:使用其他容器的网络栈,docker容器会加入其他容器的network namespace
  • host:表示容器使用host的网络,没有自己独立的网络栈,容器可以完全访问host网络,非常不安全。
docker run -it --name centos1 --net=none centos
[root@919 ~]# docker run -it --name centos1 --net=none centos
[root@5b16b5f20c58 /]# ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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

(3)暴露端口

-p/P选项的使用格式

-p <containerport> # 将指定的容器端口映射至主机所有地址的一个动态端口
-p <hostport>:<containerport> # 映射至指定的主机端口
-p <IP>::<containerport> # 映射至指定的主机的IP的动态端口
-p <IP>:<hostport>:<containerport> # 映射至指定主机的IP的主机端口
-P # 暴露所需要的所有端口

docker port 可以查看容器当前的映射关系

[root@919 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
c99a91d6250d        centos              "/usr/sbin/init"    9 minutes ago       Up 9 minutes        0.0.0.0:32768->80/tcp   nginxv3
491ab139e4fd        centos              "/usr/sbin/init"    18 minutes ago      Up 18 minutes                               nginxv2
[root@919 ~]# docker port nginxv3
80/tcp -> 0.0.0.0:32768

(4)自定义docker0网桥的网络地址
修改/etc/docker/daemon.json

    {
        "bip":"192.168.1.5/24",
        "fixed-cidr":"10.20.0.0/16",
        "fixed-cidr-v6":"2001:db8::/64",
        "mtu":"1500",
        "default-gateway":"10.20.1.1",
        "default-gateway-v6":"2001:db8:abcd::89",
        "dns":["10.20.1.2","10.20.1.3"]
    }

常见隔离方式

网络命令空间隔离网络

docker network ls 查看当前可用的网络类型
docker network create -d <类型> <网络空间名称>

类型:

overlay network    # 覆盖型网络,不同的主机之间可以互相通信,需要借助一定的设备
bridge network  # 网桥

创建两个网络

[root@919 ~]# docker network create -d bridge lamp
3721cd5a380de3f27bc3b32c9dfd34f8262aac0917e30799085fc11d0d0d2068
[root@919 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
2f6d2d0b2eb2        bridge              bridge              local
8ff53f37566a        host                host                local
3721cd5a380d        lamp                bridge              local
c1a81e911a92        lnmp                bridge              local
b897072c940a        none                null                local

[root@919 ~]# ifconfig 
br-3721cd5a380d: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet6 fe80::42:faff:fee4:b5b4  prefixlen 64  scopeid 0x20<link>
        ether 02:42:fa:e4:b5:b4  txqueuelen 0  (Ethernet)
        RX packets 3  bytes 182 (182.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 838 (838.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-c1a81e911a92: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.19.0.1  netmask 255.255.0.0  broadcast 172.19.255.255
        inet6 fe80::42:bfff:fe8d:e935  prefixlen 64  scopeid 0x20<link>
        ether 02:42:bf:8d:e9:35  txqueuelen 0  (Ethernet)
        RX packets 41405  bytes 23602140 (22.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 41405  bytes 23602140 (22.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

运行容器,分别指定网络为刚才创建的名为lamp和lnmp的网络

[root@919 ~]# docker run -it  --name cento01 --network=lamp centos
[root@744bbf4fa6c0 /]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.2  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:ac:12:00:02  txqueuelen 0  (Ethernet)
        RX packets 1402  bytes 8858081 (8.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1395  bytes 95487 (93.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@919 ~]# docker run -it  --name cento02 --network=lnmp centos
[root@0f79003592cd /]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.0.2  netmask 255.255.0.0  broadcast 172.19.255.255
        ether 02:42:ac:13:00:02  txqueuelen 0  (Ethernet)
        RX packets 2011  bytes 8895817 (8.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1673  bytes 115079 (112.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

此时两个容器之间无法进行通信,但依旧可以连接外网

[root@0f79003592cd /]# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
^C
--- 172.18.0.2 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 1005ms

[root@0f79003592cd /]# ping www.baidu.com
PING www.a.shifen.com (182.61.200.7) 56(84) bytes of data.
64 bytes from 182.61.200.7 (182.61.200.7): icmp_seq=1 ttl=54 time=4.48 ms
目录
相关文章
|
2月前
|
JavaScript
Vue中Axios网络请求封装-企业最常用封装模式
本教程介绍如何安装并配置 Axios 实例,包含请求与响应拦截器,实现自动携带 Token、错误提示及登录状态管理,适用于 Vue 项目。
114 1
|
4月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
265 3
|
4月前
基于Reactor模式的高性能网络库github地址
https://github.com/zyi30/reactor-net.git
121 0
|
2月前
|
安全 测试技术 虚拟化
VMware-三种网络模式原理
本文介绍了虚拟机三种常见网络模式(桥接模式、NAT模式、仅主机模式)的工作原理与适用场景。桥接模式让虚拟机如同独立设备接入局域网;NAT模式共享主机IP,适合大多数WiFi环境;仅主机模式则构建封闭的内部网络,适用于测试环境。内容简明易懂,便于理解不同模式的优缺点与应用场景。
362 0
|
5月前
|
Docker 容器
Docker网关冲突导致容器启动网络异常解决方案
当执行`docker-compose up`命令时,服务器网络可能因Docker创建新网桥导致IP段冲突而中断。原因是Docker默认的docker0网卡(172.17.0.1/16)与宿主机网络地址段重叠,引发路由异常。解决方法为修改docker0地址段,通过配置`/etc/docker/daemon.json`调整为非冲突段(如192.168.200.1/24),并重启服务。同时,在`docker-compose.yml`中指定网络模式为`bridge`,最后通过检查docker0地址、网络接口列表及测试容器启动验证修复效果。
|
4月前
|
缓存 索引
基于Reactor模式的高性能网络库之缓冲区Buffer组件
Buffer 类用于处理 Socket I/O 缓存,负责数据读取、写入及内存管理。通过预分配空间和索引优化,减少内存拷贝与系统调用,提高网络通信效率,适用于 Reactor 模型中的异步非阻塞 IO 处理。
184 3
|
11月前
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
409 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
9月前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
949 44
|
9月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
301 20
|
9月前
|
网络协议 测试技术 Linux
Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
gev 是一个基于 epoll 和 kqueue 实现的高性能事件循环库,适用于 Linux 和 macOS(Windows 暂不支持)。它支持多核多线程、动态扩容的 Ring Buffer 读写缓冲区、异步读写和 SO_REUSEPORT 端口重用。gev 使用少量 goroutine,监听连接并处理读写事件。性能测试显示其在不同配置下表现优异。安装命令:`go get -u github.com/Allenxuxu/gev`。
206 0