docker系列(8) - docker网络

文章目录

  • [8. docker网络](#8. docker网络)
    • [8.1 四种网络模式](#8.1 四种网络模式)
    • [8.2 常用命令](#8.2 常用命令)
    • [8.3 桥接网络模式](#8.3 桥接网络模式)
      • [8.3.1 桥接网络模式说明](#8.3.1 桥接网络模式说明)
      • [8.3.2 桥接网络模式案例](#8.3.2 桥接网络模式案例)
    • [8.4 host网络模式](#8.4 host网络模式)
      • [8.4.1 host网络模式说明](#8.4.1 host网络模式说明)
      • [8.4.2 host模式案例](#8.4.2 host模式案例)
    • [8.5 none网络模式](#8.5 none网络模式)
    • [8.5 container网络模式](#8.5 container网络模式)
      • [8.5.1 container网络模式说明](#8.5.1 container网络模式说明)
      • [8.5.2 container网络模式案例](#8.5.2 container网络模式案例)
    • [8.6 自定义网络](#8.6 自定义网络)
      • [8.6.1 创建自定义网络](#8.6.1 创建自定义网络)

8. docker网络

8.1 四种网络模式

网络模式 说明
bridge 为每一个容器分配、设置IP等,并将容器连接到一个dockr0。 虚拟网桥,默认为该模式
host 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
none 容器有独立的network namespace,但并没有设置网络。
container 一个容器借用另一个容器的网络,即两个容器公用一个网络

8.2 常用命令

命令 说明
docker network ls 查看当前所有的网络
docker inspect t1|tail -n 20 查看name为t1的容器的网络(只需要查看前20行就可以了)

命令操作:

复制代码
docker network ls
复制代码
docker network inspect bridge
  • 桥接模式的网络,会自动分配一个网关为172.17.0.1,然后指定网段范围为172.17.0.0/16

对于xxx.xxx.xxx.xxx/16或者xxx.xxx.xxx.xxx/24。那么这个斜杠后面的数字代表什么意思呢?

实际上,IPv4地址是由32位二进制数组成的。以192.168.0.0/16为例,它的二进制表示是11000000.10101000.00000000.00000000。

/16表示前16位是网络地址,后16位是主机地址,即从11000000.10101000.00000000.00000000到11000000.10101000.11111111.11111111,

所表示的IP地址范围是从192.168.0.0到192.168.255.255,其中最后一个地址为广播地址,因此可用IP地址数量为65534。

如果是/24,它表示前24位是网络地址,后8位是主机地址。

例如,192.168.0.0/24表示的IP地址范围是从11000000.10101000.00000000.00000000到11000000.10101000.00000000.11111111,

所表示的IP地址为192.168.0.0到192.168.0.255,其中最后一个地址为广播地址,因此可用IP地址数量为254。

172.17.0.0/16代表的网络IP范围为172.17.0.0 - 172.17.255.255

最后一个172.17.255.255:是作为广播地址的,不能使用其作为容器IP。

复制代码
docker inspect t1|tail -n 20

注意:docker容器启动时,默认是桥接(bridge)模式,此时每个容器内部都会分配一个不同的IP地址,并且这个地址随着启动的顺序不同,是会变化的。

这个给跨容器访问带来了问题。有可能之前连接的IP地址发生变化了。那么解决的方法就是可以使用name名称访问。

8.3 桥接网络模式

8.3.1 桥接网络模式说明

Host Container Container Container docker0 bridge eth0 veth veth eth0 veth eth0 eth0

Host表示整个宿主机,在宿主机内部,有自己的网卡eth0。

然后docker又创建了一个桥接网络,类似于路由器。

在路由器上定义了网关,以及内部IP网段地址,类似于路由器提供了很多个网口veth。

然后每个容器内部会有一个独立的虚拟网卡eth0连接到路由器的每个网口veth上,从而在虚拟机内部的所有容器处在同一个虚拟网段中,这样彼此之间就可以互相访问。

8.3.2 桥接网络模式案例

启动两个tomcat容器实例。

复制代码
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8

在宿主机中查看ip addr,可以看到网卡88:vethefec9eb@if8790: vethd13f1d2@if89

通过docker exec -it tomcat81 bash进入到容器tomcat81内部,查看网络

通过docker exec -it tomcat82 bash进入到容器tomcat82内部,查看网络

通过以上网络详情可以看到,以下匹配关系:

宿主机88: vethefec9eb@if87 ==> 容器tomcat81:87: eth0@if88:

宿主机90: vethd13f1d2@if89 ==> 容器tomcat82:89: eth0@if90:

宿主机的虚拟网卡docker0上存在veth和容器的eth0的一对一关系。

8.4 host网络模式

8.4.1 host网络模式说明

Host Container host 宿主机eth0 Container host Container host

Host表示整个宿主机,在宿主机内部,有自己的网卡eth0。

然后docker容器直接使用宿主机的网卡eth0。

8.4.2 host模式案例

复制代码
#带端口映射的
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8

host模式在启动时,由于我们设置了端口映射,会出现警告信息,表示当使用host网络模式时,指定的端口映射规则无效。

在上面的图片也可以看到没有端口映射发生,此时端口号以主机端口号为主,如果重复时,则递增。

复制代码
#不带端口映射的
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8

当使用不带端口映射的host模式启动时,就不会有警告信息了。

复制代码
#查看容器的网络配置信息
docker inspect tomcat83

host网络模式下,容器没有配置网关,ip等信息

容器内部访问网络时,发现与宿主机的网络配置一模一样,它其实就是使用的是宿主机的网络环境。

所有我们在访问tomcat时,直接使用宿主机的网络配置。

8.5 none网络模式

在none模式下,容器内部没有任何网络配置,只有一个lo(localhost),即禁用网络功能。

复制代码
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8

查看网络配置,none网络模式下,没有任何网关和IP信息。

容器内部查看,除了lo以外,没有任何网络配置。

因此,通常情况下不使用。

8.5 container网络模式

8.5.1 container网络模式说明

Host Container docker0 bridge eth0 veth Container eth0

8.5.2 container网络模式案例

错误应用 :tomcat

这是一个特殊的网络模式,如果启动两个tomcat容器,会出现报错信息。即tomcat应用不能使用该模式。

复制代码
docker run -d -p 8085:8080                              --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8

发生错误的原因是tomcat85和tomcat86公用同一个IP同一个端口,导致端口冲突。

成功应用:Alpine Linux应用,非常轻量级的linux,只有6M大小。

复制代码
docker run -it -d --name alpine1 alpine /bin/sh
docker run -it -d --name alpine2 --network container:alpine1 alpine /bin/sh

可以看到alpine2和alpine1使用相同的网络设备,并且都是桥接模式。

注意:由于alpine2使用的是alpine1的网络设备,当容器alpine1停止后,alpine2将没有网络设备可以使用了。

8.6 自定义网络

问题:docker重启容器,容器内部的IP地址会发生变化。

解决方案:可以通过指定容器服务名来访问。

8.6.1 创建自定义网络

复制代码
# 创建自定义网络
docker network create netshare

# 加入自定义网络
docker run -d -p 8081:8080 --network netshare --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network netshare --name tomcat82 billygoo/tomcat8-jdk8

加入相同的自定义网络中后,在tomcat81容器内部ping tomcat82 或者tomcat82容器内部ping tomcat81 都可以相互ping通对方。

这样解决了ip地址发生变更的问题。

相关推荐
yychen_java2 小时前
当算法成为武器:AI泛滥时代的多维危机透视与治理路径
网络·人工智能·ai
漫途科技2 小时前
精准盯防危房隐患,智守人居安全|MTB46-4-2A 4G数据采集终端专项应用方案
网络·安全
我是谁??2 小时前
ubuntu22.04 通过docker部署vLLM(Qwen3-0.6B)大模型+New API+OpenWebUI
docker·容器·vllm
运维瓦工3 小时前
DevOps 生态介绍(十):Docker Compose 核心 YAML 配置详解与常用命令大全
spring cloud·docker·容器
云烟成雨TD3 小时前
Spring AI 1.x 系列【59】容器化开发支持:Docker Compose 与 Testcontainers
人工智能·spring·docker
Misnearch3 小时前
抓包Packet Capture
网络·抓包
Plastic garden3 小时前
K8s(10)NFS 的动态 PV 创建数据库给k8s的mysql和redis
docker·容器·kubernetes
zhangfeng11333 小时前
ps aux讲解,结合国家超算中心 hpc apptainer
linux·服务器·网络
与海boy3 小时前
docker compose minio
docker·容器·eureka
代码中介商4 小时前
TLS握手全解析:从1.2到1.3的加密演进
网络·网络协议·http