当前位置: 首页 > ops >正文

docker 网络配置

docker网络模式

网络配置向导:Networking | Docker Docs

命令参考:docker network | Docker Docs

删除所有容器

docker rm -f $(docker ps -aq)
  • docker ps -aq 查询所有容器的id

    • -a 全部

    • -q 只显示容器id

查看网络信息

  • 在没有安装docker之前的网络信息

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:4d:7c:d8 brd ff:ff:ff:ff:ff:ffinet 192.168.19.18/24 brd 192.168.19.255 scope global noprefixroute dynamic ens33valid_lft 1762sec preferred_lft 1762secinet6 fe80::98e4:fa98:651c:a99d/64 scope link noprefixroute valid_lft forever preferred_lft forever
​

1: lo: local的简写,一般指本地环回接口。

2: ens33: 网卡

网络启动过程

Docker 服务启动时会首先在主机上自动创建一个docker0虚拟网桥, 实际上是一个Linux 网桥。网桥可以理解为一个软件交换机, 负责挂载其上的接口之间进行包转发。同时, Docker 随机分配一个本地未占用的私有网段(在RFC1918 中定义)中的一个地址给docker0接口。比如典型的172.17.0.0/16 网段, 掩码为255.255.0.0。此后启动的容器内的网口也会自动分配一个该网段的地址。当创建一个Docker 容器的时候, 同时会创建了一对veth pair互联接口。当向任一个接口发送包时, 另外一个接口自动收到相同的包。互联接口的一端位于容器内, 即eth0; 另一端在本地并被挂载到docke0网桥, 名称以veth 开头(例如vethAQI2QT)。通过这种方式,主机可以与容器通信, 容器之间也可以相互通信。如此一来,Docker 就创建了在主机和所有容器之间一个虚拟共享网络

docker安装成功后,会自动创建三个网络,可以通过如下的方式查看:

