论坛网站开发成本,高端的网站开发,网站建设属于技术服务吗,海外医疗手机网站建设目录
背景
默认网络
1、bridge 网络模式
2、host 网络模式
3、none 网络模式
4、container 网络模式
自定义网络
容器间网络通信
IP通信
Docker DNS server
Joined容器 前言 本实验通过docker DNS server和joined 容器两种方法实现Docker容器间的通信。Docker容器间…目录
背景
默认网络
1、bridge 网络模式
2、host 网络模式
3、none 网络模式
4、container 网络模式
自定义网络
容器间网络通信
IP通信
Docker DNS server
Joined容器 前言 本实验通过docker DNS server和joined 容器两种方法实现Docker容器间的通信。Docker容器间通信可用于监控其他容器的网络流量、不同容器中程序如web server和app server的高效通信等场景。通过实验进一步熟悉Docker的架构和基本操作了解Docker容器间通信的方式。 背景 当项目大规模使用 Docker 时容器通信的问题也就产生了。要解决容器通信问题必须先了解很多关于网络的知识。Docker 作为目前最火的轻量级容器技术有很多令人称道的功能也有着很多不完善的地方网络方面就是 Docker 比较薄弱的部分。因此我们有必要深入了解 Docker 的网络知识以满足更高的网络需求。 默认网络
安装 Docker 以后会默认创建三种网络可以通过 docker network ls 查看。 我们有必要先来了解一下这几种网络模式都是什么意思。
网络模式参数说明host模式-nethost容器和宿主机共享 Network namespace。container模式–netcontainer:NAME_or_ID容器和另外一个容器共享 Network namespace。 kubernetes 中的pod就是多个容器共享一个 Network namespace。none模式–netnone容器有独立的Network namespace但并没有对其进行任何网络设置如分配 veth pair 和网桥连接配置IP等。bridge模式–netbridge默认为该模式通过 -p 指定端口映射。
1、bridge 网络模式
在该模式中Docker 守护进程创建了一个虚拟以太网桥 docker0新建的容器会自动桥接到这个接口附加在其上的任何网卡之间都能自动转发数据包。
默认情况下守护进程会创建一对对等虚拟设备接口 veth pair将其中一个接口设置为容器的 eth0 接口容器的网卡另一个接口放置在宿主机的命名空间中以类似 vethxxx 这样的名字命名从而将宿主机上的所有容器都连接到这个内部网络上。
比如运行一个基于 busybox 镜像构建的容器 bbox01查看 ip addr
busybox是一个软件工具箱集成了linux中几百个常用的linux命令以及工具。
docker run -it --name bbox01 busybox其中
-i:以交互模式运行容器通常与 -t 同时使用表示开启了input功能
-t:为容器重新分配一个伪输入终端通常与-i同时使用表示开启了连接容器里的terminal(终端)
-d:指定容器在后台运行 然后宿主机通过 ip addr 可以发现守护进程会创建一对对等虚拟设备接口 veth pair将其中一个接口设置为容器的 eth0 接口容器的网卡另一个接口放置在宿主机的命名空间中以类似 vethxxx 这样的名字命名。 同时守护进程还会从网桥 docker0 的私有地址空间中分配一个 IP 地址和子网给该容器并设置 docker0 的 IP 地址为容器的默认网关。也可以安装 yum install -y bridge-utils 以后通过 brctl show 命令查看网桥信息。
yum install -y bridge-utils对于每个容器的 IP 地址和 Gateway 信息我们可以通过 docker inspect 容器名称|ID 进行查看在 NetworkSettings 节点中可以看到详细信息。 我们可以通过 docker network inspect bridge 查看所有 bridge 网络模式下的容器在 Containers 节点中可以看到容器名称。
docker network inspect bridge关于 bridge 网络模式的使用只需要在创建容器时通过参数 --net bridge 或者 --network bridge 指定即可当然这也是创建容器默认使用的网络模式也就是说这个参数是可以省略的。 Bridge 桥接模式的实现步骤主要如下 Docker Daemon 利用 veth pair 技术在宿主机上创建一对对等虚拟网络接口设备假设为 veth0 和 veth1。而veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文都会将报文传输给另一方。 Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上。保证宿主机的网络报文可以发往 veth0 Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下并被改名为 eth0。如此一来宿主机的网络报文若发往 veth0则立即会被 Container 的 eth0 接收实现宿主机到 Docker Container 网络的联通性同时也保证 Docker Container 单独使用 eth0实现容器网络环境的隔离性。 2、host 网络模式 host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定 采用 host 网络模式的 Docker Container可以直接使用宿主机的 IP 地址与外界进行通信若宿主机的 eth0 是一个公有 IP那么容器也拥有这个公有 IP。同时容器内服务的端口也可以使用宿主机的端口无需额外进行 NAT 转换 host 网络模式可以让容器共享宿主机网络栈这样的好处是外部主机与容器直接通信但是容器的网络缺少隔离性。
比如我基于 host 网络模式创建了一个基于 busybox 镜像构建的容器 bbox02查看 ip addr
docker run -it --name bbox02 --net host busybox然后宿主机通过 ip addr 查看信息如下 返回信息一模一样我们可以通过 docker network inspect host 查看所有 host 网络模式下的容器在 Containers 节点中可以看到容器名称。
docker network inspect host3、none 网络模式
none 网络模式是指禁用网络功能只有 lo 接口 local 的简写代表 127.0.0.1即 localhost 本地环回接口。在创建容器时通过参数 --net none 或者 --network none 指定
none 网络模式即不为 Docker Container 创建任何的网络环境容器内部就只能使用 loopback 网络设备不会再有其他的网络资源。可以说 none 模式为 Docke Container 做了极少的网络设定但是俗话说得好“少即是多”在没有网络配置的情况下作为 Docker 开发者才能在这基础做其他无限多可能的网络定制开发。这也恰巧体现了 Docker 设计理念的开放。
比如基于 none 网络模式创建了一个基于 busybox 镜像构建的容器 bbox03查看 ip addr
docker run -it --name bbox03 --net none busybox我们可以通过 docker network inspect none 查看所有 none 网络模式下的容器在 Containers 节点中可以看到容器名称。
docker network inspect none4、container 网络模式
Container 网络模式是 Docker 中一种较为特别的网络的模式。在创建容器时通过参数 --net container:已运行的容器名称|ID 或者 --network container:已运行的容器名称|ID 指定
处于这个模式下的 Docker 容器会共享一个网络栈这样两个容器之间可以使用 localhost 高效快速通信。
Container 网络模式即新创建的容器不会创建自己的网卡配置自己的 IP而是和一个指定的容器共享 IP、端口范围等。同样两个容器除了网络方面相同之外其他的如文件系统、进程列表等还是隔离的。
基于容器 bbox01 创建了 container 网络模式的容器 bbox04查看 ip addr
docker run -it --name bbox04 --net container:bbox01 busybox容器 bbox01 的 ip addr 信息如下 宿主机的 ip addr 信息如下 通过以上测试可以发现Docker 守护进程只创建了一对对等虚拟设备接口用于连接 bbox01 容器和宿主机而 bbox04 容器则直接使用了 bbox01 容器的网卡信息。
这个时候如果将 bbox01 容器停止会发现 bbox04 容器就只剩下 lo 接口了。 然后 bbox01 容器重启以后bbox04 容器也重启一下就又可以获取到网卡信息了。 自定义网络
虽然 Docker 提供的默认网络使用比较简单但是为了保证各容器中应用的安全性在实际开发中更推荐使用自定义的网络进行容器管理以及启用容器名称到 IP 地址的自动 DNS 解析。
从 Docker 1.10 版本开始docker daemon 实现了一个内嵌的 DNS server使容器可以直接通过容器名称通信。方法很简单只要在创建容器时使用 --name 为容器命名即可。
【说明】 Docker DNS 限制只能在 user-defined 网络中使用。也就是说默认的 bridge 网络是无法使用 DNS 的所以我们就需要自定义网络。
通过 docker network create 命令可以创建自定义网络模式
进一步查看 docker network create 命令使用详情发现可以通过 --driver 指定网络模式且默认是 bridge 网络模式提示如下 创建一个基于 bridge 网络模式的自定义网络模式 custom_network完整命令如下
docker network create custom_network通过 docker network ls 查看网络模式
docker network ls通过自定义网络模式 custom_network 创建容器
docker run -di --name bbox08 --net custom_network busybox通过 docker inspect 容器名称|ID 查看容器的网络信息在 NetworkSettings 节点中可以看到详细信息。
docker inspect bbox08接下来通过 docker network connect 网络名称 容器名称 为容器连接新的网络模式。
docker network connect bridge bbox08通过 docker inspect 容器名称|ID 再次查看容器的网络信息多增加了默认的 bridge。 通过 docker network disconnect 网络名称 容器名称 命令断开网络。
docker network disconnect custom_network bbox08通过 docker inspect 容器名称|ID 再次查看容器的网络信息发现只剩下默认的 bridge。 可以通过 docker network rm 网络名称 命令移除自定义网络模式网络模式移除成功会返回网络模式名称。
docker network rm custom_network容器间网络通信 通常容器间的通信方式有以下三种 IP通信 Docker DNS server Joined容器
IP通信
当docker容器启动的时候docker会默认给当前容器被分配一个随机的ip。需要分别进入两个容器通过容器的本地host文件查看两个容器自身的ip再经过指定后进行互通。采用IP通信的前提是两个容器必须要属于同一个网络的网卡但是因为部署过后再指定应用的ip很麻烦所以ip通信方式就不再过多赘述。
Docker DNS server
Docker DNS Server 是 Docker 容器运行时环境中的一种内置 DNS 服务器。它提供容器间的域名解析服务使得容器可以通过域名进行网络通信而无需关注底层的 IP 地址和网络配置。
Docker DNS Server 的主要特点和工作原理如下
1内置 DNS 服务器Docker 在创建容器时会在每个容器上运行一个内置的 DNS 服务器该服务器负责处理容器内部的域名解析请求。DNS 服务器默认监听在容器的 loopback 网络接口上。
2自动解析容器名Docker DNS Server 使用容器名作为域名的一部分因此容器可以通过使用其他容器的名称来访问对应的服务。例如一个名为 web 的容器可以通过将其他容器的域名设置为 http://XXXXX.com 来访问该服务。
3容器间通信当一个容器需要与另一个容器进行通信时它可以使用目标容器的名称作为域名进行解析。Docker DNS Server 会将容器名解析为容器的 IP 地址并将通信请求转发给目标容器。
4自动更新记录当容器创建、销毁或重新调度时Docker DNS Server 会自动更新容器名与 IP 地址之间的映射关系。这样可以确保容器名始终能够正确解析到对应的 IP 地址。
5自定义网络Docker 允许创建自定义网络容器可以加入特定的网络中。在自定义网络中Docker DNS Server 会为该网络中的所有容器提供域名解析服务使得容器可以相互之间通过容器名进行通信。
Joined容器
joined 容器可以使两个或多个容器共享一个网络栈共享网卡和配置信息 joined 容器之间可以通过 127.0.0.1直接通信。当一个容器加入到另一个容器的命名空间中时它可以访问和共享该容器的网络、文件系统和其他资源。这种容器间的连接方式称为容器的链接Container Linking。
下面是 Joined 容器的主要特点和使用方式如下
1共享命名空间Joined 容器会与目标容器共享相同的网络命名空间这意味着它们可以直接通过本地的 localhost 地址进行通信。同时Joined 容器还可以共享其他命名空间如文件系统、进程等使得它们能够访问和操作彼此的资源。
2便捷的通信机制通过容器的链接Joined 容器之间可以通过容器名称进行网络通信。这样可以简化容器间的通信配置并且无需暴露端口给外部网络。
3灵活的应用部署将容器加入到另一个容器中可以方便地将多个容器组合成一个应用程序的部署单元。这种方式允许开发者以模块化的方式构建和管理复杂的应用程序。
看完这些介绍接下来我们首先明确一点容器之间要互相通信必须要有属于同一个网络的网卡。
我们先创建两个基于默认的 bridge 网络模式的容器。
docker run -di --name default_bbox01 busybox
docker run -di --name default_bbox02 busybox通过 docker network inspect bridge 查看两容器的具体 IP 信息。
docker network inspect bridge然后测试两容器间是否可以进行网络通信。
docker exec -it default_bbox01 ping 172.17.0.3经过测试从结果得知两个属于同一个网络的容器是可以进行网络通信的但是 IP 地址可能是不固定的有被更改的情况发生,这时就需要用到DNS server了。
从 Docker 1.10 版本开始docker daemon 实现了一个内嵌的 DNS server使容器可以直接通过容器名称通信。方法很简单只要在创建容器时使用 --name 为容器命名即可。
但是使用 Docker DNS 有个限制只能在 user-defined 网络中使用。也就是说默认的 bridge 网络是无法使用 DNS 的所以我们就需要自定义网络。
先创建自定义网络。
docker network create custom_network然后创建两个基于自定义网络模式的容器。
docker run -di --name custom_bbox02 --net custom_network busybox
docker run -di --name custom_bbox03 --net custom_network busybox通过 docker network inspect custom_network 查看两容器的具体 IP 信息。 然后测试两容器间是否可以进行网络通信分别使用具体 IP 和容器名称进行网络通信。
docker exec -it custom_bbox02 ping 172.19.0.3docker exec -it custom_bbox02 ping custom_bbox03经过测试从结果得知两个属于同一个自定义网络的容器是可以进行网络通信的并且可以使用容器名称进行网络通信。
那如果此时希望 bridge 网络下的容器可以和 custom_network 网络下的容器进行网络又该如何操作那就让 bridge 网络下的容器连接至新的 custom_network 网络即可。
docker network connect custom_network default_bbox01至于最后提到的通过joined 容器通信就是一种基于容器网络Container Network实现的方式。通过加入容器的方式我们可以轻松地实现容器间的通信而无需依赖外部的网络设备或服务。这种方式适用于需要实现容器间紧密耦合的应用场景例如一个容器用作数据库服务另一个容器用作应用程序服务它们之间需要进行数据交互和通信。
joined 容器可以使两个或多个容器共享一个网络栈共享网卡和配置信息joined容器之间可以通过 127.0.0.1直接通信。
创建一个 httpd 容器名字为 web1
docker run -d -it --nameweb1 httpd创建一个busybox 容器并通过--networkcontainer:web1指定joined 容器为web1。
docker run -it --networkcontainer:web1 busybox在busybox容器中用 ip a命令查看网络配置信息然后用命令exit退出。 进入web1容器
docker exec -it web1 /bin/bash查看web1的网络配置信息,可以看到这里web1容器 和busybox容器的网卡 mac 地址、IP 完全一样它们共享了相同的网络栈。