编排SpringCloud项目
主要项目架构:注册中心,配置中心,网关,服务提供者
1.问题及解决方法
主要问题1:项目多模块怎么打包?
这个项目,有四个模块,怎么打包部署呢?
直接在父工程,也就是root这里,clean,install,完事!
然后去本地仓库找到打包后的各个子模块的jar包,然后传输到虚拟机相应位置即可。传输方式的话,我这边用的xshell,在xshell直接 cd 到想放这些jar的目录,然后直接拖进去就行了,如果报错找不到rz命令-bash: rz: command not found
,使用yum安装一下就行了yum -y install lrzsz
主要问题2:为啥各个容器运行起来后我的注册中心没有服务?
原因:
在windows下,我们一般写的都是:
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
或者写的 http://localhost:10086/eureka这样的(端口号可能不一样)
这样子,在windows下是可以的,因为就一个主机,一个localhost,但是在docker容器中就不行了,因为每一个容器都有自己的localhost和127.0.0.1,所以就导致不能正确访问注册中心!
如下:随便进入一个容器,查看ip
你再进其他容器,它每一个都是有一个127.0.0.1
问题原因知道了,那么解决方法就来了:
一种治标不治本的方法是进入注册中心的容器,找到他的ip中不为127.0.0.1的那个,就像上边那个图的eth0那个ip,然后把defaultZone: http://127.0.0.1:10086/eureka
改为defaultZone: http://ip:端口/eureka
然后也能解决问题,但是每次重启容器都得修改
较好的办法是:
注册中心还是不变的写法,但是其他要注册的服务就改一下配置文件:
eureka:
client:
service-url:
defaultZone: http://discovery:10086/eureka
这里不一定是discovery
,看你喜欢叫啥就叫啥,反正跟后边编排时的名字保持一致就行了。
注意,这样改了之后,windows下的就不能正常运行了,所以这是正常现象,不要担心
还要注意的是,如果你也是有配置中心,那么远程仓库的也不要忘记修改
然后,就是配置编排文件了
vi docker-compose.yml
version: "3"
services:
mysql:
image: mysql:5.6
container_name: app_mysql
volumes:
- ../mysql/conf:/etc/mysql/conf.d
- ../mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
rabbitmq:
image: rabbitmq
container_name: app_rabbitmq
restart: always
environment:
RABBITMQ_DEFAULT_USER: "guest"
RABBITMQ_DEFAULT_PASS: "guest"
ports:
- "5672:5672"
nginx:
image: nginx
container_name: app_nginx
links:
- bill-gateway:gateway
ports:
- "80:80"
volumes:
- ../nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ../nginx/logs:/var/log/nginx
- ../nginx/html:/usr/share/nginx/html
bill-eureka:
image: bill-eureka
ports:
- "10086:10086"
expose:
- "10086"
bill-gateway:
image: bill-gateway
container_name: bill-g
ports:
- "8086:8086"
links:
- bill-eureka:discovery
expose:
- "8086"
bill-config:
image: bill-config
container_name: bill-c
ports:
- "12000:12000"
links:
- bill-eureka:discovery
expose:
- "12000"
bill-service:
image: bill-service
container_name: bill-s
ports:
- "9091:9091"
links:
- bill-eureka:discovery
- mysql
depends_on:
- mysql
- bill-config
expose:
- "9091"
注意:
links:
- bill-eureka:discovery
这个links,注意后边的这个名字和你上边的那个defaultZone: http://discovery:端口/eureka
是一样的,比如我这里都叫discovery
主要问题3:docker的数据库连不上,JDBC报错
这个原因其实和第二个是一样的,不过我以为配置了links: - mysql就可以了,所以才出的问题,解决方法就是:
把配置文件的改成你的docker-compose.yml 中需要连接数据库的那个 links后边的服务名,我这里是mysql
主要问题4:终于全都跑起来了,但是为啥我的页面发送请求就是得不到结果呢?
我已经在nginx中设置了:links bill-gateway
但是,我把页面中的请求地址改了也不行:
没办法,只好先取巧解决了,直接设置为了虚拟机ip,因为我前边容器暴露了这个8086端口,所以能访问:
等有空了再研究研究。
2.完整流程
1、部署各个镜像
部署bill_gateway
在 docker-files (如果没有请在根目录~下新建该文件夹)新建文件bill_gateway_dockerfile
vim bill_gateway_dockerfile
然后写内容:
FROM java:8
MAINTAINER zh <zh@163.com>
ADD gateway.jar bill-gateway.jar
CMD ["java","-jar","bill-gateway.jar"]
EXPOSE 8086
ADD gateway.jar bill-gateway.jar,前边这个jar是文件夹下的jar,后边是要设置的镜像名
然后build:
docker build -f ./bill_gateway_dockerfile -t bill-gateway .
部署service:
同上,不同在于文件名
vim bill_service_dockerfile
内容:
FROM java:8
MAINTAINER zh <zh@163.com>
ADD bill-service.jar bill-service.jar
CMD ["java","-jar","bill-service.jar"]
EXPOSE 9091
build:
docker build -f ./bill_service_dockerfile -t bill-service .
部署eureka:
同上,不同在于文件名
vim bill_eureka_dockerfile
内容:
FROM java:8
MAINTAINER zh <zh@163.com>
ADD eureka.jar bill-eureka.jar
CMD ["java","-jar","bill-eureka.jar"]
EXPOSE 10086
build:
docker build -f ./bill_eureka_dockerfile -t bill-eureka .
部署config:
同上,不同在于文件名
vim bill_config_dockerfile
内容:
FROM java:8
MAINTAINER zh <zh@163.com>
ADD config.jar bill-config.jar
CMD ["java","-jar","bill-config.jar"]
EXPOSE 12000
build:
docker build -f ./bill_config_dockerfile -t bill-config .
我这里是全部创建镜像了,当然也可以在compose中build就行了
2、编排启动
创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
编写 docker-compose.yml 文件
我现在有的这几个镜像:
version: "3"
services:
mysql:
image: mysql:5.6
container_name: app_mysql
volumes:
- ../mysql/conf:/etc/mysql/conf.d
- ../mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
rabbitmq:
image: rabbitmq
container_name: app_rabbitmq
restart: always
environment:
RABBITMQ_DEFAULT_USER: "guest"
RABBITMQ_DEFAULT_PASS: "guest"
ports:
- "5672:5672"
nginx:
image: nginx
container_name: app_nginx
links:
- bill-gateway:gateway
ports:
- "80:80"
volumes:
- ../nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ../nginx/logs:/var/log/nginx
- ../nginx/html:/usr/share/nginx/html
bill-eureka:
image: bill-eureka
ports:
- "10086:10086"
expose:
- "10086"
bill-gateway:
image: bill-gateway
container_name: bill-g
ports:
- "8086:8086"
links:
- bill-eureka:discovery
expose:
- "8086"
bill-config:
image: bill-config
container_name: bill-c
ports:
- "12000:12000"
links:
- bill-eureka:discovery
expose:
- "12000"
bill-service:
image: bill-service
container_name: bill-s
ports:
- "9091:9091"
links:
- bill-eureka:discovery
- mysql
depends_on:
- mysql
- bill-config
expose:
- "9091"
在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up -d # -d表示以守护模式启动
启动之后,就可以访问啦,但是还是有点问题就是:bill-service明明设置了depends_on bill-config,但是还是会出问题,因为这个bill-config有点慢,需要重启一下bill-service才行
3、外话:rabbitmq部署
然后是没有rabbitmq,拉取镜像,然后创容器,注意两个 -p,一个 -p的时候是这样的:
所以需要两个docker run -id --name=rabbit -p 5672:5672 -p 15672:15672 rabbitmq,因为它需要两个