一句简单的话概括:部署的过程中所有的操作全部自动化,无需人工手工干预
*传统的部署方式如下:*
a. 运维人员手工使用Scp、Xftp等方式来传输数据。
b. 手工登录服务器执行git pull 、svn update等命令进行更新代码的操作。
c. 开发人员手工编译打包,然后通过内网传输给运维人员。
d. 运维人员通过rz上传的方式上传到目标服务器,然后,执行重命名原包、拷贝新包到目标目录,再执行服务应用重启命令完成整个部署过程。
看似非常简单,也不是很麻烦,但是一旦项目多,部署频繁,这种情况下就会大大降低工作效率。
*自动化部署和手动部署比较的优势:*
手动部署容易出现错误,而自动化错误概率很低 (会出错)。
如果部署过程不是自动化的,那么这个过程既不可重复也不可靠,需要很多的时间进行调试和排错(需要额外的时间)。
手动部署的流程往往需要记录在文档中,这个文档需要额外的维护时间,而且往往和最新版本的部署不是一致的(更新滞后),而且经常也是不完整的,自动化部署脚本往往没有这个方面的问题。
自动化部署本质上是鼓励协作的,对于有一定水平的人员来说,通过看部署脚本来了解部署流程往往比通过文档来理解部署流程来的容易
相比较自动化部署,传统部署整个过程都需要人员参与,占用大量的时间,效率低下。
传统部署上线、更新、回滚速度慢,存在一定的管理混乱,人为误操作的机率增大。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NlKVjTtG-1600660340987)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1597997622044.png)]
服务器三台,要求linux主机,内核高于3.10,主机内存不低于1GB。
Ci-build | 192.168.2.133 | Ubuntu 20.04 LTS \n \l |
---|---|---|
Ci-data | 192.168.2.122 | Ubuntu 20.04 LTS \n \l |
Ci_deploy | 192.168.2.159 | Ubuntu 20.04 LTS \n \l |
软件要求:
gitlab,drone-1.0,rancher-1.6.30, harbor-2.0, docker-19.03.8,docker-compose-1.25.5
端口配置及软件部署:
Ci_build(192.168.2.133)
Name | port |
---|---|
sonarqube | 9000 |
rancher | 8080 |
mqtt | 18083,1883 |
drone | 80, 443 |
Docker-compose |
Ci_data(192.168.2.122)
harbor | 80 |
---|---|
docker | |
Docker-compose |
Ci_deploy(192.168.2.159)
gitlab | 8081 |
---|---|
Rancher-agent(容器运行宿主机) | |
Docker | |
Docker-compose |
### centos
1.安装openssh及客户端,postfix服务器和lokkit命令
sudo yum install -y curl policycoreutils-python openssh-server openssh-clients postfix cronie lokkit
2. 启动postfix邮件服务器和sshd,并设置为开机自动启动
sudo systemctl enable sshd
sudo systemctl start sshd
sudo systemctl enable postfix
sudo systemctl start postfix
sudo chkconfig postfix on
3.使用lokkit命令设置防火墙,打开http和ssh的访问权限
sudo lokkit -s http -s ssh
4. 添加gitlab镜像
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.0.0- ce.0.el7.x86_64.rpm
##4.获取Gitlab源
##curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab- ce/script.rpm.sh | sudo bash
5.下载安装gitlab
rpm -i gitlab-ce-10.0.0-ce.0.el7.x86_64.rpm
6.初始化配置
sudo vim /etc/gitlab/gitlab.rb
6.1.配置external_url
external_url 'http://192.168.206.130/' # 将url换成本机ip,为gitlab对外提供的访问链接,也可以是域名。
6.2.修改gitlab服务端口
unicorn['port'] = 8081 # 将Unicorn打开并将默认端口从8080改为8081避免端口冲突,如本机没有使用8080端口,则可不改。
6.3.重载配置
sudo gitlab-ctl reconfigure
7.首次登录为root设置初始密码,配置邮箱,配置邮箱需要开启该邮箱的smtp授权,并记录授权码,否则会无法接收到gitlab发 送的邮件。
8.修改gitlab.rb
## GitLab email server settings
###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html
###! **Use smtp instead of sendmail/postfix.**
# 打开smtp
gitlab_rails['smtp_enable'] = true
# smtp服务通信
gitlab_rails['smtp_address'] = "smtp.qq.com"
# 端口
gitlab_rails['smtp_port'] = 465
# 接收邮箱
gitlab_rails['smtp_user_name'] = "[email protected]"
# 邮箱接收smtp服务授权码
gitlab_rails['smtp_password'] = "zobvwuxginehbeda"
gitlab_rails['smtp_domain'] = "smtp.qq.com"
# 登录确认
gitlab_rails['smtp_authentication'] = "login"
# 邮件发送自动登录确认
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
# 此行必须新增,邮件来源地址
gitlab_rails['gitlab_email_from'] = '[email protected]'
然后 sudo gitlab-ctl reconfigure 重载配置
然后在gitlab上选择settings 将其默认邮箱改为配置邮箱,发送邮件,并在配置邮箱中确认邮件信息,就会更新邮箱配置。 后续用管理员添加新用户并登陆。
9.配置git存储仓库目录及进行数据仓库迁移
sudo vim /etc/gitlab/gitlab.rb
配置git存储仓库:
git_data_dirs({
"default" => { "path" => "/home/gitlab/git-data" }
})
gitlab数据仓库迁移:
sudo gitlab-ctl stop
sudo rsync -av /var/opt/gitlab/git-data/repositories /home/gitlab/git-data/
sudo gitlab-ctl upgrade # 组件版本更新(可选)
sudo ls /home/gitlab/git-data/
sudo gitlab-ctl start
sudo gitlab-ctl reconfigure
### ubuntu
安装依赖
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
sudo apt-get install -y postfix
信任Gitlab的GPG公钥
curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
配置镜像路径加速(清华镜像)
sudo vim /etc/apt/sources.list.d/gitlab-ce.list
到此路径:https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/ # 寻找对于你系统版本的镜像
Ubuntu18.4: deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu bionic main # 将其写入 gitlab-ce.list
安装gitlab-ce
sudo apt-get update
sudo apt-get install gitlab-ce
执行配置
sudo gitlab-ctl reconfigure
启动gitlab
sudo gitlab-ctl start
后续配置的更改和centos基本没差别
只是更改unicorn的时候连带更改
unicorn['listen'] = '127.0.0.1'
unicorn['port'] = 8081
1.卸载docker旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
2.更新apt包索引
sudo apt-get update
3.安装apt依赖包,用于通过https来获取仓库
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
4.添加docker官方gpg密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥
sudo apt-key fingerprint 0EBFCD88
# 设定稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
5.安装docker
安装最新版本的docker-ce
sudo apt-get install docker-ce docker-ce-cli containerd.io
安装特定版本的docker-ce
列出仓库可用版本
apt-cache madison docker-ce
安装指定版本docker-ce <VERSION_STRING> 是所需docker版本的版本号
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
6.测试
sudo docker run hello-world
7.安装docker-compose
7.1 docker-compose是python写的命令行程序可以直接pip安装,也在github上有地址 https://github.com/docker/compose,可以直接clone下来python setup.py install 安装
7.2 docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker- compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
7.3 授权
sudo chmod +x /usr/local/bin/docker-compose
查看版本信息
docker-compose --version
1.登入gitlab,选择settings,application。新建一个new application,注意 Redirect URL(回调地址) 这与使用drone 的版本有关,
drone 0.x url 应如 http://ip or 域名/authorize
drone 1.x url 应如 http://ip or 域名/login
记录application ID 和 Secret
2.build主机(启动drone)
创建docker-compose.yml 内容如下
3.自搭建的gitlab需要在root登录的情况下到Admin Area -- Settings下 找到OutBound Request 勾选上Allow Requests To The Local Network From Hooks And Services,否则drone会因为权限问题,找不到gitlab的储存库。
4. 免密配置
4.1.查看是否存在id_rsa.pub或id_dsa.pub,如果存在就跳过第二步
cd ~/.ssh
ls
4.2.创建一个ssh-key,连续enter,就会在~/.ssh下创建id_rsa.pub等文件
ssh-keygen -t rsa -C "邮箱"
4.3.添加ssh-key到gitlab
拷贝id_rsa.pub中的内容到gitlab配置ssh的地方,保存。
4.4.测试
ssh -T git@gitlab_ip
出现Are you sure you want to continue connecting (yes/no)? 输入yes
如果前面配置了密码,接下来就会输入密码,没有配置就不用输入,会出现welcome to gitlab 表明配置成功。
# ip:192.168.2.133 ci-build
### docker-compose.yml
# 启动的版本
version: "2.1"
# 服务启动入口,这是docker-compose.yml文件的规范写法,便于后续服务管理。
services:
# 它是services标签下的二级标签,这个名字是用户自定义的,它就是服务名称。
drone-server:
#从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID,如果镜像不存在,Compose 会自动拉去镜像
image: drone/drone:1
#定义端口映射,比如下面配置中将容器上的公开端口80和443转接到主机上的外部端口 80和443
ports:
- 443:443
- 80:80
#数据卷挂载,用于数据持久化,并且数据卷的更新不会影响容器,下面是将容器里的drone目录挂载到宿主机data目录数,并且数据卷的指定路径可以是相对路径
volumes:
- /var/lib/drone:/data
# 指定容器退出后的重启策略为始终重启,该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped
restart: always
# 定义环境变量和配置
environment:
# 使用runner
- DRONE_AGENTS_ENABLED=true
# 调试相关(日志debug),部署的时候建议先打开
- DRONE_LOGS_DEBUG=true
# 自动授权
- DRONE_GIT_ALWAYS_AUTH=false
# gitlab服务器地址
- DRONE_GITLAB_SERVER=http://192.168.2.159/
# application ID
- DRONE_GITLAB_CLIENT_ID=
# application Secret
- DRONE_GITLAB_CLIENT_SECRET=
# # 为server和agent设置一个统一识别码 随便输,但必须前后一致
- DRONE_RPC_SECRET=e349d16fa70e27bdd1043c1ec3d83478
# 为drone的settings添加Trued选项 username是gitlab用户名 admin默认为true
- DRONE_USER_CREATE=username:tklin,admin:true
# 最大并发执行的pipeline数 默认为1
- DRONE_RUNNER_CAPACITY=3
# drone服务器地址
- DRONE_SERVER_HOST=ip
# rpc协议 http/https
- DRONE_SERVER_PROTO=http
# TLS自动创建
- DRONE_TLS_AUTOCERT=false
# 配置容器连接的网络
networks:
- ci_net
drone-agent:
image: drone/drone-runner-docker:1
restart: always
# 解决容器的依赖、启动先后的问题,如下,会先启动drone-server,在启动drone-agent
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=192.168.2.159
- DRONE_RPC_SECRET=e349d16fa70e27bdd1043c1ec3d83478
# 最大并发执行的pipeline数 默认为1
- DRONE_RUNNER_CAPACITY=3
# runner名字 默认为服务器ip
- DRONE_RUNNER_NAME=ip
# 打开日志监控
- DRONE_LOGS_TRACE=true
networks:
- ci_net
networks:
ci_net:
### docker搭建本地sonarqube服务器
1. 配置数据库,注意sonarqube7.9以上不支持mysql数据库,并且sonarqube7.9以下对于mysql数据库版本要求在5.7到8.0之 间。
1.1. 本地拉取mysql5.7镜像
docker pull mysql:5.7
1.2. 启动mysql镜像
docker run -p 3307:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
1.3. 进入启动的mysql container
docker exec -it mysql(容器名) bash
1.4. 创建sonar数据库和sonar用户
mysql -u root -p # 登陆mysql
create database sonar # 创建sonar数据库
CREATE USER 'sonar'@'%' IDENTIFIED WITH mysql_native_password BY 'sonar';
GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%'; # 添加远程登录用户
2. 启动sonar并开放9000端口
docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 --link=mysql:mysql -e SONARQUBE_JDBC_USERNAME=sonar -e SONARQUBE_JDBC_PASSWORD=sonar -e SONARQUBE_JDBC_URL="jdbc:mysql://ip:3307/sonar? useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=
true&useConfigs=maxPerformance&useSSL=false" sonarqube:6.7.5
# 192.168.2.122 ci-data
1. 私有仓库harbor的搭建,harbor的搭建基于docker和docker-compose
1.1.下载harbor离线安装包并解压
wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.5.0.tgz
tar xf harbor-online-installer-v1.5.0.tgz
1.2.根据下载的harbor版本不同,解压后harbor文件夹下的文件也不相同,harbor1.x版本解压后会有harbor.cfg这个文件,而harbor2.x版本解压后会有harbor.yml.tmpl这个文件,两个文件都是harbor的配置文件,不同的时,需要把2.x版本中新建一个harbor.yml文件,并将harbor.yml.tmp1中的内容复制到harbor.yml中,不然后续启动harbor会因找不到配置文件而出错。
1.3.修改配置文件
将harbor配置文件中hostname设置为访问地址,这个地址是作为外部访问仓库的唯一凭证,可以使用ip/域名,但不可设置为127.0.0.1 && localhost,如果是harbor2.x版本,还需要将配置文件中 https related config 部分注释掉,在未给harbor配置ssh证书的情况下。注意,2.x版本,harbor.yml harbor.yml.tmpl文件都需要修改。
#### harbor.yml
# https related config
# https:
# https port for harbor, default is 443
# port: 443
1.4.启动harbor,第一次启动harbor使用 sudo ./install.sh,这过程可能需要几分钟,需要拉取harbor所需的依赖镜像。
启动成功后harbor文件夹下会多出docker-compose.yml文件,后续stop,restart,start都可以使用docker-compose.yml文件来执行。
注意:此时要先docker-compose stop
sudo vim docker-compose.yml
在ports处添加:- 443:443
- 8443:8443
配置443端口和8443端口,不然本地是不能登录的。
1.5.使用ip登陆harbor,账号admin,密码默认Harbor12345
1.6.harbor客户端配置免https
harbor客户端其实就是任何一个安装了docker的主机,及代表有能力将镜像传送到仓库。
首先cd etc/docker, 查看该目录下是否有daemon.json文件,没有则创建(touch daemon.json)。
sudo vim daemon.json
添加:{ "insecure-registries":["harbor_server ip"] }
sudo systemctl daemon-reload
sudo systemctl restart docker
测试:
docker login docker_server_ip
登陆成功则表示配置成功
1.7.镜像上传到harbor
docker pull nginx # 从docker hub 拉取nginx镜像
docker tag nginx:版本(latest) harbor_server_ip项目名称(library)/nginx:1.0 # 给镜像打标签
docker push harbor_server_p/项目名称(library)/nginx:1.0
1.8.从harbor拉取镜像
docker rmi -f 镜像id # 删除本地镜像
docker pull harbor_server:ip/项目名称(library)/nginx:1.0(镜像名称及版本)
### rancher配置
# 192.168.2.133 ci-build
环境要求: linux主机,内核高于3.10,主机内存不低于1GB,rancher不支持Docker for Windows及 Docker for Mac
rancher服务器是个docker image 因此rancher本身不需要安装,只需要执行docker命令下载并且成功运行docker服务器镜像
启动 rancher
# 单机模式(测试环境)
docker run -d --restart=always -p 8080:8080 rancher/server # 单机模式 仅仅适用于测试环境,生产使用rancher,需挂载外置数据库(mysql)或者将数据挂载到宿主机上。使用数据库,还需要对数据库做性能优化,保证rancher运行的最佳性能。
登陆rancher
http://ip:port
初次登陆需配置访问控制。
注册url(提供访问-ui界面): 初次登陆ui界面提示-注册url(这个url是rancher—server运行所在的url,并且此url能够被主机所访问)
添加主机:基础架构-主机-添加主机-Custom(默认)-在第四步输入主机ip-第五步会获得注册rancher脚本,复制到rancher-agent主机并运行,主机注册成功后,点击关闭,就可以主机界面看到注册好的主机了。
### 集成harbor
基础架构-镜像库-添加镜像库-选择CuSTOM-私有仓库address(harbor_server_ip)
用户名和密码是harbor服务器的账号密码
添加服务 -- 选择镜像(harbor_server_ip/项目名称/镜像名:tag) -- 端口映射
访问rancher_ip:映射的端口号,如果可以访问成功,如镜像是nginx,则可以看到welcome to nginx 表示集成成功。
初始项目结构展示,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gDQma3Dq-1600660340990)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1597907115162.png)]
在与src同级目录中添加.drone.yml(自动化部署配置文件),Dockerfile(镜像定制文件),如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wQNAGYnT-1600660340991)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1597907321897.png)]
部署项目前的准备工作
1. 将项目从gitlab上下拉到本地,并创建.drone.yml文件和Dockerfile文件
2. 在drone界面打开项目开关,并在settings中勾选Trusted和public,这样当项目有更改就会触发drone,进行部署
3. 在搭建好的harbor仓库新建项目,并设置为公开,注意项目名要与.drone.yml文件中定制镜像配置项中的repo相对应
4. 在rancher中添加一个新的应用,并添加一个新的服务,服务的镜像可以为空,但端口映射必须是你项目开放的访问端 口,作为镜像上传后容器的的启动服务,并且在.drone.yml中启动容器项中的service相对应。
5. 在rancher中API中创建密钥,并记录access_key和secret_key并在.drone.yml进行配置
.drone.yml
kind: pipeline
name: pipeline-example-maven
# 代码编译
# steps类似docker-compose.yml中的services,作为.drone.yml文件规范及服务启动入口
steps:
# steps下的二级标签,用户自定义服务名
- name: build
# 服务镜像
image: maven:3-jdk-10
# 命令行,commands列举服务将要执行的命令。
commands:
# 清洁打包 因为java项目需要编译后才能进行代码扫描
- mvn clean package
# 代码扫描
#steps:
- name: analysise
# 基于drone的代码扫描插件,配合sonarqube使用
image: aosapps/drone-sonar-plugin:1.0
settings:
# 具有架构(http / https)的SonarQube的主机地址及开放端口
sonar_host: http://192.168.2.133:9000
# 用户令牌,用于将分析报告发布到SonarQube Server。单击用户–我的帐户–安全性–生成令牌。
sonar_token: 8aea4f648d7cab5103c266063c4b059eeec90604
#下面是可选添加配置
# 代码版本,默认值DRONE_BUILD_NUMBER
ver: 1.0
# 超时,默认60s
timeout: 20
# 资料来源,包含源文件的目录的逗号分隔路径
sources: .
# 水平,控制分析期间生成的日志的数量/级别。默认值INFO。调试:显示信息日志+调试级别的更多详细信息。跟踪:显示调试日志以及SonarQube扫描仪执行的所有ElasticSearch查询和Web API调用的时间。
# 定制镜像
level: debug
# showProfiling,显示日志以查看分析仪在哪里花费时间。默认值false
showProfiling: true
# 排除,以逗号分隔的文件路径模式列表,将其从分析中排除
exclusions:
#steps:
# 定制镜像,并推送到私有仓库harbor
- name: structure
# 拉取docker插件镜像,来作为dockerfile定制镜像的容器,及harbor配置
image: plugins/docker
settings:
# 配置dockerfile文件定制镜像,配置其路径
dockerfile: ./Dockerfile
# 配置私有化镜像库地址
registry: 192.168.2.122
# 定制的镜像在私有化镜像库的具体存放位置及镜像名称规定
repo: 192.168.2.122/java/springboot-jsj-test
# 私有仓库的登录验证
username: admin
password: Harbor12345
# 镜像版本,默认为latest
tags:
- 'latest'
# 使用http,默认为https
insecure: true
# 数据卷挂载
volumes:
- name: docker
path: /var/run/docker.sock
# 启动容器,使用rancher(容器编排工具)
#steps:
- name: rancher-deploy
# drone-rancher插件,利用此插件来启动rancher
image: pelotech/drone-rancher
settings:
# rancher-server地址
url: 'http://192.168.2.133:8080'
# rancher的密钥配置,在rancher的ui界面中api中设置密钥,获取access-key和secret-key,作为连接rancher的唯一凭证
access_key: 1750EF1CB7EC4D9EF2F2
secret_key: wqiuKLoHvtRc4TyWS4H7a2gzUn2fRX8RALncF7xM
# 容器用于升级的镜像,该环境上的rancher环境升级
service: javaspringboot/boot
# 镜像地址及版本号
docker_image: 192.168.2.122/java/springboot-jsj-test:latest
# 在停止旧容器之前启动新容器,默认为true
start_first: false
# 如果容器启动成功,将自动确认服务升级,默认为false
confirm: true
# 超时时间,默认为30s
timeout: 301
# 设置启动机制,如下,当master分支发生改变,启动容器
when:
branch: master
# 服务升级的批量大小
batch_size: 5
# 数据卷,此数据卷是配合insecure: true选项,在它为true的情况下,必须要有数据卷挂载,否则则会报错。
volumes:
- name: docker
host:
path: /var/run/docker.sock
FROM maven:3-jdk-10 AS MAVEN_BUILD ## 告知docker采用maven编译器,构建第一步采用基础镜像Docker将首先在本地查找镜像,本地不存在后,将从DockerHub拉取。 Maven会在最后阶段被剔除掉
MAINTAINER xichuan.lin ## 镜像定制者信息
COPY pom.xml /build/ ## 在镜像中创建一个build目录,并拷入pom.xml文件
COPY src /build/src/ ## 拷入src目录到镜像中build目录
WORKDIR /build/ ## 设置build为工作目录,后续任何命令都在此目录中运行
RUN mvn package ##执行mvn包来运行编译和打包应用,生成成可执行的JAR文件。在第一次构建镜像时,Maven将从公共Maven库拉取所有需要的依赖项,并将它们缓存在镜像的本地。后续的构建将使用这个缓存版的镜像层,这意味着依赖项将在本地引用,而不必再次从外部拉取。至此,已经完成了镜像定义,只需等其构建成一个可执行的JAR文件。这是多阶段构建的第一部分。下一阶段将获取JAR并运行它。
FROM openjdk:8-jre-alpine ##告知Docker多阶段构建的下一步采用openjdk:8-jre-alpine的基础镜像。再次使用Java 8 JRE的Alpine版本,这一步的选择其实比前面的Maven版本选择更为重要,因为存在于最终版的镜像只是openjdk:8-jre-alpine,因此如果要尽可能控制最终镜像大小的话,选择轻量级JRE镜像就非常重要。
COPY --from=MAVEN_BUILD /build/target/jsj-test.jar /app/ ##告知Docker从MAVEN_BUILD阶段的/build/target目录复制jsj-test.jar到/app目录。至于jar包的名字,这个在pom.xml中配置
EXPOSE 8090 ## 打开8090端口监听容器
ENTRYPOINT ["java","-jar","jsj-test.jar"] ##告知Docker在容器运行本镜像时,运行哪些命令。本部分用冒号进行多命令的隔离。本案例中,需要把执行JAR文件复制到/app目录运行。
1. 添加阿里镜像源
<repositories>
<repository>
<id>spring</id>
<url>https://maven.aliyun.com/repository/spring</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
2. 配置jar包name
<build>
<finalName>jsj-test</finalName>
</build>
3.取消maven编译过程中的测试
在build下添加:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
docker-compose.yml
version: '3'
services:
emq:
# emq镜像
image: emqx/emqx
# 容器别名
container_name: emqx
# 端口
ports:
# emq-ui的访问端口
- "18083:18083"
# 项目接入emq的端口
- "1883:1883"
- "8084:8084"
- "8883:8883"
- "8083:8083"
## rancher-agent主机为192.168.2.159 此服务器作为项目容器运行服务器,因此项目依赖也就直接使用docker安装在宿主机上
1.安装mysql 开放3306端口
docker pull mysql:5.7 ## 拉取mysql镜像
## 通过镜像创建容器并运行
docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
## -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
## -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf
## -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
## -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
## -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
2. 进入mysql容器更新登录密码并刷新权限
docker exec -it 容器id /bin/bash
GRANT ALL ON *.* TO 'root'@'%'; ## 授权
ALTER USER 'root'@'localhost' IDENTIFIED BY 'pwd' PASSWORD EXPIRE NEVER;#更新加密规则
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';#更新root密码
flush privileges; # 刷新权限
3. 安装redis 开放6379端口
docker pull redis:latest # 拉去最新版本redis镜像
docker run -itd --name redis-test -p 6379:6379 redis # 运行redis容器
docker exec -it redis-test /bin/bash # 测试redis服务
## docker-compose.yml
version: "3"
services:
mongodb:
image: mongo:latest
container_name: iot-platform-mongodb
restart: always
ports:
- 27017:27017
environment:
TZ: Asia/Shanghai
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: kp0808KP
volumes:
- /home/always/iot-platform/mongodb-data/:/data/db
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
consul:
image: consul: latest
container_name: iot-platform-consul
restart: always
volumes:
- /home/test/consul/data:/consul/data
- /home/test/consul/config:/consul/config
ports:
- 8500:8500
command:agent -dev -bind=0.0.0.0 -client=0.0.0.0 -node=consul_Server1 -bootstrap-expect=1 -ui
配置数据库
在项目文件springboot-jsj-test\src\main\resources\application-dev.yml中配置数据库,如下图:
配置mysql
配置redis
在项目文件src\main\resources/application-dev.yml中配置mqtt服务器,如下图所示:
注意:配置consul时,host为consul服务器的地址,ip-address为项目部署ip
4.配置emq
至此,项目部署的配置全部完成,接下来将修改的配置代码及添加的文件上传到gitlab中,自动触发drone,并运行.drone.yml文件,实现自动化的编译-代码扫描-镜像定制-上传-容器部署
补充 还需要要添加一个sonar-project.properties文件,目的是解决代码扫描阶段找不到sonar.java.binaries而出现错误。
tion-dev.yml中配置数据库,如下图: