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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 容器之间可通过IP、Docker DNS Server或joined三种方式进行通信,今天我们来详细学习一下。 一、IP通信 IP通信很简单,前一篇中已经有所涉及了,只要容器使用相同网络,那么就可以使用IP进行访问,本节不做赘述。 二、Docker DNS Server 使用IP通信存在一个最大的问

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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>


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


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


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

 

分类: 容器技术

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2天前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第12天】
13 5
|
7天前
|
存储 运维 云计算
探索Docker容器化:从入门到实践
在这个快速发展的云计算时代,Docker容器化技术正在改变应用的开发、部署和管理方式。本文旨在为初学者提供一个关于Docker的全面入门指南,并通过实践案例展示Docker在实际开发中的应用。我们将一起了解Docker的核心概念、基本操作、网络和存储,以及如何构建和部署一个简单的Web应用。无论你是开发者还是运维人员,本文都会帮助你快速掌握Docker的核心技能。
|
3天前
|
存储 测试技术 开发者
docker中将数据卷挂载到容器
【10月更文挑战第11天】
13 3
|
3天前
|
存储 应用服务中间件 云计算
深入解析:云计算中的容器化技术——Docker实战指南
【10月更文挑战第14天】深入解析:云计算中的容器化技术——Docker实战指南
14 1
|
8天前
|
运维 JavaScript 虚拟化
探索容器化技术:Docker的实践与应用
【10月更文挑战第9天】探索容器化技术:Docker的实践与应用
33 3
|
9天前
|
安全 Cloud Native Shell
云上攻防:云原生篇&Docker容器逃逸
本文介绍了Docker的基本概念及其对渗透测试的影响,重点讲解了容器逃逸的方法。Docker是一种轻量级的容器技术,与虚拟机相比,具有更高的便携性和资源利用率。然而,这也带来了安全风险,特别是容器逃逸问题。文章详细描述了三种常见的容器逃逸方法:不安全的配置、相关程序漏洞和内核漏洞,并提供了具体的检测和利用方法。此外,还介绍了几种特定的漏洞(如CVE-2019-5736和CVE-2020-15257)及其复现步骤,帮助读者更好地理解和应对这些安全威胁。
云上攻防:云原生篇&Docker容器逃逸
|
2天前
|
存储 Kubernetes 监控
深入探索Docker容器化技术的奥秘
【10月更文挑战第15天】深入探索Docker容器化技术的奥秘
10 0
|
3天前
|
运维 Kubernetes 监控
掌握Docker容器化技术:构建、部署与管理的高效实践
【10月更文挑战第14天】掌握Docker容器化技术:构建、部署与管理的高效实践
12 0
|
3天前
|
前端开发 Docker 容器
主机host服务器和Docker容器之间的文件互传方法汇总
Docker 成为前端工具,可实现跨设备兼容。本文介绍主机与 Docker 容器/镜像间文件传输的三种方法:1. 构建镜像时使用 `COPY` 或 `ADD` 指令;2. 启动容器时使用 `-v` 挂载卷;3. 运行时使用 `docker cp` 命令。每种方法适用于不同场景,如静态文件打包、开发时文件同步及临时文件传输。注意权限问题、容器停止后的文件传输及性能影响。
|
11天前
|
运维 监控 Cloud Native
深入了解容器化技术:Docker 的应用与实践
【10月更文挑战第6天】深入了解容器化技术:Docker 的应用与实践
19 0

相关产品

  • 容器服务Kubernetes版