Docker部署SpringBoot+Vue前后端分离项目

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

本文主要讲解如何在Linux环境下使用Docker部署前后端分离项目,其中涉及到使用Docker安装本人项目相关的一些环境 ,例如mysql、rabbitmq、redis,基于CenterOS7.0

Docker环境安装

1.安装Docker客户端

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

2.配置镜像加速器

如果购买的是阿里云服务器,登录容器镜像服务控制台后,在左侧导航栏选择镜像工具>镜像加速器,针对Docker客户端版本大于 1.10.0 的用户可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器。将自己的加速器地址复制过来替换,执行以下命令即可。

image.png

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

安装Portainer

Portainer 是一个轻量级Web端的Docker管理UI,Portainer够轻松地管理不同的Docker环境(Docker主机或集群)。Portainer的部署和使用十分简单。Portainer可以部署为Linux容器或Windows本机容器,也支持其他平台。Portainer允许您管理所有Docker资源(容器、映像、卷、网络等)!它与独立的Docker引擎和Docker集群模式兼容。

1.安装

# 拉取官方镜像
docker pull portainer/portainer
# 运行镜像到容器
docker run -d -p 9000:9000  --restart=always -v /var/run/docker.sock:/var/run/docker.sock -m 20M --oom-kill-disable --memory-swap=-1 --name portainer portainer/portainer

2.访问页面

http://localhost:9000,第一次打开需要设置用户名密码,docker模式我一般选择Local本机模式。通过此工具我们可以更加简便的对镜像和容器进行操作和管理。

登录页

操作面板

安装MySQL

1.拉取官方镜像

docker pull mysql:8.0.0

2.查看镜像是否拉取成功

docker images

3.一般来说数据库容器不需要建立目录映射

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 --name mysql mysql:8.0.0

4.如果要建立目录映射

docker run -d -p 3306:3306 -v /home/docker/mysql/data:/var/lib/mysql -v /home/docker/mysql/logs:/var/log/mysql -e MYSQL_ROOT_PASSWORD=12345 --name mysql mysql:8.0.0

命令解释:

  • -d:后台运行容器,保证在退出终端后容器继续运行
  • -p:端口映射,此处映射 主机3306端口 到 容器的3306端口
  • -e:配置信息,此处配置mysql的root用户的登陆密码
  • --name:容器名,此处命名为mysql

注意:

  1. 查看生成的mysql容器的时候,端口映射会出现一个33060的端口,这是MySQL的MySQL Shell操作所需要的X协议端口,属于必备端口。详见:https://dev.mysql.com/doc/mysql-port-reference/en/mysql-ports-reference-tables.html#mysql-client-server-ports
  2. 不要映射 /etc/mysql 配置文件目录,会把镜像默认的配置文件夹替换为空文件夹。

5.检查容器是否正常运行

# 可以看到容器ID,容器的源镜像,启动命令,创建时间,状态,端口映射信息,容器名字
docker ps

6.进入容器

docker exec -it mysql  /bin/bash
# 本地连接mysql客户端
mysql -u root -p12345

7.如果你的容器运行正常,但是无法访问到MySQL,一般有以下几个可能的原因

  1. 防火墙阻拦
# 开放端口:
$ systemctl status firewalld
$ firewall-cmd  --zone=public --add-port=3306/tcp -permanent
$ firewall-cmd  --reload
# 关闭防火墙:
$ sudo systemctl stop firewalld
  1. 未开启MySQL远程访问权限

Mysql为了安全考虑,初始的时候并没有开启Root用户(解释:mysql的root用户和我们云服务器的root用户是两个不同的,分开的)的远程访问权限,Root(解释:这里是指mysql的root用户,而不是云服务器的root用户)只能本地localhost,127.0.0.1访问

赋予权限: grant 权限列表 on 数据库 to ‘用户名’@‘访问主机’ ;,如果要使用某个账号来远程登录,必须将账号的host属性值更改成%

# mysql使用mysql数据库中的user表来管理权限,修改user表就可以修改权限(只有root账号可以修改)
 
mysql> use mysql;
Database changed
 
mysql> select host,user,password from user;
+--------------+------+-------------------------------------------+
| host                    | user      | password                                                                 |
+--------------+------+-------------------------------------------+
| localhost              | root     | *A731AEBFB621E354CD41BAF207D884A609E81F5E      |
| 192.168.1.1            | root     | *A731AEBFB621E354CD41BAF207D884A609E81F5E      |
+--------------+------+-------------------------------------------+
2 rows in set (0.00 sec)
 
