为什么谈常见服务的安装之前需要讨论下Docker容器间的连接或通信方式,因为随着我们安装的Docker容器越来越多,我们会发现存在一些复杂的场景,需要容器间的相互通信来为程序服务,而不仅仅是宿主机与容器的通信。如:容器(Nacos、MySQL)来一起为程序(Spring Boot)服务,需要把 Nacos 中的配置持久化到MySQL中,这时就需要Nacos与MySQL通信。
容器之间通信不能用 localhost
、127.0.0.1
,因为此时 localhost
指的是容器本身而不是主机,只能用主机的 ip:port
通信,但是主机的 ip 地址会随着主机的重启而变化,所以通过 -p
暴露端口的方式不适合容器与容器之间的通信。
先给出结论:
配置 -p
选项让宿主机和容器之间通过 暴露端口
来通信
配置 --network
选项让容器加入同一个网络,也配置 --network-alias
选项让容器间相互连接
具体的方法参考:Docker容器间的连接或通信方式
查看可用的MySQL版本
docker search mysql
拉取MySQL镜像
docker pull mysql:5.7
查看本地镜像
docker images
运行容器
MySQL是常用的关系型数据库,我们希望它能永久的保存数据,哪怕是当容器被删除了数据也不要删除,此时就需要把主机文件夹挂载到容器上来保证即使容器删除后新建的MySQL容器可以使用之前的数据。
# Docker启动MySQL容器
docker run -p 3306:3306 --name mysql-5.7 \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
-v
:挂载主机文件夹 /mydata/mysql/data
到 容器/var/lib/mysq
挂载点-p
:指定外面和容器里面的端口,前面是主机端口,后面是容器端口;-it
:表示交互式终端;-d
:表示后台运行# 进入Mysql容器中
docker exec -it mysql-5.7 /bin/bash
在电脑主机检查是不是可以连接到容器的 MySQL
# 用命令行测试端口连通性
telnet localhost 3306
# 查看能不能连接上MySQL
mysql -u root -P 3306 -h 127.0.0.1 -proot
# 查看容器日志
docker logs -f mysql-5.7
是用Navicat来连接容器中的MySQL
Redis中的数据对于开发和测试来说,其实不是很重要,那就不做挂载了直接启动!
# Docker启动Redis
docker run -d --name redis-test -p 6379:6379 redis:7
# 进入Redis命令控制台(指定容器id或名称也可以)
docker exec -it redis-test
docker run --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
Elasticsearch(后面简称es)是一个分布式的、开源的搜索分析引擎,支持各种数据类型,包括文本、数字、地理、结构化、非结构化。
Spring Boot项目与es整合时版本的兼容性很重要,不兼容的版本会导致意想不到的错误或直接导致不能使用,所以安装es之前必须先确定好版本。版本兼容性官方参考:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#preface.versions。具体如下图:
以上图举例:假设我们的Spring Boot项目的版本是2.1.x,那么对应要求es的最低版本是6.2.2,注意是最低版本,如果测试时还是不能正常使用那么需要修改es的版本为6.2.2的邻近版本但是最好不要超过上一个的限制(上表中是6.8.12)。
作者就遇到过项目的Spring Boot版本是2.1.3.RELEASE,按照兼容性要求使用了es的6.2.2,安装后发现不仅Spring Boot项目不能正常启动而且es的6.2.2版本没有对应版本的中文分词器IKAnalyzer与之对应,所以调整为邻近的6.6.2后都正常了。
以Elasticsearch的6.6.2版本为例:
# 注意下:Elasticsearch的Docker镜像是Elasticsearch官方自己维护的
docker run -p 9200:9200 -p 9300:9300 --name elasticsearch_6.6.2 \
-e "discovery.type=single-node" \
-e "cluster.name=elasticsearch" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx1024m" \
-d "docker.elastic.co/elasticsearch/elasticsearch:6.6.2"
注意下:es的Docker镜像是es官方自己维护的,Docker安装es官方参考:https://www.elastic.co/guide/en/enterprise-search/current/docker.html#docker-image
查看容器日志:
docker logs -f elasticsearch_6.6.2
访问是否会返回版本信息:http://localhost:9200
以Elasticsearch的6.6.2版本为例:
安装中文分词器IKAnalyzer,注意下载与es应的版本,下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
下载完成后解压到es容器的/mydata/elasticsearch/plugins
目录下;目录结构如下:
重新启动服务:
docker restart elasticsearch_6.6.2
再次检查日志和访问http://localhost:9200
docker logs -f elasticsearch_6.6.2
Zipkin是Twitter的一个开源项目,可以用来获取和分析Spring Cloud Sleuth中产生的请求链路跟踪日志,它提供了Web界面来帮助我们直观地查看请求链路跟踪信息。常用语微服务的调用链路跟踪。
Zipkin的数据保存在内存中重启后数据会消失,如果需要保存可以整合Elasticsearch
# 单独安装zipkin
docker run -d --name zipkin -p 9411:9411 openzipkin/zipkin
kibana 是一款适用于 es 的 数据可视化和管理工具,可以提供实时的直方图、线形图、饼状图和地图。支持用户安全权限体系,支持各种纬度的插件,通常搭配 es、logstash 一起使用。
需要注意的是,kibana 的版本最好与 elasticsearch 保持一致,避免发生不必要的错误
以Elasticsearch的6.6.2版本和Kibana的6.6.2版本为例:
安装Elasticsearch的6.6.2版本
#
docker run -p 9200:9200 -p 9300:9300 --name elasticsearch_6.6.2 \
-e "discovery.type=single-node" \
-e "cluster.name=elasticsearch" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx1024m" \
-d "docker.elastic.co/elasticsearch/elasticsearch:6.6.2"
安装Kibana的6.6.2版本
--link
: 建立两个容器之间的关联,kibana 关联到 es。前面的是es容器的名称,后面固定字符串 elasticsearch
#
docker run -d --name kibana_6.6.2 -p 5601:5601 \
--link elasticsearch_6.6.2:elasticsearch \
kibana:6.6.2
检查Kibana日志
docker logs -f kibana_6.6.2
日志上没有什么报错
检查Kibana界面:http://localhost:5601
界面显示类似下图这样,基本没啥问题
上面涉及到3个组件,它们的过程是这样的:Spring Cloud微服务把调用链路的日志发送给Zipkin,Zipkin把数据发送给Elasticsearch进行保存,Kibana图形化显示Elasticsearch的数据。
下面以Elasticsearch的6.6.2、Kibana的6.6.2、Zipkin为例来整合:
Elasticsearch的版本和Kibana的版本要求一致,Zipkin的版本不做要求
接 章节1.6
安装好了Elasticsearch和Kibana,继续把Zipkin整合进来
Docker启动Zipkin连接Elasticsearch,如下:
docker run -d --name zipkin_elasticsearch -p 9411:9411 \
-e STORAGE_TYPE=elasticsearch \
-e ES_HOSTS=http://192.168.1.3:9200 \
openzipkin/zipkin
其中的ip地址填写你自己的主机ip地址
检查是否整合成功
都安装好之后,下一次的启动顺序是有要求的,先要启动Elasticsearch,如下:
docker start elasticsearch_6.6.2
docker start zipkin_elasticsearch
docker start kibana_6.6.2
Consul是HashiCorp公司推出的开源软件,提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。
拉取Consul镜像
docker pull consul # 默认拉取latest
docker pull consul:1.6.1 # 拉取指定版本
安装并运行
docker run -d -p 8500:8500 --name=consul \
consul:1.6.1 \
consul agent -dev \
-ui -node=n1 -bootstrap-expect=1 -client=0.0.0.0
consul agent -dev
使用开发模式启动-ui
开启网页可视化管理界面-node
指定该节点名称,注意每个节点的名称必须唯一不能重复!上面指定了第一台服务器节点的名称为n1
,那么别的节点就得用其它名称-bootstrap-expect
最少集群的Server
节点数量,少于这个值则集群失效,这个选项必须指定,由于这里是单机部署,因此设定为1
即可-client
指定可以外部连接的地址,0.0.0.0
表示外网全部可以连接访问Consul的UI:http://localhost:8500/
手把手教你Docker搭建nacos单机版
参考:https://github.com/oracle/docker-images/tree/main/OracleDatabase/SingleInstance
oracle数据的官方镜像:https://hub.docker.com/_/oracle-database-enterprise-edition(需要登录注册等认证)
docker elastic 官方网址:https://www.docker.elastic.co
docker elastic 官方镜像:https://www.elastic.co/guide/en/enterprise-search/current/docker.html#docker-image
Docker 官方仓库:https://hub.docker.com
我的文章:《如何查看一个Docker镜像有哪些版本.md》
我的文章:《Docker设置国内镜像源.md》
我的文章:《Docker快速入门实用教程.md》
我的文章:《Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务.md》
我的文章:《Docker安装Nacos服务.md》
我的文章:《如何修改Docker中的文件.md》
我的文章:《Docker容器间的连接或通信方式.md》
我的文章:《Docker安装的MySQL如何持久化数据库数据.md》
我的文章:《制作Docker私有仓库.md》
我的文章:《使用docker-maven-plugin插件构建发布推镜像到私有仓库.md》
我的文章:《解决Docker安装Elasticsearch后访问9200端口失败.md》
传送门:保姆式Spring5源码解析
欢迎与作者一起交流技术和工作生活
联系作者