盒子
盒子
文章目录
  1. 0.前言
  2. 1.为什么选择Docker
  3. 2.安装Docker并拉取有关镜像
    1. 2.1.从Ubuntu存储库安装Docker
  4. 3.编写docker-compose配置文件
    1. 3.1.MySQL环境配置
    2. 3.2.Nginx环境配置
    3. 3.3.Tomcat环境配置
  5. 4.结语

Docker-compose一键部署前后端分离项目核心Nginx+Tomcat+MySQL

0.前言

  近来感觉毕设做的东西太无聊,总是在没事的时候给自己找乐子。听说以前实验室的项目一般都是部署在Windows平台,但听我哥说公司一般都是部署在Linux上,所以我的计划也是部署在Linux上,最好是用Docker这种 Linux 容器解决方案,从而避免在不同设备上部署时环境差异带来的问题,感受一把丝般顺滑地部署体验。

1.为什么选择Docker

  Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
  Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
  Docker 的主要用途,目前有三大类:

  • 提供一次性的环境比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
  • 提供弹性的云服务因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
  • 组建微服务架构通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

2.安装Docker并拉取有关镜像

  这里以Ubuntu 18.04为例。

2.1.从Ubuntu存储库安装Docker

  如果您想从Ubuntu存储库安装docker版本,则可以运行下面的apt命令。

1
sudo apt install docker.io

  等到安装完成后,您可以启动Docker并使用systemctl命令将其添加到引导时间:

1
2
systemctl start docker
systemctl enable docker

  您可能还想检查Docker版本:

1
2
3
docker --version
# 执行得到如下结果
Docker version 18.09.2, build 6247962

  这表明Docker已成功安装。然后我们需要拉取所需的镜像,这里我写成了一个shell脚本:

1
2
3
4
5
docker pull mysql:5.5.60
docker pull nginx:1.13
docker pull tomcat:8-jre8

  通过docker image ls命令,我们可以看到如下的信息,说明镜像拉取成功:

1
2
3
4
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 8-jre8 dd6ff929584a 3 weeks ago 463MB
mysql 5.5.60 2cd7ceff3e53 8 months ago 205MB
nginx 1.13 ae513a47849c 11 months ago 109MB

3.编写docker-compose配置文件

  我们首先需要安装Docker-Compose工具。Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
  Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。

1
2
3
sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

  这里我先列出docker-compose.yml文件的内容,注意这个文件名必须是docker-compose.yml不可更改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
version: "3"
services:
mysql:
container_name: mysql
image: mysql:5.5.60
restart: always
volumes:
- ./data/mysql:/var/lib/mysql
- ./config/mysql/mysqld.conf:/etc/mysql/mysql.conf.d/mysqld.conf
ports:
- 6603:3306
environment:
- MYSQL_ROOT_PASSWORD=admintest
tomcat:
container_name: tomcat
restart: always
image: tomcat:8-jre8
ports:
- 127.0.0.1:8080:8080
volumes:
- ./data/tomcat/test.war:/usr/local/tomcat/webapps/test.war
- ./logs:/usr/local/tomcat/logs
links:
- mysql:m1
environment:
- DATABASE_HOST=mysql
- DATABASE_USER=root
- DATABASE_PASSWORD=admintest
- DATABASE_NAME=testdb
- DATABASE_PORT=3306
nginx:
container_name: nginx
restart: always
image: nginx:1.13
ports:
- 80:80
- 443:443
volumes:
- ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./logs:/var/log/nginx
- ./data/nginx:/usr/share/nginx/html
links:
- tomcat:t1

  可以看到,我们一共设置了三个service,分别是mysql, nginx, tomcat,其中,需要注意的地方是它们的volumes以及links,其他的地方应该很容易理解。
  另外,这里给出目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---┐
