Docker的网络(三)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Docker的网络

著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

从Linux的network namespace开始,通过详细讲解Docker的内置网络hostbridge,来给大家展示不同容器之间网络的隔离和通信是如何实现的。

网络基础回顾

Docker bridge详解

docker bridge network是怎么映射到主机IP地址进行上网的呢?通过本机 ip a命令我们可以看到如下内容: 其中docker0networkspace是本机网卡,veth26d281@if13有自己独立的networkspace,同时也是docker0本机网卡的一个接口。

3:eth1:< BROADCAST , MULTICAST , UP , LOWER _ UP > mtu 1500 qdisc pfifo _ fast state UP ql 
 link / ether 08:00:27:54:75:80 brd ff : ff : ff : ff : ff : ff 
 inet 192.168.205.10/24 brd 192.168.205.255 scope global eth1
 valid _ lft forever preferred _ lft forever 
inet6fe80:: a 00:27 ff :fe54:7580/64 scope link 
 valid _ lft forever preferred _ lft forever 
4:docker0:< BROADCAST , MULTICAST , UP , LOWER _ UP > mtu 1500 qdisc noqueue state UP 
 link / ether 02:42:30:1b: ld :5e brd ff : ff : ff : ff : ff : ff 
 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
 valid _ lft forever preferred _ lft forev 
inet6fe80::42:30ff:fe1b:1d5e/64 scope link
 valid _ lft forever preferred _ lft forever 
:veth26d281c@if13:< BROADCAST , MULTICAST , UP , LOWER _ UP > mtu 1500 qdisc noqueue m 
 Link / ether 62:cb:56:9e:f9:4f brd ff : ff : ff : ff : ff : ff link - netnsid 2
inet6fe80::60cb:56ff:fe9e:f94f/64 scope link 
 valid _ lft forever preferred _ lft forever 

通过docker exec test1 ip a 进入查看dokcer容器test1的ip network,其中eth0@if14veth26d281@if13是一对,往下看

3:eth1:< BROADCAST , MULTICAST , UP , LOWER _ UP > mtu 1500 qdisc pfifo _ fast state UP ql 
 link / ether 08:00:27:54:75:80 brd ff : ff : ff : ff : ff : ff 
 inet 192.168.205.10/24 brd 192.168.205.255 scope global eth1
 valid _ lft forever preferred _ lft forever 
inet6fe80:: a 00:27 ff :fe54:7580/64 scope link 
 valid _ lft forever preferred _ lft forever 
4:docker0:< BROADCAST , MULTICAST , UP , LOWER _ UP > mtu 1500 qdisc noqueue state UP 
 link / ether 02:42:30:1b: ld :5e brd ff : ff : ff : ff : ff : ff 
 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
 valid _ lft forever preferred _ lft forev 
inet6fes0::42:30ff:fe1b:1d5e/64手激:1986
 valid _ lft forever preferred _ lft forever 
:veth26d281c@if13:< BROADCAST , MULTICAST , UP , LOWER _ UP > mtu 1500 qdisc noqueue m 
 Link / ether 62:cb:56:9e:f9:4f brd ff : ff : ff : ff : ff : ff link - netnsid 2
inet6fe80::60cb:56ff:fe9e:f94f/64 scope link 
 valid _ lft forever preferred _ lft forever 

通过brctl show 可以看到它们之间的关联关系,因为veth26d281docker0的一个接口,又因为上面的eth0@if14veth26d281@if13是一对,所以可以通过这个接口转换成本机宿主的ip去访问Internt

[ vagrant @ docker -node1~]$ brctl show 
 bridge name 
 bridge id 
docker0
8000.0242301b1d5e
 STP enabled 
no
 interfaces veth26d281c

如下是 docker 网络通信模型图

b20c9a5149783cd1ab8cc204da7a817.png

容器之间的link

我们在使用Docker的时候,经常可能需要连接到其他的容器,比如:web服务需要连接数据库。按照往常的做法,需要先启动数据库的容器,映射出端口来,然后配置好客户端的容器,再去访问。其实针对这种场景,Docker提供了--link 参数来满足。

docker run -d --name test2 --link test1 busybox

更多link内容参考

容器的端口映射

在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因为没有端口。 端口映射的语句是

docker run -d --name redis -p [hostPort]:[containerPort] redis:latest

-p参数会分配容器的端口映射到宿主机端口。

hostPort表示宿主机的端口。

containerPort表示虚拟机的端口   。

容器的4种网络模式

我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:

  • host模式,使用--net=host指定。
  • container模式,使用--net=container:[containerName]/[containerId]指定。
  • none模式,使用--net=none指定。
  • bridge模式,使用--net=bridge指定,默认设置。