mysql> grant all privileges  on *.* to root@'%' identified by "password";
Query OK, 0 rows affected (0.00 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
mysql> select host,user,password from user;
+--------------+------+-------------------------------------------+
| host                    | user      | password                                                                 |
+--------------+------+-------------------------------------------+
| localhost              | root      | *A731AEBFB621E354CD41BAF207D884A609E81F5E     |
| 192.168.1.1            | root      | *A731AEBFB621E354CD41BAF207D884A609E81F5E     |
| %                       | root      | *A731AEBFB621E354CD41BAF207D884A609E81F5E     |
+--------------+------+-------------------------------------------+
3 rows in set (0.00 sec)

安装redis

因为 redis 默认配置只能够本地连接,不能进行远程访问,使用 Redis客户端工具连接都会报错,因此需要手动挂载 redis 配置文件。

# /home/docker/redis目录下新增挂载文件夹
mkdir {data,conf}
# 下载最新版本的Redis镜像
docker pull redis
# 新增redis配置文件
cd /home/docker/redis/conf
touch redis.conf
vim redis.conf

添加以下内容

#bind 127.0.0.1 
protected-mode no
appendonly yes 
requirepass 123456 

说明:

  • bind 127.0.0.1 ,注释掉这部分,这是限制redis只能本地访问
  • protected-mode:默认yes,开启保护模式,限制为本地访问
  • appendonly:redis持久化(可选)
  • requirepass:设置访问密码为123456

运行容器

docker run --name myredis -p 6379:6379 -v /home/docker/redis/data:/data -v /home/docker/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf 

命令解释:

  • --name:容器名称
  • -p :表示将服务器的6379(冒号前的6379)端口映射到docker的6379(冒号后的6379)端口
  • -d :表示以后台服务的形式运行redis
  • -v :挂载宿主机目录
  • redis redis-server /etc/redis/redis.conf:表示运行redis服务器程序,并且指定运行时的配置文件

经过以上步骤,便可以通过redis客户端工具进行连接,如果连接不上,检查安全组和服务器防火墙端口是否开放。

安装rabbitmq

# 拉取带图形化管理界面的镜像
docker pull rabbitmq:3.7.7-management
# 根据下载的镜像创建和启动容器
docker run -d --name rabbitmq3.7.7 -p 5672:5672 -p 15672:15672 -v /home/docker/rabbitmq:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost  -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.7.7-management

命令说明:

  • -d:后台运行容器;
  • --name:指定容器名;
  • -p:指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);
  • -v:映射目录或文件;
  • --hostname :主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);
  • -e:指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)

访问页面http://localhost:15672

image.png

至此,基本的运行环境都已搭建完毕,接下来就是打包前后端项目。

Vue前端项目打包

在打包前端项目的时候,我自己也遇到一些坑。首先因为我使用的vue-admin-template模版进行前端开发,在执行npm run build打包时出现异常,后面看了配置文件才发现需要改为npm run build:prod才能正常打包。此外还有一个问题,打包完成添加到SprringBoot项目启动运行,静态文件抛404,最后发现还需要对vue.config.js修改。

image.png

image.png

这样前端项目就打包好了,然后将dist下的所有文件目录拷贝到SpringBoot后端项目的resourse>static目录下,static目录需要新建。
image.png

如果你的项目中用到了shiro或者spring security等安全框架,需要对静态资源放行。
image.png

以上配置完成后,先在本地运行,再用maven进行打包。
image.png

将jar包上传到服务器后,就要开始制作自己的镜像了,首先在与jar包同目录下新建Dockerfile文件。

# 新建Dockerfile文件
touch Dockerfile
# 编写Dockerfile文件
vim Dockerfile

加入以下内容

# Docker image for springboot file run
# VERSION 0.0.1
# Author: jeremy
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER jeremy 
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD demo-01.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

执行docker build -t [镜像名称] .,至此镜像文件就制作完成了。docker images查看镜像是否存在。最后一步,创建并启动容器,docker run --name [容器名称] -d -p 80:8080 [镜像名]

image.png

你可能感兴趣的:(Docker部署SpringBoot+Vue前后端分离项目)