用Docker发布SpringCloud项目

刀剑吹一生

前言

发现网上对于spring cloud的完整部署文章非常少,对于rabbitMq、redis、consul这些外部服务软件的配置讲解的非常少,并且总是缺少一些细节上的梳理,因此这次通过项目部署挖的坑来总结一下相关注意点,防止持续踩坑。

正文

基本步骤

(在整个配置开始之前,对于服务器可以直接关闭防火墙或者打开相应端口,切记!)

  1. 撰写Dockerfile
  2. 将jar包、Dockerfile等资源摆放到合适的文件夹层次中
  3. 安装外围所需软件,如docker、rabbitMq、redis、数据中心(以consul为例)
  4. 微服务xml配置文件相关注意
  5. 打包镜像、运行等

撰写Dockerfile

Dockerfile主要任务就是获取java镜像以及将jar包加入到容器当中,并输入相应的运行命令,主要为如下内容:

FROM frolvlad/alpine-java:jdk8-slim AS builder
ADD target/xxx-service.jar /app/
CMD ["java","-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/xxx-service.jar"]

其中"-Djava.security.egd=file:/dev/./urandom"只是对linux有效,windows部署不应加入。
注意:jar包名不要写错

整理资源文件

对于微服务,需要打多个jar包进行发布,而Dockerfile中ADD命令有依托相关路径的说法,因此放置位置十分重要,基本放置文件的位置图:

-- xxx-service
	-- xxx-service.jar
	-- Dockerfile

即将相应的jar与Dockerfile放置在同一目录下

安装配置所需软件与外部服务

这里以centos为例:

安装Docker

首先安装相关依赖

sudo yum install -y yum-utils  device-mapper-persistent-data  lvm2

设置仓库为稳定版

sudo yum-config-manager   --add-repo  https://download.docker.com/linux/centos/docker-ce.repo

查看所有docker包的版本信息

yum list docker-ce --showduplicates | sort -r

指定一个版本进行安装

sudo yum install docker-ce-<VERSION STRING>

启动docker并且加入开机启动

sudo systemctl start docker
sudo systemctl enable docker

可以运行hello-world镜像验证是否成功

sudo docker run hello-world
安装rabbitMq

转载:rabbitMq安装

安装erlang

首先安装erlang,这是rabbitMq必要组件。
如果有系统有wget则直接通过这样进行下载。
在usr/local下执行:

wget http://erlang.org/download/otp_src_21.1.tar.gz
tar -zxvf otp_src_21.1.tar.gz
cd otp_src_21.1
# 这里要新建一个erlang文件夹,因为erlang编译安装默认是装在/usr/local下的bin和lib中,这里我们将他统一装到/usr/local/erlang中,方便查找和使用。
mkdir -p /usr/local/erlang
 
# 在编译之前,必须安装以下依赖包
yum install -y make gcc gcc-c++ m4 openssl openssl-devel ncurses-devel unixODBC unixODBC-devel java java-devel
 
./configure --prefix=/usr/local/erlang

如果不报错,执行:

make && make install

然后需要将erlang/bin目录加入到环境变量中:

vim /etc/profile
#########   添加如下内容   ###############
PATH=$PATH:/usr/local/erlang/bin
########################################
 
source /etc/profile

执行erl,如果运行成功,完成!(执行halt().退出)

安装rabbitMq

这里安装前一定要了解erlang与rabbitMq的版本配对问题,如果版本不对应可能会出现奇奇怪怪的问题,因此需要先从官网上进行确认。


# 在usr/local目录下载源码包
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.8/rabbitmq-server-generic-unix-3.7.8.tar.xz
# 解压
tar -xvf rabbitmq-server-generic-unix-3.7.8.tar.xz -C /usr/local/
# 添加环境变量
vim /etc/profile
------  添加如下内容  ------
PATH=$PATH:/usr/local/rabbitmq_server-3.7.8/sbin
 
 
# 重载一下环境变量
source /etc/profile
 
# 添加web管理插件
rabbitmq-plugins enable rabbitmq_management

rabbitMq命令相关

rabbitMq服务端页面端口: 15672
服务启动停止:
启动: rabbitmq-server -detached
停止: rabbitmqctl stop
用户管理:
添加用户: rabbitmqctl add_user username password
删除用户: rabbitmqctl delete_user username
修改密码: rabbitmqctl change_password username newpassword
设置用户角色: rabbitmqctl set_user_tags username tag
列出用户: rabbitmqctl list_users
注意: 如果需要外部访问,务必更改账号密码,不要使用默认guest,默认guest只支持本地访问。

