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地址发生变更的问题。

相关推荐
热爱跑步的恒川3 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
云飞云共享云桌面4 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
昌sit!4 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林5 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
音徽编程6 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
A ?Charis7 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
幺零九零零7 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
城南vision7 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge7 小时前
Docker篇(Docker Compose)
运维·docker·容器
23zhgjx-NanKon8 小时前
华为eNSP:QinQ
网络·安全·华为