前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >拿捏docker+k8s系列--docker网络

拿捏docker+k8s系列--docker网络

作者头像
微客鸟窝
发布2022-05-24 13:06:05
4170
发布2022-05-24 13:06:05
举报
文章被收录于专栏:Go语言指北

docker 网络

Docker 安装时会自动在 host 上创建三个网络,我们可用docker network ls 命令查看,如:

none 网络

none 网络就是什么都没有的网络,挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可通过 --network=none 来指定使用 none 网络。

❝使用场景:一些对安全性要求比较高且不需要联网的应用可以使用 none 网络。 ❞

host 网络

连接到 host 网络的容器共享 Docker host 的网络栈,通过 --network=host 来指定使用 host 网络。

❝使用场景:

  1. host 网络有着良好的性能,如果容器对网络传输效率要求比较高,则可以选择使用 host 网络。注意使用时避免端口冲突, Docker host上已经使用的端口就不能再使用了。
  2. 可以直接配置 host 网络,例如跨 host 的网络解决方案,其本身也是以容器的方式运行的,这些方案需要对网络进行配置,比如管理 iptables。

bridge 网络

Docker 安装时会创建一个命名为 docker0 的 Linux bridge。如果不指定--network,创建的容器默认都会挂到 docker0 上,我们可以使用 brctl show 命令查看:

❝brctl命令用于设置、维护和检查linux内核中的以太网网桥配置。 以太网网桥是一种设备,通常用于将以太网的不同网络连接在一起,以便这些以太网对参与者显示为一个以太网。若 brctl command not found ,得先安装下:yum install bridge-utils

上面docker0上并没有其他网络设备,我们创建一个容器再看下:

一个新的网络接口 veth231a8cf 被挂到了 docker0 上, veth231a8cf 就是被新创建容器的虚拟网络。

容器网络配置

进入 docker容器中,执行命令ip a 查看当前容器的网络状态

❝若提示 bash: ip: command not found 需要手动安装。执行命令:apt-get update & apt-get install -y iproute2

查看容器网络配置:

容器有一个网卡 eth0@if25 和 veth231a8cf 是一对veth pair。veth pair是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if25)在容 器中,另一头(veth231a8cf)挂在网桥dockert0上,其效果就是将eth0@if25也挂在了 docker0上。

eth0@if25 配置了 IP 172.17.0.2,我们通过 docker network inspect bridge 看下 bridge 网络的配置信息:

可以看到 bridge 网络配置的 subnet 就是 172.17.0.0/16

当前容器网络拓扑接口

容器创建时,docker 会自动从172.17.0.0/16中分配一个IP,这里16位的掩码保证有足够多的IP可以供容器使用。

user-defined 网络

除了none、host、bridge 这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络。

Docker 提供三种 user-defined 网络驱动:bridge、overlay 和 macvlan。 overlay 和 macvlan 用于创建跨主机的网络。

我们可通过 bridge 驱动创建类似前面默认的 bridge 网络,如图:

新增了一个网桥 br-4fdf7813d8a0,这里的 4fdf7813d8a0 是新建 bridge 网络 mynet 的短 id。执行 docker network inspect 看下 mynet 的配置信息:

这里的 172.18.0.0/16 是 Docker 自动分配的 IP 网段。我们还可以自己指定 IP 网络,只需要在创建网段时指定 --subnet--gateway 参数,我们新创建一个 bridge 网络 mynet2,网段为 172.22.16.0/24,网关为172.22.16.1:

对应的网桥 br-d19ae373a18f 上:

容器要使用新的网络,需要在启动时候通过 --network 指定:

docker run -it --network=mynet2 容器

指定静态 IP

以上,容器的 IP 都是 docker 自动从 subnet 中分配的,我们可以通过 --ip 来指定一个静态 IP。

docker run -it --network=mynet2 --ip 172.22.16.8 容器

❝注意:只有使用 --subnet 创建的网络才能指定静态 IP。 ❞

mynet 创建时没有指定 --subnet,如果指定静态 IP 会报错。

容器间通信

容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信。

IP 通信

两个容器要能通信,必须要有属于同一个网络的网卡。然后容器就可以通过 IP 交互了。

具体做法是在容器创建时通过 --network 指定相应的网络,或者通过 docker network connect 将现有容器加入到指定网络。

Docker DNS Server

因为在部署应用之前可能无法确定 IP,部署之后再指定要访问的 IP 会比较麻烦。我们可以通过 docker 自带的 DNS 服务解决。

从 Docker 1.l0 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过“容器名”通信。只要在启动时用 --name 为容器命名就可以了。

❝注意:使用docker DNS有个限制:只能在user-defined网络中使用。默认的 bridge 网络是无法使用 DNS 的。 ❞

joined

joined 容器可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间可以通过127.0.0.1直接通信。

例如我们创建容器时,通过 --name 为 web1,接着创建第二个容器,并通过 --network=container:web1 指定 joined 容器为 web1。那么 两个容器的网卡 mac 地址与 IP 地址便可一样,共享相同的网络栈。

❝joined 容器非常适合以下场景:

  • (1)不同容器中的程序希望通过 loopback 高效快速地通信,比如 Web Server 与 AppServer
  • (2)希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。

容器与外部连接

容器访问外部

默认容器是可以访问外网的,这里的外网指的是容器网络之外的网络环境,并非特指 Internet。

外部访问容器

外网访问容器--「端口映射」

  1. 动态端口

docker 将容器对外提供服务的端口映射到 host 的某个端口,外网通过该端口访问容器。容器启动时通过 -p 参数映射端口,如,我们将容器 80 端口映射到 host 动态端口:

❝启动容器后,可以通过 docker psdocker port 容器ID 查看到 host 映射的端口。 ❞

  1. 指定端口
代码语言:javascript
复制
docker run -d -p 8080:80 httpd

如上命令,我们将 80 端口映射到了 host 的 8080 端口。

图片及部分相关技术知识点来源于网络搜索,侵权删!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微客鸟窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • docker 网络
    • none 网络
      • host 网络
        • bridge 网络
          • 容器网络配置
        • user-defined 网络
          • 指定静态 IP
      • 容器间通信
        • IP 通信
          • Docker DNS Server
            • joined
            • 容器与外部连接
              • 容器访问外部
                • 外部访问容器
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档