【Docker 系列】docker 学习八,Docker 网络

简介: 【Docker 系列】docker 学习八,Docker 网络

开始理解 docker

一开始,咱们思考一下,宿主机怎么和容器通信呢?

说容器之间是相互隔离的,那么他们是否可以通信?又是如何通信的呢?

开始探索

我们先来看看咱环境中的镜像都有些啥,有 xmtubuntu

# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
xmtubuntu             latest    c3e95388a66b   38 seconds ago   114MB

再来看看宿主机的网卡信息

ip addr来查看咱们宿主机的网卡信息

我们发现有一个docker0,是因为我们的宿主机上面安装了docker 的服务,docker 会给我生成一个虚拟网卡,图中的这个 docker0就是虚拟网卡信息

创建并启动一个docker 命名为 ubuntu1

docker run -it --name ubuntu1 -P xmtubuntu

查看一下宿主机网卡信息

查看宿主机的网卡信息

再查看 ubuntu1 的网卡信息,docker 也会默认给我们的容器分配ip 地址

可以发现宿主机的网卡信息 docker0 下面多了117: veth838e165@if116:ubuntu1的网卡信息上也正好有116: eth0@if117

我们发现这些veth的编号是成对出现的,咱们的宿主机就可以和 ubuntu1进行通信了

使用宿主机(docker0)和ubuntu1互相 ping

docker0pingubuntu1 ok

ubuntu1pingdocker0,同样的 ok

咱们可以尝试再创建并启动一个docker 命名为 ubuntu2,方法和上述完全一致

# docker run -it -P --name ubuntu2 xmtubuntu

进入容器,使用ip a查看到ubuntu2的网卡信息

宿主机上面查看网信息

宿主机上面又多了一个 veth , 119: veth0b29558@if118

ubuntu2上的网卡信息是118: eth0@if119,他们同样是成对出现的,小伙伴看到这里应该明白了吧

ubuntu1 ping ubuntu2 呢?

ubuntu1 对应 172.18.0.2

ubuntu2 对应 172.18.0.3

# docker exec -it ubuntu1 ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.077 ms

仍然是可以通信,非常 nice

原理是什么?

上述的探索,我们发现宿主机创建的容器,都可以直接ping通宿主机,那么他们的原理是啥呢?

细心的 xdm 应该可以看出来,上述的例子中,veth是成对出现的,上述宿主机和容器能够进行网络通信,得益于这个技术veth-pair

veth-pair

**veth-pair **是一对虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连

正是因为这个特性,veth-pair在此处就是充当了一个桥梁,连接各种虚拟设备

通过上图我们可以得出如下结论:

  • ubuntu1ubuntu2他们是公用一个路由器,也就是 docker0,ubuntu1 能pingubuntu2是因为 docker0 帮助其转发的
  • 所有的容器在不指定路由的情况下,都是以 docker0 作为路由,docker 也会给我们的容器分配一个可用的 ip
  • docker0 是在宿主机上面安装 docker 服务就会存在的

那么通过上图我们就知道,容器和宿主机之前是通过桥接的方式来打通网络的。

Dcoker 中所有的网络接口都是虚拟的,因为虚拟的转发效率高呀,当我们删除某一个容器的时候,这个容器对应的网卡信息,也会被随之删除掉

那么我们可以思考一下,如果都是通过找ip地址来通信,如果 ip变化了,那么我们岂不是找不到正确的容器了吗?我们是否可以通过服务名来访问容器呢?

–link

当然是可以的,当我们在创建和启动容器的时候加上–link就可以达到这个效果

我们再创建一个容器 ubuntu3,让他 link 到 ubuntu2

# docker run -it --name ubuntu3 -P --link ubuntu2 xmtubuntu

# docker exec -it ubuntu3 ping ubuntu2
PING ubuntu2 (172.18.0.3) 56(84) bytes of data.
64 bytes from ubuntu2 (172.18.0.3): icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from ubuntu2 (172.18.0.3): icmp_seq=2 ttl=64 time=0.085 ms
64 bytes from ubuntu2 (172.18.0.3): icmp_seq=3 ttl=64 time=0.092 ms
64 bytes from ubuntu2 (172.18.0.3): icmp_seq=4 ttl=64 time=0.073 ms

很明显,我们可以到看到 ubuntu3可以通过服务名ubuntu2直接和ubuntu2通信,但是反过来是否可以呢?

# docker exec -it ubuntu2 ping ubuntu3
ping: ubuntu3: Name or service not known

不行?这是为什么呢?

我们来查看一下 ubuntu3的本地 /etc/hosts文件就清楚了

看到这里,这就清楚了 link 的原理了吧,就是在自己的 /etc/hosts文件中,加入一个host而已,这个知识点我们可以都知悉一下,但是这个 link 还是好搓,不好,他需要在创建和启动容器的时候使用,用起来不方便

那么我们有没有更好的办法的呢?

自定义网络

可以使用 docker network ls查看宿主机 docker 的网络情况

:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
8317183dfc58   bridge    bridge    local
997107487c6b   host      host      local
ab130876cbe6   none      null      local

网络模式

  • bridge

桥接,docker0 默认使用 bridge 这个名字

  • host

和宿主机共享网络

  • none

不配置网络

  • container

容器网络连通,这个模式用的非常少,因为局限性很大

现在咱们可以自定义个网络,来连通两个容器

自定义网络

自定义一个 mynet 网络

# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
9a597fc31f1964d434181907e21ff7010738f3f7dc35ba86bf7434f05a6afc4a
  • docker network create

