简介
本文介绍的是从0开始部署spring-cloud,而且是使用docker的docker-compose,spring-cloud使用到的注册中心是nacos,基于nacos如果大家还不会,可以先自行去学习,本人也是刚接触不久nacos,也是从官网的git上学习。
前提
本文档涉及的操作,需要在linux上安装mavne,git、docker。前者主要用来在linux上打包项目,而后者git大家都懂,主要是用来拉取最新代码,并且使用maven来打包,打成jar包。基于如何安装maven、git、docker,网上很多手把手教程,我这里就不出教程了。
这里额外引入docker的一些基本命令文档(也是本人编写):传送门
docker-compose安装
git下载二进制文件
从docker-compose的git仓库,选择某个版本的二进制文件下载
https://github.com/docker/compose/releases
本地下载了之后,把这个上传到linux的目录: /usr/local/bin
更改名字
mv docker-compose-linux-x86_64 docker-compose
之后在任何目录下输入命令查看版本: docker-compose -v
注意:一定是这个目录,其他目前目前我没试过。
编写拉起代码的sh脚本文件git-run.sh(重点)
#源码从git上拉取最新的并且maven打包
#项目目录--这个目录记得一定是你的项目代码在linux上的目录
code_path=/root/malan/java/docker/code/spring-cloud-nacos
#分支
branch=master
cd $code_path && git checkout $branch && git pull origin $branch && mvn clean install -DskipTests=true
if [$? -eq 0 ];
then
echo "maven build success"
else
echo -e " maven build fail" && exit 1
fi
复制jar包到指定目录(重点)copy.sh
#复制打包好的jar包
usage(){
echo "Usage: sh copy.sh"
exit 1
}
#这是代码所在路径
code_path=/root/malan/java/docker/code/spring-cloud-nacos
#docker所在路径(这里其实就是jar包公共路径)
docker_path=/root/malan/java/docker
#复制jar
echo "开始复制 nacos-app.jar"
cp ${code_path}/nacos-app/target/nacos-app.jar ${docker_path}/nacos-app
echo "复制 nacos-app.jar完成"
echo "开始复制 nacos-gateway.jar"
cp ${code_path}/nacos-gateway/target/nacos-gateway.jar ${docker_path}/nacos-gateway
echo "复制 nacos-gateway.jar完成"
docker-compose-yml文件脚本编写(非常重要)
这个文件尤其重要,且看里面的内容:
version: '1.27.4' ## docker的版本,名字固定
services: ##服务,名字固定
nacos-gateway: # 这个就是gateway网关服务,nacos-gateway为自己定义
container_name: nacos-gateway # 该服务在容器中的名字
image: nacos-gateway # 该服务在docker里面的镜像名
build: #配合下面主要是使用docker-compose build读取的dockerfile文件里面的内容
context: /root/malan/java/docker/nacos-gateway #dockerfile的路径
dockerfile: dockerfile
ports:
- "7001:7001" #前者7001是docker容器里面的端口后者7001是对外暴露给用户的端口
environment: #一些环境变量,可以不配置
- ACTIVE= dev
- NACOS_URL= 47.99.83.180:8848
volumes: #日志挂在牡蛎
- /root/malan/java/logs:/root/malan/java/logs
restart: always #服务启动不成功或者挂了,会不断重启
deploy:
resources:
limits:
memory: 500M
nacos-app:
container_name: nacos-app
image: nacos-app
build:
context: /root/malan/java/docker/nacos-app
dockerfile: dockerfile
ports:
- "8001:8001"
environment:
- ACTIVE= dev
- NACOS_URL= 47.99.83.180:8848
volumes:
- /root/malan/java/logs:/root/malan/java/logs
restart: always
deploy:
resources:
limits:
memory: 500M
dockerfile编写(非常重要)
dockerfile一般是每个服务都有一个dockerfile,并且跟jar路径保持一致,这里也没说一定保持一致,但是一般给到维护人员能够区分是这个服务的dockerfile,内容如下
FROM centos:7
#作者信息
MAINTAINER sailmalan
ENV TZ=PRC
#在容器启动运行的时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# -p 确保目录名称存在,不存在的就建一个
RUN mkdir -p /root/malan/java
#项目的路径
ENV PROJECT_DIR /root/malan/java
#docker的工作路径
WORKDIR $PROJECT_DIR
#复制jar文件到路径
COPY ./nacos-app.jar /root/malan/java/nacos-app.jar
COPY ./start.sh /root/malan/java/start.sh
COPY ./jdk-8u341-linux-x64.rpm /root/malan/
注意:这里的路径说明:COPY ./nacos-app.jar /root/malan/java/nacos-app.jar
./nacos-app.jar,读取的这个nacos-app.jar文件,路径其实就是上面的docker-compose.yml里面的nacos-app.build.context的路径。
#这里:/root/malan/java/start.sh,有的人不写:/root/malan/java/也可以,但我的不行,我也暂时没有找到原因
RUN chmod 755 /root/malan/java/start.sh
#java的jar运行的jdk环境
RUN rpm -ivh /root/malan/jdk-8u341-linux-x64.rpm && rm -rf /root/malan/jdk-8u341-linux-x64.rpm
#启动脚本
ENTRYPOINT ["/bin/sh","-c","/root/malan/java/start.sh"]
#这里当时有个小坑,就是挂在项目的日志到容器外面的时候,多了个目录,当时设置是这样的:
ENV PROJECT_DIR = /root/malan/java
然后目录就是这样: =/root/malan/java/logs ---->这里是日志挂载的目录,就是因为多了个 = 这样的目录,导致日志挂载不到容器外指定的路径
在看start.sh脚本文件(重点)
java -Dfile.encoding=utf-8 -jar /root/malan/java/nacos-app.jar
路径:/root/malan/java/就是上面dockerfile里面的ENV PROJECT_DIR路径
最后jdk1.8
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
接下来看docker-compose命令操作:在如下目录
1:拉代码,maven打包
执行命令:sh git-run.sh
maven打包完成
2:docker-compose build 的构建命令
执行命令 docker-compose build nacos-app
nacos-app就是上面docker-compose.yml里面提到的
3:docker-compose up -d 部署命令
执行命令:docker-compose up -d nacos-app
这里的nacos-app就是上面docker-compose.yml里面定义的服务名
4:接下来看着docker容器里面有没有nacos-app服务
执行命令 docker ps
5:我的还可以在nacos注册中心看服务是否正常启动(正常启动)