├-config--┐
│ ├-mysql---mysqld.conf
│ │
│ ├-nginx---nginx.conf
│ │
│ └-tomcat--server.xml
├-data----┐
│ ├-mysql---(MySQL自动生成,是数据库数据的相关文件)
│ │
│ ├-nginx---(前端文件)
│ │
│ └-tomcat--(后端war包)
├-logs----略(这里是Docker启动时自动生成的)
└-docker-compose.yml

3.1.MySQL环境配置

  首先,最简单的是MySQL,它没有设置links,因为是其他容器连接它。但是MySQL的volumes却是最为重要的,如果我们在这里不设置volumes的话,每次运行所产生的数据将无法保留。所以MySQL的volumes,就设置了两点:

  • 指定MySQL产生的data文件需要同步到宿主机的./data/mysql目录下
  • 指定MySQL的配置文件从宿主机的./config/mysql/mysqld.conf读取

3.2.Nginx环境配置

  其次是Nginx,它有volumes,也有links,这里的volumes参照MySQL的来理解。重点是links,Nginx的links建立了与Tomcat容器的连接,Nginx负责监听80端口,Tomcat负责监听本地的8080端口,Nginx接收到需要由Tomcat来处理的请求,就将请求转发到8080端口。我们必须先定义一个links,这里的值为Tomcat容器的名字,t1是这个容器的别名,可以理解为ip或者自定义的域名。那么,将Nginx的配置文件修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
upstream api_domain {
server t1:8080;
}
server {
root /usr/share/nginx/html;
location ^~ /test/ {
proxy_pass http://api_domain/test/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
try_files $uri $uri/ @router;
index index.html index.htm;
}
location @router {
rewrite ^.*$ /index.html last;
}
}
}

  其实主要是在http属性下添加了upstreamserver属性,其中upstream里的server t1:8080;就是指的Tomcat容器的8080端口;server则是相应的转发规则,我在Nginx反向代理Apache,并解决Laravel在反向代理情况下的HTTPS加密问题一文中有较为详细的描述,这里就不做详细的说明了。而使用例如Vue.js构建的前端文件,可以直接放在本机的./data/nginx中,映射到容器的/usr/share/nginx/html下。

3.3.Tomcat环境配置

  最后是Tomcat,Spring项目打包构建出war包,然后将例如名为test的war包发布上去,只需要定义几个volumes的值便可以了。

1
2
3
volumes:
- ./data/tomcat/test.war:/usr/local/tomcat/webapps/test.war
- ./logs:/usr/local/tomcat/logs

  另外,我这里额外定义了多个环境变量,自然是有用处的。

1
2
3
4
5
6
environment:
- DATABASE_HOST=mysql
- DATABASE_USER=root
- DATABASE_PASSWORD=admintest
- DATABASE_NAME=testdb
- DATABASE_PORT=3306

  这里分别定义了数据库主机名、用户、密码、数据库名、端口,用处在于构建war包之前,我们需要将Spring项目里配置的MySQL相关变量更改为如下格式:

1
2
3
4
5
############# Docker部署MySQL的配置 #############
url=jdbc:mysql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
#username=${DATABASE_USER}
#password=${DATABASE_PASSWORD}
driverClassName=com.mysql.jdbc.Driver

  这样配置完成后,在启动Tomcat容器时,就不会报无法连接数据库的错误了。这时,Spring项目就可以单纯的作为后端,提供API服务了,也不存在跨域问题。

4.结语

  Docker真的是个好东西,宿主机可以保持如此干净,防止了不可预知的主机软件之前的冲突,也方便在其他设备上进行部署,超快的启动速度,较少的资源消耗,绝对是Linux上部署项目的不二选择,个人真的是超级喜欢。这只是刚刚接触,需要学习的Docker知识还有很多很多。

参考贴来源:
docker-compose一键部署Nginx+Tomcat+Mysql+solo2.7.0 作者:我敬你是条汉子
服务器从零开始(2D)-Docker+Tomcat+Nginx+MySQL 作者:KerryWu
spring-boot-mybatis-docker整合使用 作者:Tomoya Deng

转载说明

转载请注明出处,无偿提供。

支持一下
感谢大佬们的支持