下面分别介绍一下Docker的各个网络模式:

  1. host模式
    众所周知,Docker使用了Linux的 Namespaces 技术来进行资源隔离,如 PID Namespace隔离进程,Mount Namespace 隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。
    例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的 Docker 容器,监听 tcp80 端口。当我们在容器中执行任何类似 ifconfig 命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT 转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
  2. container模式
    在理解了 host 模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
  3. none模式
    这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
  4. bridge模式
    bridge模式是 Docker 默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。

Overlay和Underlay的通俗解释

  • 跨主机网络意味着将不同主机上的容器用同一个虚拟网络连接起来。这个虚拟网络的拓扑结构和实现技术就是网络模型。
  • Docker overlay 如名称所示,是 overlay 网络,建立主机间 VxLAN 隧道,原始数据包在发送端被封装成VxLAN 数据包,到达目的地后在接收端解包。
  • Macvlan 网络在二层上通过 VLAN 连接容器,在三层上依赖外部网关连接不同 macvlan。数据包直接发送,不需要封装,属于 underlay 网络。
  • Flannel 我们讨论了两种 backend:vxlan 和 host-gw。vxlan 与 Docker overlay 类似,属于 overlay 网络。host-gw 将主机作为网关,依赖三层 IP 转发,不需要像 vxlan 那样对包进行封装,属于 underlay 网络。
  • Weave 是 VxLAN 实现,属于 overlay 网络。

更多详细内容请点此处查看

Docker Overlay网络和etcd实现多机容器通信

关于该示例图的详细应用步骤请点此处

7fdcada11ca393f15d25f4a191fe28d.png

853e58cd1da538dffa36e9616a6295a.png

bf0947fca099b6473f84618de33a827.png

扩张阅读

使用VXLAN实现docker的多机通信,一种网络虚似化技术

overlay-networks

Docker网络——单host网络

本文涉及命令

# 当前机器上docker有哪些网络模式
docker network ls
# 查看指定的网络详情
docker network inspect [networkName]
docker network inspect bridge
# 创建test2容器并连接test1容器共享通信网络
docker run -d --name test2 --link test1 busybox
# 创建一个bridge的网络模式,名为my-bridge
docker network create -d bridge my-bridge
# 创建一个overlay的网络模式,名为demo
docker network create -d overlay demo
# --network 指定容器的网络模式
docker run -d --name test3 --network my-bridge busybox
# 使test2容器连接到my-bridge网络模式上
docker network connect my-bridge test2
docker run --name web -d nginx
docker run --name nginx  -d -p 80:80 nginx
docker run -p ip:[hostPort]:[containerPort] redis
# -e 设置环境变量
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis [image]
# -f实时查看docker容器日志,--tail 指定行数
docker logs -f -t --tail [行数] 容器名
#实时查看docker容器名为s12的最后10行日志
docker logs -f -t --tail 10 s12



目录
相关文章
|
4月前
|
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地址、网络接口列表及测试容器启动验证修复效果。
|
10月前
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
352 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
8月前
|
监控 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
220 20
|
11月前
|
安全 网络安全 数据安全/隐私保护
利用Docker的网络安全功能来保护容器化应用
通过综合运用这些 Docker 网络安全功能和策略,可以有效地保护容器化应用,降低安全风险,确保应用在安全的环境中运行。同时,随着安全威胁的不断变化,还需要持续关注和研究新的网络安全技术和方法,不断完善和强化网络安全保护措施,以适应日益复杂的安全挑战。
317 61
|
10月前
|
安全 Docker 容器
docker的默认网络模式有哪些
Docker 默认网络模式包括:1) bridge:默认模式,各容器分配独立IP,可通过名称或IP通信;2) host:容器与宿主机共享网络命名空间,性能最优但有安全风险;3) none:容器隔离无网络配置,适用于仅需本地通信的场景。
427 6
|
10月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
963 7
|
12月前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
256 5
|
11月前
|
Docker 容器
【赵渝强老师】Docker的None网络模式
Docker容器在网络方面实现了逻辑隔离,提供了四种网络模式:bridge、container、host和none。其中,none模式下容器具有独立的网络命名空间,但不包含任何网络配置,仅能通过Local Loopback网卡(localhost或127.0.0.1)进行通信。适用于不希望容器接收任何网络流量或运行无需网络连接的特殊服务。
191 0
|
11月前
|
Docker 容器
【赵渝强老师】Docker的Host网络模式
Docker容器在网络环境中是隔离的,可通过配置不同网络模式(如bridge、container、host和none)实现容器间或与宿主机的网络通信。其中,host模式使容器与宿主机共享同一网络命名空间,提高性能但牺牲了网络隔离性。
362 0
|
11月前
|
Kubernetes Docker 容器
【赵渝强老师】Docker的Container网络模式
Docker容器在网络环境中彼此隔离,但可通过配置不同网络模式实现容器间通信。其中,container模式使容器共享同一网络命名空间,通过localhost或127.0.0.1互相访问,提高传输效率。本文介绍了container模式的特点及具体示例。
234 0