部署 Consul服务实现Docker容器跨主机通信
时间:2022-07-22
本文章向大家介绍部署 Consul服务实现Docker容器跨主机通信,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
consul 数据中心的含义,可以将其当做数据库来理解,类似于Redis等非关系型数据库,采用的是键-值对的方式,存放着各个容器的IP及端口信息。 consul的功能很强大,可以以群集的方式运行,并且具备健康监测等功能。
环境如下 docker版本为 18.09.0 部署docker可参考:部署 Docker
hostname |
IP |
service |
---|---|---|
docker01 |
192.168.171.151 |
consul |
docker02 |
192.168.171.150 |
test 端 |
docker03 |
192.168.171.152 |
test 端 |
1、第一台Docker服务器配置如下
[root@docker01 ~]# docker pull progrium/consul
[root@docker01 ~]# docker run -d -p 8500:8500 -h consul --name consul --restart=always progrium/consul -server -bootstrap
#“-h”:表示consul的主机名;“--name consul”表示为该容器名;“--restart=always”表示可以随着docker服务的启动而启动;
#运行consul容器,该服务的默认端口是8500,“-p”:表示将容器的8500端口映射到宿主机的8500端口
#“-serve -bootstarp”:表示当在群集中,加上这两个选项可以使其以master的身份出现
[root@docker01 ~]# netstat -anput | grep 8500
tcp6 0 0 :::8500 :::* LISTEN 2458/docker-proxy
单节点的consul服务这样就部署完成了 2、第二台Docker服务器配置如下
#注:第三台服务器和第二台服务器配置相同
[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.171.151:8500 --cluster-advertise=ens33:2376
#/var/run/docker.sock:Docker的一个编程接口
# “ -H tcp://0.0.0.0:2376 ” :使用本机的tcp2376端口;
# “ --cluster-store=consul://192.168.20.7:8500”:指定运行着consul服务的第一台docker服务器IP及端口;
# “ --cluster-advertise=ens33:2376”:从本机的ens33网卡通过2376端口搜集网络信息,存储在consul上
[root@docker02 ~]# systemctl daemon-reload
[root@docker02 ~]# systemctl restart docker
3、现在使用浏览器访问consul服务的web页面(访问consul服务器IP:8500)
即可看到用来测试的那两台docker服务器IP等相关信息,如下:
4、回到第二台Docker服务器上,创建一个overlay网络
#创建一个名字为my_olay的voerlay网络
[root@docker02 ~]# docker network create -d overlay my_olay
5、切换至第三台Docker服务器上,发现可以看到刚刚在第二台Docker服务器上创建的overlay网络
[root@docker03 ~]# docker network ls #查看docker03的网络,发现其不但有overlay网络
#而且其SCOPE(范围)是global(全局的)
NETWORK ID NAME DRIVER SCOPE
d09f67ff6240 bridge bridge local
26342588dbd3 host host local
35fdd7467962 my_olay overlay global
a1ab061af018 none null local
其实,现在在第二台Docker服务器上基于刚刚创建的overlay网络运行一个容器,在第三台Docker服务器上也基于这个overlay网络运行一个容器,这两个在不同主机上的容器是可以互通的,如下:
#第二台服务器配置如下
[root@docker02 ~]# docker run -itd --name web1 --network my_olay busybox # 基于网络my_olay运行一个容器web01
[root@docker02 ~]# docker exec web1 ip a # 查看其IP信息,发现其除了回环地址,还有两个IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0 # 这个地址就是my_olay给的
valid_lft forever preferred_lft forever
11: eth1@if12: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
valid_lft forever preferred_lft forever
#第三台服务器配置如下
[root@docker03 ~]# docker run -itd --name web2 --network my_olay busybox # 基于网络my_olay运行一个容器web02
[root@docker03 ~]# docker exec web2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
26: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 02:42:0a:00:00:03 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.3/24 brd 10.0.0.255 scope global eth0 # 这个地址就是my_olay给的,和docker02 一个网段
valid_lft forever preferred_lft forever
29: eth1@if30: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:13:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.19.0.2/16 brd 172.19.255.255 scope global eth1
valid_lft forever preferred_lft forever
#在第二台Docker服务器上对第三台Docker服务器上的容器进行ping测试
[root@docker02 ~]# docker exec web1 ping web2
PING web2 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=1.246 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.554 ms
64 bytes from 10.0.0.3: seq=2 ttl=64 time=0.502 ms
- Spark高级操作之json复杂和嵌套数据结构的操作二
- Spark高级操作之json复杂和嵌套数据结构的操作一
- hadoop系列之基础系列
- Spark的调度系统
- Spark Structured Streaming的高效处理-RunOnceTrigger
- Spark度量系统相关讲解
- Spark Structured Streaming高级特性
- Table API&SQL的基本概念及使用介绍
- 使用Linq to Sql 创建数据库和表
- Flink DataSet编程指南-demo演示及注意事项
- 解决 wcf HTTP 无法注册 另一应用程序正在使用 TCP 端口 80
- 构建Flink工程及demo演示
- F-Stack之kqueue封装为epoll介绍
- wcf http 返回图片
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go依赖模块版本之Module避坑使用详解
- 【tcl学习】vivado write_edif
- K8s中优雅停机和零宕机部署
- Python读取.edf格式脑电数据文件
- Kotlin修炼指南(三)——奇技淫巧
- 前端|CSS盒阴影和文字阴影
- 一文读懂Spring Boot各模块组件依赖关系
- 谈一谈|MkDocs介绍及应用
- 讲得最明白的Elasticsearch源码调试环境搭建教程
- 史上最全ThreadPoolExecutor梳理(下篇)
- JAVA|多Realm管理基础实现
- 史上最全ThreadPoolExecutor梳理(上篇)
- 使用缓存必须注意的事项
- ReentrantLock知识点梳理
- ZooKeeper常用API命令