0. 环境:
- 腾讯云服务器,版本centos7.6,我的版本自带docke和docker compose,没有的可以自行安装
1.安装docker
#安装
yum install docker
#检验安装是否成功
[root@VM-16-5-centos ~]# docker --version
Docker version 20.10.5, build 55c4c88
#启动docker
systemctl start docker
2.安装docker compose
可以参考:https://docs.docker.com/compose/install/
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#
sudo chmod +x /usr/local/bin/docker-compose
# 检查是否安装成功
docker-compose --version
3.编写Dockerfile 文件
因为我们的项目需要成为docker的镜像,所以我们必须先编写Dockerfile文件构建我们的项目镜像然后进行编排,Dockerfile文件可以帮我们进行构建。
3.1 Dockerfile文件
- List item
直接在/root创建并编写Dockerfile文件
vim Dockerfile
- List item
在此文件中写入以下内容
FROM java:8
EXPOSE 8888
ADD ./blog_api.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=prod"]
上面几行命令其实很简单,首先依赖jdk8环境,对外暴露8888,然后就是复制blog_api.jar 到docker容器中并命名为app.jar,最后是执行命令java -jar /app.jar —spring.profiles.active=prod,使用的是我们另外编写的一个线上环境配置 注意:你的后端项目在打包后可能命名为blog_api-1.0.0-SNAPSHOT.jar,在上传到服务器后,请命名为blog_api.jar 这个后续会讲,目前可先略过
3.2 编写docker-compose.yml文件
我们需要用到的软件与服务分别有nginx、mysql、redis、还有我们的springboot项目,所以编写如下:
- 在/root目录下创建这个docker-compose.yml文件
vim docker-compose.yml
version: "3"
services:
nginx: # 服务名称,用户自定义
image: nginx:latest # 镜像版本
ports:
- 80:80 # 暴露端口
volumes: # 挂载,前面是挂载到哪儿,后面是nginx的配置目录
- /root/nginx/html:/usr/share/nginx/html
- /root/nginx/nginx.conf:/etc/nginx/nginx.conf
privileged: true # 这个必须要,解决nginx的文件调用的权限问题
mysql:
image: mysql:5.7.36
ports:
- 3306:3306
environment: # 指定用户root的密码
- MYSQL_ROOT_PASSWORD=root
redis:
image: redis:latest
vueblog:
image: vueblog:latest
build: . # 表示以当前目录下的Dockerfile开始构建镜像
ports:
- 8888:8888
depends_on: # 依赖与mysql、redis,其实可以不填,默认已经表示可以
- mysql
- redis
上面的意思,我都用注释解释一遍了,希望可以讲清楚!需要注意的是,nginx中我们对nginx的放置静态资源的html文件夹和配置文件nginx.conf进行了一个挂载,所以我们打包后的文件放置到宿主机/root/nginx/html文件目录就行了哈
3.3 修改SpringBoot中的application-prod.properties配置文件
注意这个application-prod.properties是我从application.properties中拷贝过来的,请按照我的来修改,这地方码神之路讲了,建议看看视频
然后我们再回头看看application-prod.properties文件,mysql和redis的链接之前还是localhost,现在我们需要修改成容器之间的调用,如何知道mysql和redis的链接地址呢?docker compose(编排)就帮我们解决了这个问题,我们可以使用镜像容器的服务名称来表示链接。比如docker-compose.yml中mysql的服务名称就叫mysql、redis就叫redis。
3.4 准备好nginx的挂载目录和配置
在docker-compose.yml中已经提到
- 宿主机的挂载目录:/root/nginx/html
- 挂载配置:/root/nginx/nginx.conf
所以我们在root目录下新建nginx目录,并进入nginx目录下新建html目录和一个nginx.conf配置文件
下图是我已经建立好的
#创建文件并编辑
vim nginx.conf
然后对nginx.conf进行编写,具体配置如下
nginx.conf
#nginx.conf
#user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html last; # 别忘了这个哈
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3.5 上传前端
前端打包之后先修改前端调用后端的接口,配置如下
index.js未做任何改动
修改好之后 运行 npm run build打包得到dist文件,可以将dist文件下的所有文件上传到 /root/nginx/html目录下。如下图:
3.6 部署后端
一切准备就绪后,我们就开始编排部署了,首先打包我们的blog_api项目
之后,点击apply之后,点击运行,见下图
运行之后,就打包成功,可以在target目录下看到打包之后的文件
将这个jar包上传到/root下,并使用mv命令进行重命名
mv blog_api-1.0-SNAPSHOT.jar blog_api.jar
命名之后的文件目录见下图
之后执行编排命令:
#开始编排
cd ~
docker-compose up -d
编排的时间可能有点慢,编排成功之后提示如下:
使用命令监控vueblog镜像的日志
#-t可以一直监控,可以看到报错信息 ab245b88feed代表vueblog的CONTAINER ID,如上图使用docker ps查询出来的
docker logs -t ab245b88feed
到目前为止已经部署成功了,其实可以使用postman测试一下登录,发现返回解决为系统异常,
此时看服务器输出的日志信息发现是没有找到数据库
这时候我们可以使用我们自己电脑的sqkyog或者其他可视化界面远程连接数据库,但是进行远程连接数据库之前需要进行一些配置,配置如下:
docker exec -it mysql-test /bin/bash # mysql-test是上面新建容器时起的名字
mysql -u root -p
# 设置自己的电脑远程连接服务器上的mysql
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxx';
# 成功的话会这样输出 Query OK, 0 rows affected (0.00 sec) xxxx为你的mysql密码
之后远程连接数据库
讲sql文件导入到这个数据库中,导入成功后如下:
此时在进行postman测试,测试结果如图:
在浏览器上输入 http://ip地址看是否部署成功,我的界面如下: