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来使用加速器。将自己的加速器地址复制过来替换,执行以下命令即可。
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
注意:
- 查看生成的mysql容器的时候,端口映射会出现一个33060的端口,这是MySQL的MySQL Shell操作所需要的X协议端口,属于必备端口。详见:https://dev.mysql.com/doc/mysql-port-reference/en/mysql-ports-reference-tables.html#mysql-client-server-ports
- 不要映射 /etc/mysql 配置文件目录,会把镜像默认的配置文件夹替换为空文件夹。
5.检查容器是否正常运行
# 可以看到容器ID,容器的源镜像,启动命令,创建时间,状态,端口映射信息,容器名字
docker ps
6.进入容器
docker exec -it mysql /bin/bash
# 本地连接mysql客户端
mysql -u root -p12345
7.如果你的容器运行正常,但是无法访问到MySQL,一般有以下几个可能的原因
- 防火墙阻拦
# 开放端口:
$ systemctl status firewalld
$ firewall-cmd --zone=public --add-port=3306/tcp -permanent
$ firewall-cmd --reload
# 关闭防火墙:
$ sudo systemctl stop firewalld
- 未开启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
至此,基本的运行环境都已搭建完毕,接下来就是打包前后端项目。
Vue前端项目打包
在打包前端项目的时候,我自己也遇到一些坑。首先因为我使用的vue-admin-template
模版进行前端开发,在执行npm run build
打包时出现异常,后面看了配置文件才发现需要改为npm run build:prod
才能正常打包。此外还有一个问题,打包完成添加到SprringBoot项目启动运行,静态文件抛404,最后发现还需要对vue.config.js
修改。
这样前端项目就打包好了,然后将dist下的所有文件目录拷贝到SpringBoot后端项目的
resourse>static
目录下,static目录需要新建。
如果你的项目中用到了shiro或者spring security等安全框架,需要对静态资源放行。
以上配置完成后,先在本地运行,再用maven进行打包。
将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 [镜像名]
。