[云原生1] Docker网络模式的详细介绍

1. Docker 网络

1.1 Docker 网络实现原理

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),

Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP

同时Docker网桥是每个容器的默认网关。

因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。

1.2 为容器创建端口映射

端口映射:底层原理实际是做了一个DNAT转换。

bash 复制代码
#基本格式
docker run -itd  --name=为容器指定名称 -P 镜像名称
bash 复制代码
#示例
#方式1 ---- 随机映射端口(从32768开始)
docker run -d --name test1 -P nginx					
bash 复制代码
#方式2 ---- 指定映射端口
docker run -d --name test2 -p 43000:80 nginx	

2. Docker的网络模式概述

2.1 Docker的网络模式

  • Host: 容器不会虚拟出自己的网卡,配置主机的IP等,而是使用宿主机的IP和端口
  • Container: 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围
  • None: 该模式关闭了容器的网络功能。
  • Bridge: 默认为该模式,此模式会为每一个容器分配,设置IP等,并将容器连接到一个docker0 的虚拟网桥,通过docker 0 网桥以及iptables nat 表配置与宿主机通信。
  • 自定义网络

在安装Docker 时,它会自动创建三个网络:bridge(创建容器默认连接到此网络),nonehost

2.2 查看docker的网络列表

bash 复制代码
 #查看docker的网络列表
 docker network ls
 或者
 docker network list

2.3 指定容器网络模式

bash 复制代码
#使用docker run创建Docker容器时,可以用 --net 或 --network 选项指定容器的网络模式

- host模式:     使用 --net=host 指定。
- none模式:     使用 --net=none 指定。
- container模式:使用 --net=container:NAME_or_ID 指定。
- bridge模式:   使用 --net=bridge 指定,默认设置,可省略。

3. 网络模式详解

3.1 host模式

  • 相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。
  • Docker使用了Linux的Namespaces技术来进行资源隔离
  • 一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、iptable规则等都与其他的Network Namespace隔离。
  • 一个Docker容器一般会分配一个独立的Network Namespace。 但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。

容器和宿主机共享网络命名空间,但没有独立IP地址,使用宿主机的IP地址,和宿主机共享端口范围,例如宿主机使用了80端口,那么容器不能使用80端口。这种模式比较方便,但不安全。

bash 复制代码
#示例
docker run --network=host

3.2 container模式

  • 这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。
  • 新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。
  • 同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
  • 两个容器的进程可以通过lo网卡设备通信。
bash 复制代码
docker run --network=container:指定的容器ID|容器名
bash 复制代码
#示例
docker run -itd --name s1 nginx:1.12 /bin/bash			
#--name 选项可以给容器创建一个自定义名称

docker ps -a
bash 复制代码
docker inspect -f '{{.State.Pid}}' 4a472c5865be
#查看容器的进程id号
bash 复制代码
docker run -itd --name s2 --net=container:4a472c5865be nginx:1.12 /bin/bash


docker inspect -f '{{.State.Pid}}' 3dc91d1b2eb7 
#查看新创建容器进程号
bash 复制代码
ls -l /proc/63713/ns

ls -l /proc/63613/ns
#查看两个容器的 net namespace 编号

3.3 none模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。

也就是说,这个Docker容器没有网卡、IP、路由等信息。

这种网络模式下容器只有lo回环网络,没有其他网卡。

这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性

bash 复制代码
docker run -id --net=none --name s3 nginx:1.12
#指定网络模式为none

docker inspect s3
#使用inspect查看

3.4 bridge模式

bridge模式是docker的默认网络模式,不用--net参数,就是bridge模式

相当于Vmware中的 nat 模式,容器使用独立network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器连接到一个虚拟网桥上。

  1. 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。

  2. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备。

  3. Docker将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中, 以 veth* 这样类似的名字命名, 并将这个网络设备加入到 docker0 网桥中。可以通过 brctl show 命令查看。

  4. 使用 docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL 查看。

3.5 自定义网络模式

直接使用bridge模式,是无法支持指定IP运行docker的,例如执行以下命令就会报错

bash 复制代码
docker run -itd --name test3 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
bash 复制代码
#创建自定义网络
docker network create --subnet 新网段 --opt "com.docker.network.bridge.name"="新网桥名" 新网络模式名

docker run -id --network 新网络模式名 --ip 自定义IP

#可以先自定义网络,再使用指定IP运行docker
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1"  mynetwork

----------------------------------------------------------------------------------------------------------
#docker1 为执行 ifconfig -a 命令时,显示的网卡名,如果不使用 --opt 参数指定此名称,那你在使用 ifconfig -a 命令查看网络信息时,看到的是类似 br-110eb56a0b22 这样的名字,这显然不怎么好记。
#mynetwork 为执行 docker network list 命令时,显示的bridge网络模式名称。
---------------------------------------------------------------------------------------------
bash 复制代码
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 nginx:1.12 /bin/bash
#再次创建新容器

docker inspect s4
#查看详细信息
相关推荐
CopyLower2 小时前
Quarkus 与 Micronaut 在云原生开发中的优势:深度解析与实践
云原生
意倾城2 小时前
Docker数据卷
docker·容器
shykevin2 小时前
python开发Streamable HTTP MCP应用
开发语言·网络·python·网络协议·http
whgjjim2 小时前
docker迅雷自定义端口号、登录用户名密码
运维·docker·容器
tmacfrank3 小时前
网络编程中的直接内存与零拷贝
java·linux·网络
数据与人工智能律师5 小时前
虚拟主播肖像权保护,数字时代的法律博弈
大数据·网络·人工智能·算法·区块链
爱吃芝麻汤圆6 小时前
k8s之Kubebuilder 的设计哲学
云原生·容器·kubernetes
purrrew6 小时前
【Java ee初阶】HTTP(2)
网络·网络协议·http
裁二尺秋风8 小时前
k8s(12) — 版本控制和滚动更新(金丝雀部署理念)
云原生·容器·kubernetes
项目題供诗8 小时前
黑马k8s(六)
云原生·容器·kubernetes