创建一个网络

  • –driver

指定驱动是 bridge

  • –subnet

指定子网

  • –gateway

指定网关

此处我们设置子网是--subnet 192.168.0.0/16,网关是192.168.0.1,那么我们剩下可以使用的ip就是 192.168.0.2 – 192.168.255.254192.168.255.255是广播地址

清空已有的容器

清空所有测试的容器,减去干扰

创建并启动2个容器,分别是ubuntu1 和 ubuntu2

# docker run -it -P --name ubuntu1 --net mynet xmtubuntu
# docker run -it -P --name ubuntu2 --net mynet xmtubuntu

此时我们可以查看一下宿主机的网卡信息,并验证两个容器直接通过容器名字是否可以通信

我们思考一下自定义网络的好处

咱们自定义 docker 网络,已经帮我们维护好了对应关系,这样做的好处是容器之间可以做到网络隔离,

例如

一堆 redis 的容器,使用 192.168.0.0/16 网段,网关是 192.168.0.1

一堆 mongodb的容器,使用 192.167.0.0/16 网段,网关是 192.167.0.1

这样就可以做到子网很好的隔离开来,不同的集群使用不同的子网,互不影响

那么子网间是否可以打通呢?

网络连通

两个不同子网内的容器如何连通了呢?

我们绝对不可能让不同子网的容器不通过路由的转发而直接通信,这是不可能的,子网之间是相互隔离的

但是我们有办法让 ubuntu3 这个容器通过和 mynet 打通,进而转发到 ubuntu1 或者 ubuntu2 中就可以了

打通子网

我们查看 docker network 的帮助手册

docker network -h

可以使用 docker network connect命令实现,在查看一下帮助文档

# docker network connect -h
Flag shorthand -h has been deprecated, please use --help
Usage:  docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network

开始打通

docker network connect mynet ubuntu3

这个时候我们可以查看一下 mynet 网络的详情

# docker network inspect mynet

可以看到在 mynet 网络上,又增加了一个容器,ip 是 192.168.0.4

没错,docker 处理这种网络打通的事情就是这么简单粗暴,直接在 ubuntu3 容器上增加一个虚拟网卡,让 ubuntu3 能够和 mynet 网络打通

宿主机当然也相应的多了一个veth

现在,要跨网络操作别人的容器,我们就可以使用 docker network connect的方式将网络打通,开始干活了

大家对网络还感兴趣吗,哈哈,关于 docker 的前几期文章链接如下,可以逐步学习,慢慢深入,多多回顾

【Docker 系列】docker 学习 五,我们来看看容器数据卷到底是个啥

【Docker 系列】docker 学习 四,一起学习镜像相关原理

【Docker 系列】docker 学习 三,docker 初步实战和 docker 可视化管理工具试炼

【Docker 系列】docker 学习 二,docker 常用命令,镜像命令,容器命令,其他命令

【Docker 系列】docker 学习 一,Docker的安装使用及Docker的基本工作原理 | 8月更文挑战

参考资料:

docker docs

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

相关文章
|
6天前
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
91 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
18天前
|
安全 Docker 容器
docker的默认网络模式有哪些
Docker 默认网络模式包括:1) bridge:默认模式,各容器分配独立IP,可通过名称或IP通信;2) host:容器与宿主机共享网络命名空间,性能最优但有安全风险;3) none:容器隔离无网络配置,适用于仅需本地通信的场景。
31 6
|
21天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
54 7
|
28天前
|
安全 网络安全 数据安全/隐私保护
利用Docker的网络安全功能来保护容器化应用
通过综合运用这些 Docker 网络安全功能和策略,可以有效地保护容器化应用,降低安全风险,确保应用在安全的环境中运行。同时,随着安全威胁的不断变化,还需要持续关注和研究新的网络安全技术和方法,不断完善和强化网络安全保护措施,以适应日益复杂的安全挑战。
42 5
|
1月前
|
Docker 容器
【赵渝强老师】Docker的None网络模式
Docker容器在网络方面实现了逻辑隔离,提供了四种网络模式:bridge、container、host和none。其中,none模式下容器具有独立的网络命名空间,但不包含任何网络配置,仅能通过Local Loopback网卡(localhost或127.0.0.1)进行通信。适用于不希望容器接收任何网络流量或运行无需网络连接的特殊服务。
|
1月前
|
Docker 容器
【赵渝强老师】Docker的Host网络模式
Docker容器在网络环境中是隔离的,可通过配置不同网络模式(如bridge、container、host和none)实现容器间或与宿主机的网络通信。其中,host模式使容器与宿主机共享同一网络命名空间,提高性能但牺牲了网络隔离性。
|
1月前
|
Kubernetes Docker 容器
【赵渝强老师】Docker的Container网络模式
Docker容器在网络环境中彼此隔离,但可通过配置不同网络模式实现容器间通信。其中,container模式使容器共享同一网络命名空间,通过localhost或127.0.0.1互相访问,提高传输效率。本文介绍了container模式的特点及具体示例。
|
1月前
|
Linux Docker 容器
【赵渝强老师】Docker的Bridge网络模式
本文介绍了Docker容器的网络隔离机制及其四种网络模式:bridge、container、host和none。重点讲解了默认的bridge模式,通过示例演示了如何创建自定义bridge网络并配置容器的网络信息。文中还附有相关图片和视频讲解,帮助读者更好地理解Docker网络的配置和使用方法。
|
6天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
43 17
|
17天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。