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容器中看下它的网络配置:
$ sudo docker exec -it 128be82cc38a /bin/sh
# 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
看到没?这两个容器网络配置一样的,它们共享相同的网络栈,这样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;
安装在独立容器中的监控服务对其它容器中应用进行监控。
Docker 与 K8S学习笔记(九)—— 容器间通信的更多相关文章
- Docker 与 K8S学习笔记(八)—— 自定义容器网络
我们在上一篇中介绍了Docker中三种网络,none.host和bridge,除了这三种网络,Docker还允许我们创建自定义网络,当我们要创建自定义网络时,Docker提供了三种网络驱动供我们选择: ...
- Docker 与 K8S学习笔记(七)—— 容器的网络
本节我们来看看Docker网络,我们这里主要讨论单机docker上的网络.当docker安装后,会自动在服务器中创建三种网络:none.host和bridge,接下来我们分别了解下这三种网络: $ s ...
- Docker 与 K8S学习笔记(三)—— 镜像的使用
前面的文章介绍过镜像的三种获取方式: 下载并使用别人创建好的镜像: 在现有镜像上创建新的镜像: 从无到有创建镜像. 本文主要介绍前两种. 一.下载镜像 在Docker Hub上有大量优质镜像可以使用, ...
- RT-Thread学习笔记3-线程间通信 & 定时器
目录 1. 事件集的使用 1.1 事件集控制块 1.2 事件集操作 2. 邮箱的使用 2.1 邮箱控制块 2.2 邮箱的操作 3. 消息队列 3.1 消息队列控制块 3.2 消息队列的操作 4. 软件 ...
- Docker 与 K8S学习笔记(十 二)容器间数据共享
数据共享是volume的关键特性,今天我们来看一下通过volume实现容器与host.容器与容器之间共享数据. 一.容器与host共享数据 在上一篇中介绍到的bind mount和docker man ...
- Docker 与 K8S学习笔记(五)—— 容器的操作(下篇)
上一篇我们学习了容器的启动和常用的进入容器的方式,今天我们来看看如何控制容器起停以及容器删除操作. 一.stop.kill.start和restart stop.kill命令都可以停止运行的容器,二者 ...
- Docker 与 K8S学习笔记(二)—— 容器核心知识梳理
本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...
- Docker 与 K8S学习笔记(十)—— 容器的端口映射
我们一般将应用部署在容器里面,而一个服务器上会有许许多多的容器,那么外界该如何访问我们的应用呢?答案是:端口映射. Docker可以将容器对外提供服务的端口映射到host的某个端口上,外网通过此端口访 ...
- Docker 与 K8S学习笔记(六)—— 容器的资源限制
我们在启动Docker容器时,默认情况下容器所使用的资源是没有限制的,这样就会存在部分特别耗资源的容器会占用大量系统资源,从而导致其他容器甚至整个服务器性能降低,为此,Docker提供了一系列参数方便 ...
随机推荐
- kubernetes部署kube-controller-manager服务
本文档介绍部署高可用 kube-controller-manager 集群的步骤. 该集群包含 3 个节点,启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态.当 leader ...
- Requests的安装和使用
一.Requests的安装1.pip3 install requests2.验证 import requests 不报错即可
- 学习java 7.15
学习内容: 进程:正在运行的程序 是系统进行资源分配和调用的独立单位 每个进程都有它自己的内存空间和系统资源 线程:是进程中的单个顺序控制流,是一条执行路径 单线程:一个进程如果只有一条执行路径,则称 ...
- 用python写的推箱子搜索程序
1 # -*- coding: gbk -*- 2 from functools import reduce 3 from copy import deepcopy 4 import re 5 def ...
- 大数据学习day25------spark08-----1. 读取数据库的形式创建DataFrame 2. Parquet格式的数据源 3. Orc格式的数据源 4.spark_sql整合hive 5.在IDEA中编写spark程序(用来操作hive) 6. SQL风格和DSL风格以及RDD的形式计算连续登陆三天的用户
1. 读取数据库的形式创建DataFrame DataFrameFromJDBC object DataFrameFromJDBC { def main(args: Array[String]): U ...
- 【排序算法】——冒泡排序、选择排序、插入排序、Shell排序等排序原理及Java实现
排序 1.定义: 所谓排序,即是整理文件中的内容,使其按照关键字递增或递减的顺序进行排列. 输入:n个记录,n1,n2--,其对应1的关键字为k1,k2-- 输出:n(i1),n(i2)--,使得k( ...
- ORACLE 查询sql和存储性能思路
1.确定session id 如果是存储过程,在程序开头设置客户端标识.并根据标识获取session id. DBMS_SESSION.set_identifier('XXX'); select * ...
- linux ln用法
这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件 这是linux中一个非 ...
- Mockito 简介
Mockito 是一种 Java Mock 框架,主要是用来做 Mock 测试,它可以模拟任何 Spring 管理的 Bean.模拟方法的返回值.模拟抛出异常等等,在了解 Mockito 的具体用法之 ...
- 【力扣】188. 买卖股票的最佳时机 IV
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意:你不能同时参 ...