13-Docker网络

简介: Docker网络通过namespace和cgroup实现容器间隔离与通信。默认创建docker0网桥,支持bridge、host、none、container四种模式,可自定义网络实现容器间服务发现与互联,推荐替代已弃用的--link方式。

Docker 网络


docker安装并启动服务后,会在宿主机中添加一个虚拟网卡。


在Docker服务启动前,使用 ifconfigip addr 查看网卡信息:


  • ens33eth0:本机网卡
  • lo:本机回环网络网卡
  • 可能有virbr0(CentOS安装时如果选择的有相关虚拟化服务,就会多一个以网桥连接的私网地址的virbr0网卡,作用是为连接虚拟网卡提供NAT访问外网的功能。如果要移除该服务,可以使用 yum remove libvirt-libs.x86_64


使用 systemctl start docker启动Docker服务后,会多出一个 docker0 网卡。


作用:


  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响


Docker容器的网络隔离,是通过Linux内核特性 namespacecgroup 实现的。


docker网络命令


查看Docker网络模式:


docker network ls


如果没有修改过docker network,则默认有3个网络模式:


  • bridge
  • host
  • none


添加Docker网络:


docker network add xxx


删除Docker网络:


docker network rm xxx


查看网络元数据:


docker network inspect xxx


删除所有无效的网络:


docker network prune


Docker 网络模式


Docker 的网络模式:

网络模式

简介

使用方式

bridge

为每一个容器分配、设置IP等,并将容器连接到一个docker0

虚拟网桥,默认为该模式

--network bridge

host

容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口

--network host

none

容器有独立的 Network namespace,但并没有对齐进行任何网络设置,如分配 veth pari

和 网桥连接、IP等

--network none

container

新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等

--network container:NAME或者容器ID


查看某个容器的网络模式:


# 通过inspect获取容器信息,最后20行即为容器的网络模式信息
docker inspect 容器ID | tail -n 20


docker0


Docker 服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为 docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。


Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥互相通信。


查看bridge网络的详细信息,并通过grep获取名称:


docker network inspect bridge | grep name


可以看到其名称为docker0


bridge模式


Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一个宿主机内的容器接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。


docker run的时候,没有指定--network的话,默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig就可以看到docker0和自己createnetwork


网桥docker0创建一对对等虚拟设备接口,一个叫veth,另一个叫eth0,成对匹配:


整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫 veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫做 veth pair)。


每个容器实例内部也有一块网卡,容器内的网卡接口叫做eth0


docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。



例如:


启动tomcat容器,进入tomcat容器后,执行 ip addr,可以看到其网卡信息:


1: lo ..................
容器内的网卡为 eth0
@符号后面就是宿主机上对应的veth网卡的编号28
27: eth0@if28 ...............................


在宿主机执行 ip addr 查看宿主机网卡信息:


每个veth都有个编号:vethXXXXXX
@符号后面对应就是容器内的eth0网卡编号27
28: vethXXXXXX@if27  ................


host模式


直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行 NAT 转换。


容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network space。


容器将不会虚拟出自己的网卡,而是直接使用宿主机的 IP 和端口。



如果在 docker run 命令中同时使用了 --network host-p端口映射,例如:


docker run -p 8082:8080 --network host tomcat


那么会出现一个警告:


WARNING: Published ports are discarded when using host network mode


因为此时已经使用了host模式,本身就是直接使用的宿主机的IP和端口,此时的-p端口映射就没有了意义,也不会生效,端口号还是会以主机端口号为主。


正确做法是:不再进行-p端口映射,或者改用bridge模式


none模式


禁用网络功能。


none模式下,并不为docker容器进行任何网络配置。进入容器内,使用 ip addr查看网卡信息,只能看到 lo(本地回环网络127.0.0.1网卡)。


container模式


新建的容器和已经存在的一个容器共享网络IP配置,而不是和宿主机共享。


新创建的容器不会创建自己的网卡、IP,而是和一个指定的容器共享IP、端口范围。两个容器除了网络共享,其他的如文件系统、进程列表依然是隔离的。



示例:


docker run -it --name alpine1 alpine /bin/sh
# 指定和 alpine1 容器共享网络
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh


此时使用 ip addr查看两台容器的网络,会发现两台容器的eth0网卡内的IP等信息完全相同。


如果关掉了alpine1容器,因为alpine2的网络使用的alpine1共享网络,所以关掉alpin1后,alpine2eth0网卡也随之消失了。


自定义网络


容器间的互联和通信以及端口映射。