更改配置文件(可省略)

一般情况下rabbitMq在本地运行下不需要conf文件。
rabbitMq需要更改配置文件,则比较复杂。
需要借鉴一下rabbitMq.example:rabbitMq配置文件模板
如果是rpm或者压缩包安装,则将此配置文件命名为rabbitMq.conf放置到安装包路径下的/etc/rabbitmq/rabbitMq.conf下。

安装Redis
redis安装

安装包url:redis最新安装包
/usr/local下执行

wget http://download.redis.io/releases/redis-6.0.1.tar.gz
tar -zxvf redis-4.0.6.tar.gz
yum install gcc
cd redis-6.0.1
# 编译安装
make MALLOC=libc
将/usr/local/redis-6.0.1/src目录下的文件加到/usr/local/bin目录
cd src && make install
配置redis

一般情况下redis服务肯定不能使用localhost,因此配置我们需要更改安装包下redis.conf文件:

配置redis外网可连接

(1)将redis.conf中bind 127.0.0.1注释,保证文件中没有一个bind生效,则启动redis默认配置,外网全部允许连接。
当然如果觉得不够安全,可以只bind相关ip,保证微服务的正常连接。
(2)将protected_mode从yes改为no

设置开机自启

将redis.conf中的daemonize从no改为yes,即允许开启守护线程。

启动或关闭redis
# 在redis目录下执行,并指定redis.conf
./redis-server /path/to/redis.conf
# 关闭redis
./redis-cli shutdown
安装consul
consul安装

(1)下载安装包地址:consul安装包下载
(2)解压相应安装包

unzip consul_1.x.x_linux_amd64.zip

(3)解压完毕后只有一个consul文件,我们需要在本目录建立一个consul文件夹,并将consul执行文件放进去:

mkdir consul_1.x.x
mv consul /usr/local/consul_1.x.x/

(4)在consul_1.x.x目录下建立/data以及/log文件夹,用于存放consul的运行信息。
(5)在本文件夹下创建start.sh,内容为consul命令标题栏中的命令
(6)到/usr/lib/systemd/system/目录下创建consul.service,内容如下:

[Unit]
Description=consul
After=network.target
    
[Service]
ExecStart=/usr/local/consul_1.x.x/start.sh
KillSignal=SIGTERM
    
[Install]
WantedBy=multi-user.target

(6)执行以下命令:

systemctl start consul
systemctl enable consul

如果想要停止则执行:

systemctl stop consul
consul命令

如果只有一台服务器部署,则进入consul目录下执行以下命令:

./consul agent -bootstrap-expect 1 -server -data-dir /usr/local/consul_1.x.x/data \
 -bind x.x.x.x -datacenter=joker -client=0.0.0.0 -ui

-bind即为本服务器ip。
-client设置所有外部可连接client
如果是多服务器配置,则需要更改-bootstrap-expect后的数字,部署几台服务器就设定数字为几。

微服务xml注意事项

(1)远程获取服务配置
如果是远程获取微服务配置,如通过consul从github上获取配置文件,在bootstrap.xml文件中一定要加上spring.cloud.consul.discovery.prefer-ip-address=true的选项,当然如果直接指定ip-address则无需考虑。
原因: docker容器在进行发现服务时默认返回的是容器号而不是ip,因此发布可能会出现问题。
(2)保证服务器联网
(3)检查spring.cloud.config.profile配置是否为发布所需的配置文件
(4)打包时,务必在pom.xml中添加以下依赖,保证跳过运行测试检查:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>

docker微服务部署

run.sh基本配置

完成上面的基本配置后,需要进行镜像打包、容器生成的操作,我们在任意位置创建run.sh文件,文件内容如下:(假设项目相关文件在/home/joker/文件夹下)

docker build -t xxx-service:1.0 -f /home/joker/xxx-service/Dockerfile /home/joker/xxx-service/
docker run -it -p x:x --name 容器名 xxx-service:1.0

注意:
(1)docker build的最后一个参数为build的路径,一定要设置在jar包目录,否则可能出现Dockerfile找不到jar包的情况。
(2)docker run的-p是设置服务器与容器端口号,一般保持两者一致即可。

执行

调用sh run.sh以后,如果在docker run执行完成后发现没有什么错误,就可以将docker设置为后台运行,执行:

# 找到对应容器的容器号
docker ps -a
# 启动容器
docker start xxx

发布完成!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值