Docker 与 K8S学习笔记(九)

您所在的位置:网站首页 k8s容器之间互相访问 Docker 与 K8S学习笔记(九)

Docker 与 K8S学习笔记(九)

2023-11-17 10:55| 来源: 网络整理| 查看: 265

Docker 与 K8S学习笔记(九)—— 容器间通信

容器之间可通过IP、Docker DNS Server或joined三种方式进行通信,今天我们来详细学习一下。

一、IP通信

IP通信很简单,前一篇中已经有所涉及了,只要容器使用相同网络,那么就可以使用IP进行访问,本节不做赘述。

二、Docker DNS Server

使用IP通信存在一个最大的问题就是容器的IP地址一般是随机的不固定的,所以导致这种方式不够灵活,对于这个问题,可以通过Docker自带的DNS服务器解决。这种方式使用也很简单,即启动容器时通过--name参数即可指定其域名。我们使用前面创建的test_net1,启动两个nginx容器:

sudo docker run -d --network=test_net1 --name=ng1 nginx

sudo docker run -d --network=test_net1 --name=ng2 nginx

接着我们进入ng1,然后尝试ping一下ng2:

# ping ng2 PING ng2 (172.18.0.3) 56(84) bytes of data. 64 bytes from ng2.test_net1 (172.18.0.3): icmp_seq=1 ttl=64 time=0.094 ms 64 bytes from ng2.test_net1 (172.18.0.3): icmp_seq=2 ttl=64 time=0.101 ms 64 bytes from ng2.test_net1 (172.18.0.3): icmp_seq=3 ttl=64 time=0.097 ms 64 bytes from ng2.test_net1 (172.18.0.3): icmp_seq=4 ttl=64 time=0.086 ms ^C --- ng2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 59ms rtt min/avg/max/mdev = 0.086/0.094/0.101/0.011 ms

PS:默认Nginx容器里面没有ping命令,需要手动安装一下:

apt-get update apt-get install iputils-ping

这里要注意,使用Docker DNS有个限制:只能在用户自定义网络中使用。也就是说默认的Bridge网络是无法使用的。

$ sudo docker run -d --name ng3 nginx 53fd36e0e778bc0b29ae70ac3b5c5d76c74b4a8d987b23290a868f7f0f02d435 $ sudo docker run -d --name ng4 nginx c91d26a3b948089a1b19db08b6a719c101e5bef4007c9d727662c2363a3c6d9f $ sudo docker exec -it 53fd36e0e778bc0b29ae70ac3b5c5d76c74b4a8d987b23290a868f7f0f02d435 /bin/sh # apt-get update 此处省略更新apt的输出 # apt-get install iputils-ping 此处省略安装ping命令的输出 # ping ng4 ping: ng4: Name or service not known

三、joined容器

joined容器是另一种实现容器间通信的方式,这种方式非常特别,它可以使多个容器共享同一个网络栈,共享网卡和配置信息,下面举例说明:

我们首先启动一个nginx容器:

$ sudo docker run -d -it --name ng nginx 128be82cc38adb2bc56ee4e8aa2a7e7026601c6cd056af6848539f5e27b6210d

接着启动redis容器,并通过--network参数join到nginx容器网络中,我们进入容器看下其网络配置:

sudo docker run -it -d --network=container:ng redis 344d10125f1693d96bea471c94a13c36f8c868b203dbe234cbb8863fec24f775 $ sudo docker exec -it 344d10125f1693d96bea471c94a13c36f8c868b203dbe234cbb8863fec24f775 /bin/sh 注意此处请大家先自行安装iproute2工具 # ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 43: eth0@if44: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever

接着,我们在进入nginx容器中看下它的网络配置:

看到没?这两个容器网络配置一样的,它们共享相同的网络栈,这样redis容器可以直接通过127.0.0.1访问nginx:

# curl 127.0.0.1:80 Welcome to nginx! html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com.

Thank you for using nginx.

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

不同容器中的程序希望通过loopback高效快速通信,比如Web Server和App Server;

安装在独立容器中的监控服务对其它容器中应用进行监控。

 

分类: 容器技术



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3