容器 IP 变动时候可以通过服务名直接网络通信而不受影响。(类似Eureka,通过服务名直接互相通信,而不是写死IP地址)。


docker中还有一个 --link 进行容器网络互联,但是已经被标记为过时的,可能会在将来的版本中移除这个功能。推荐使用自定义网络替换link。


自定义桥接网络(自定义网络默认使用的是桥接网络 bridge):


  1. 新建自定义网络
docker network create tomcat_network


  1. 查看网络列表
docker network ls


  1. 创建容器时,指定加入我们自定义的网络中
docker run -d -p 8081:8080 --network tomcat_network --name tomcat1 tomcat:8.5-jdk8-corretto
docker run -d -p 8082:8080 --network tomcat_network --name tomcat2 tomcat:8.5-jdk8-corretto


  1. 此时进入tomcat1中,使用ping命令测试连接tomcat2容器名,发现可以正常连通
# 安装ifconfig命令
yum install -y net-tools
# 安装ip addr命令
yum install -y iproute
# 安装ping命令
yum install -y iputils
# 直接ping容器名,不需要ping IP地址
ping tomcat2



link连接


示例:


# 启动一台mysql容器
# --name 为容器指定一个别名
docker run --name mysql-matomo -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.28
# 启动另一个容器,通过--link连接到mysql容器
# --link 容器名称:本容器连接对方时的别名
docker run -d -p 8888:80 --link mysql-matomo:db --name matomo matomo:4.9.0
# 此时,在matomo容器中,便可以通过 db 这个hostname连接到mysql-matomo容器,而无须再通过ip
# 连接地址:db:3306
目录
相关文章
|
2月前
|
存储 安全 SDN
Windows Admin Center 2511 发布 - 适用于所有环境的 Windows Server 远程管理工具
Windows Admin Center 2511 发布 - 适用于所有环境的 Windows Server 远程管理工具
126 8
Windows Admin Center 2511 发布 - 适用于所有环境的 Windows Server 远程管理工具
|
2月前
|
人工智能 运维 监控
微服务全链路性能瓶颈分析:主流平台对比与最佳实践
文章聚焦微服务全链路性能瓶颈分析,指出其面临诸多挑战,需专业平台优化。对比主流全链路性能分析平台在多方面的差异,介绍全链路性能分析核心技术原理。还给出微服务性能优化最佳实践路径,解答常见方案选择等问题,助力企业提升微服务性能。
|
6月前
|
Web App开发 Ubuntu 算法
Ubuntu 20.04 LTS 版本发布,新特性、新布局
Ubuntu 20.04 LTS借助新的内核压缩算法,具有更快的启动速度,并带有大量新的图形驱动程序、软件和实用程序,使用体验会更好。
513 0
|
存储 物联网 API
API在实际有什么运用?
API(Application Programming Interface,应用程序接口)是一组定义、协议和工具的集合,用于建立软件与软件之间的互操作性。它允许开发人员使用预先定义的方法来请求服务、访问数据或执行特定功能,而无需了解底层代码的具体实现。在现代软件开发中,API扮演着至关重要的角色,从简单的网页应用到复杂的企业系统,都离不开API的支持。
985 1
|
人工智能 安全 数据挖掘
AI在灾害预警与管理中的应用:提升应急响应能力
【9月更文挑战第23天】AI在灾害预警与管理中的应用正在逐步改变我们对灾害的应对方式。通过实时监测与数据分析、精准预测与风险评估、快速响应与决策支持、智能调度与资源优化以及灾后评估与恢复重建等多种手段,AI正逐步提升我们的应急响应能力,为保障人民生命财产安全提供有力支持。未来,随着AI技术的不断发展和完善,我们有理由相信,AI将在灾害预警与管理中发挥更加重要的作用,为人类社会的可持续发展贡献更多力量。
1234 5
|
算法 Java 数据库连接
mybatis plus 主键策略
mybatis plus 主键策略
286 2
|
存储 分布式计算 Hadoop
阿里巴巴飞天大数据架构体系与Hadoop生态系统的深度融合:构建高效、可扩展的数据处理平台
技术持续创新:随着新技术的不断涌现和应用场景的复杂化,阿里巴巴将继续投入研发力量推动技术创新和升级换代。 生态系统更加完善:Hadoop生态系统将继续扩展和完善,为用户提供更多元化、更灵活的数据处理工具和服务。
|
开发框架 .NET C#
浅谈c和c++和c#之间的关系
浅谈c和c++和c#之间的关系
560 0
|
运维 供应链 搜索推荐
服装店库存管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL(一)
服装店库存管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
561 0