[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
e23d9048234e        bridge              bridge              local
ed753a7e774d        host                host                local
52634ec7e48f        none                null                local

在运行容器时可以通过--net参数指定网络模式,例如:

  • host模式: --net=host 容器不会虚拟自己的网卡,使用宿主机的ip和端口

  • none模式: --net=none 该模式等同于关闭容器的网络功能,一般在不需要网络的批处理任务中才使用

  • bridge模式: --net=bridge 默认值,如果指定--net参数,则docker就会采用这种模式,这种模式也是最强大灵活,使用的最广的网络模式。

模式是否支持多主机南北通信机制东西通信机制
bridge宿主机端口绑定通过linux bridge
host按宿主机网络通信按宿主机网络通信
none无法通信只能用link通信
自定义网络

bridge模式

Docker每次创建容器都会同时创建一组互联的网络接口,你可以理解为一根管道的两端, 这组接口一端作为容器的eth0接口,另一端命名类似于veth966865c@if100这样的名字,作为宿主机的一个端口。可以将veth接口的理解为虚拟网线的一端,这个虚拟网线一端插在名为docker0的网桥上,另一端插到容器中。通过这种方式Docker创建了一个虚拟子网,这个虚拟子网被宿主机和所有的Docker容器共享。

注: 可以安装bridge-utils工具查看网桥信息 如: yum install -y bridge-utils 查看网桥信息: brctl show

内置bridge模式

查看宿主机ip信息

  • 安装docker之后的ip信息

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:4d:7c:d8 brd ff:ff:ff:ff:ff:ffinet 192.168.19.18/24 brd 192.168.19.255 scope global noprefixroute dynamic ens33valid_lft 1532sec preferred_lft 1532secinet6 fe80::98e4:fa98:651c:a99d/64 scope link noprefixroute valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:c4:21:e3:40 brd ff:ff:ff:ff:ff:ffinet 172.17.0.13/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:c4ff:fe21:e340/64 scope link valid_lft forever preferred_lft forever
​

1: lo: local的简写,一般指本地环回接口。

2: ens33: 网卡

3: docker0: 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器都会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

启动多个centos

docker run -itd --name c1 centos
docker run -itd --name c2 centos
  • 容器默认使用bridge网络模式

查看宿主机ip

  • ip addr

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:4d:7c:d8 brd ff:ff:ff:ff:ff:ffinet 192.168.19.18/24 brd 192.168.19.255 scope global noprefixroute dynamic ens33valid_lft 1335sec preferred_lft 1335secinet6 fe80::98e4:fa98:651c:a99d/64 scope link noprefixroute valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:c4:21:e3:40 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:c4ff:fe21:e340/64 scope link valid_lft forever preferred_lft forever
27: 3hbbc9cae@if26: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 22:a3:38:0a:65:8c brd ff:ff:ff:ff:ff:ff link-netnsid 0inet6 fe80::20a3:38ff:fe0a:658c/64 scope link valid_lft forever preferred_lft forever
29: veth9dfb1c8@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether ba:dc:83:27:e8:1a brd ff:ff:ff:ff:ff:ff link-netnsid 1inet6 fe80::b8dc:83ff:fe27:e81a/64 scope link valid_lft forever preferred_lft forever
​

27: vethbbc9cae@if26:

29: veth9dfb1c8@if28:

查看容器ip

[root@localhost ~]# docker exec -it c1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever

26: eth0@if27:

查看容器连网方式

  • 查看网关信息

    • 需要先安装yum install -y bridge-utils

[root@localhost ~]# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.0242c421e340   no      veth9dfb1c8vethbbc9cae
​
  • 查看bridge网络模式详细

[root@localhost ~]# docker network inspect bridge
[{"Name": "bridge","Id": "a217fc10fba8f50de80148a09ad7c7d162174317d2ee8e553a23fef881ac7998","Created": "2022-08-18T15:15:52.632030767+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "172.17.0.0/16","Gateway": "172.17.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"8eb7c3286fc84a5671529d1091e1028f307a37a7198358b1f1d786f64ef01b9e": {"Name": "c1","EndpointID": "32fe7560b0c2014ee4cfa7180b17acab98c00ec1efb24bb363add3f1faaa1d37","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""},"ec82fcceb0429e4e8e004ffe4b401328c132384fe5093a1c572fe2b7b2fe7e6c": {"Name": "c2","EndpointID": "88aa3e718f51decece193c057f6bca11f37bde2983e1b2648841effd1c0e4ee2","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","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","com.docker.network.driver.mtu": "1500"},"Labels": {}}
]
​
  • 查看容器的详细

    • docker inspect c1

测试

  • 在c1容器中测试连接c2容器

[root@localhost ~]# docker exec c1 ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.077 ms
  • 在c1容器中测试连接外网

[root@localhost ~]# docker exec c1 ping www.baidu.com
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=127 time=30.3 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=127 time=28.8 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=127 time=27.7 ms
  • 在宿主机中连接容器

[root@localhost ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.062 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.069 ms
  • 外网不能访问容器

注意

  • ip地址不固定,且不能指定

  • 地址不能用服务名(容器名)

自定义bridge模式

创建

创建一个新的网络可以使用如下的命令:

##示例1
docker network create mynet1
##示例2
docker network create --subnet=172.18.0.0/16 mynet2
##示例3
docker network create  --subnet 172.22.16.0/24 --gateway 172.22.16.1 mynet3

172.22.16.0/24其实这种形式就是用CIDR(无类别域间路由选择,Classless and Subnet Address Extensions and Supernetting))的形式表示的一个网段,或者说子网。我们知道确定一个子网需要知道主机地址和子网掩码,但用CIDR的形式,可以简单得到两个数值。举例说吧,192.168.0.0/24”就表示,这个网段的IP地址从192.168.0.1开始,到192.168.0.254结束(192.168.0.0和192.168.0.255有特殊含义,不能用作IP地址);子网掩码是255.255.255.0。

192.168.0.0/16: 前16位为网络号,后16位为主机号

172.22.16.0/24:前24位为网络号,后8位为主机号

查看

可以使用如下的方式来查看网络的详细信息

docker network ls
docker network inspect appnet

删除

docker  network rm appnet

使用

1)启动镜像时指定--net参数

docker run -it --name test --net=appnet  imagename

2)也可以将运行中的容器加入/断开网络

#加入
docker network connect appnet test
docker network disconnect appnet test
  • appnet 需要加入的网络名

  • test 需要加入到网络的容器名

小结

Docker网络bridge桥接模式,是创建和运行容器时默认模式。这种模式会为每个容器分配一个独立的网卡,桥接到默认或指定的bridge上,同一个Bridge下的容器下可以互相通信的。我们也可以创建自定义bridge以满足个性化的网络需求。

bridge模式自定义 bridge模式
是否可删除不可删除可删除
是否可以通过容器名通信不可以可以
指定容器ip不可以可以

host模式

Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。

host模式类似于Vmware的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

如下图所示:容器与主机在相同的网络命名空间下面,使用相同的网络协议栈,容器可以直接使用主机的所有网络接口

使用

使用--net host参数来指定网络模型使用host模式

docker run --name=nginx01 --net=host -p 80:80 -d nginx

注意:宿主机端口需要和容器端口一样

查看容器链路接口,与主机一致

docker exec -it nginx01 cat /etc/hosts

这时外界要访问容器中的应用,则直接使用{host0.ip}:80即可,不用任何NAT转换,就像直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

curl {host0.ip}

小结

host 模式简单并且性能高,host 模式下面的网络模型是最简单和最低延迟的模式,容器进程直接与主机网络接口通信,与物理机性能一致,host 不利于网络自定配置和管理,并且所有主机的容器使用相同的IP。也不利于主机资源的利用。对网络性能要求比较高,可以使用该模式。否则应该使用其他模式

外部访问docker容器

bridge模式

docker run -itd -p 7001:7001 镜像ID
-p参数可以出现多次,绑定多个端口号
docker run -itd -p 8080:8080 -p 8088:8088 镜像ID

当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口

host模式

docker run -itd --net=host 镜像ID

注1:不需要添加-p参数,因为它使用的就是主机的IP和端口,添加-p参数后,反而会出现以下警告: WARNING: Published ports are discarded when using host network mode 注2:宿主机的ip路由转发功能一定要打开,否则所创建的容器无法联网! echo 1 > /proc/sys/net/ipv4/ip_forward

附录

lo:

lo: local的简写,一般指本地环回接口。

lo接口的作用

本地一个进程发起连接,到一个本地的daemon监听的内网IP地址(eth1: 10.1.1.1)的端口(8085),此时在eth1上是抓不到包的,在 lo 上抓到,说明使用的是本地回环接口lo,而网络层的IP地址则是内网IP地址.

lo其实是一个系统虚拟的环回接口,它的IP地址是127.0.0.1,利用这个接口可以实现系统内部发送和接收数据,所以一般情况下我们使用:ping 127.0.0.1 是可以ping通的,因为这其实就是系统内部建立连接。

127.0.0.1,通常被称为本地回环地址(Loop back address),不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口。通常在不安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络协议、基本数据接口等是否正常的。

其主要作用有两个:

一是测试本机的网络配置,能PING通127.0.0.1说明本机的网卡和IP协议安装都没有问题;

另一个作用是某些SERVER/CLIENT的应用程序在运行时需调用服务器上的资源

ens33

ens33为自动备援模式,名称定为ens33。 网卡的编号存在一定的规则,网卡的代号与网卡的来源有关。Linux继承了Unix以网络为核心的设计思想,为一个性能稳定的多用户网络操作系统。

eno1:代表由主板bios内置的网卡。 ens1:代表有主板bios内置的PCI-E网卡。 enp2s0: PCI-E独立网卡。 eth0:如果以上都不使用,则回到默认的网卡名。

http://www.xdnf.cn/news/19478.html

相关文章:

  • 【高级】系统架构师 | 2025年上半年综合真题
  • 硬件开发_基于Zigee组网的果园养殖监控系统
  • 56_基于深度学习的X光安检危险物品检测系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
  • aws上创建jenkins
  • 力扣 23 912题(堆)
  • JAVA 面试宝典02
  • 工业飞拍技术:高速生产线的 “动态抓拍神器”,到底牛在哪?
  • 20250829的学习笔记
  • 基于GCN图神经网络的光伏功率预测Matlab代码
  • Spark实现推荐系统中的相似度算法
  • Proteus 仿真 + STM32CubeMX 协同开发全教程:从配置到仿真一步到位
  • 盟接之桥说制造:守正出奇:在能力圈内稳健前行,以需求导向赢得市场
  • 基于51单片机220V交流电流检测系统过流阈值报警设计
  • 增强现实—Gated-attention architectures for task-oriented language grounding
  • 从零开始的python学习(九)P134+P135+P136+P137+P138+P139+P140
  • 【LeetCode热题100道笔记+动画】颜色分类
  • 【面试场景题】如何快速判断几十亿个数中是否存在某个数
  • python-pptx 库(最常用,适合生成/修改 PPT 文件)
  • 深入解析quiche开源项目:从QUIC协议到云原生实践
  • 大模型微调与LoRA/QLoRA方法解析
  • 四、练习1:Git基础操作
  • Python爬虫实战:研究Colormap,构建优质色彩方案数据采集和分析系统
  • 学习:uniapp全栈微信小程序vue3后台-暂时停更
  • C# Task 入门:让你的程序告别卡顿
  • 一文读懂k8s的pv与pvc原理
  • 【Proteus仿真】8*8LED点阵控制系列仿真——循环显示数字/按键控制显示图案
  • 【Netty4核心原理⑭】【Netty 内存分配 ByteBuf❷】
  • 计算机组成原理1 组成与各部件流程 9.1
  • 国内服务器如何安装docker或者是1panel
  • 鸿蒙总改变字体大小设置