docker快速部署java+nginx+mysql运行环境

docker快速部署java+nginx+mysql运行环境

我们在工作中会经常遇到快速部署项目的需求,如果采用纯手动搭建将会是一件非常麻烦的事情,尤其是在Linux服务器上,它牵扯到基础环境安装及配置等繁琐的步骤。
本文将介绍一种docker部署方式,将使这项工作变得非常方便快捷。

1 构建java运行容器

首先 springboot 依赖 java 环境,我们需要找一个 java8 的基础镜像来进行改造
经不断的寻找和测试,fiadlie/java8-jre符合要求
经过改造后的 dockerfile 如下:

# 1. 从java8-jre镜像来构建新镜像
FROM fiadliel/java8-jre
MAINTAINER chrischen "[email protected]"
  
# 2. 设置项目路径,也就是SpringBoot Jar包路径
ENV DOCKER_PORJECT_PATH /project

# 3. 修改jvm配置,解决Linux下服务启动慢问题
ADD java.security /usr/lib/jvm/default-jvm/jre/lib/security/java.security

WORKDIR $DOCKER_PORJECT_PATH

# 4. 对外开放8001端口
EXPOSE 8001

# 5. 校正容器时区问题,改为中国时间
RUN apk add -U tzdata
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone

# 6. 这里将默认启动 /project 目录下的第一个jar包,用于外部挂载目录,确保该目录下只有一个jar文件
ENTRYPOINT java -jar $DOCKER_PORJECT_PATH/$(ls | grep .jar -m 1) --server.port=8001 --spring.profiles.active=prod

java.security 文件改动如下

securerandom.source=file:/dev/./urandom

将文件保存为如下目录

docker_base
├── Dockerfile
└── java.security

执行镜像构建命令

cd docker_base
sudo docker build -t java/springboot:1.0 .

将打包好的jar包和yml文件放入挂载目录下,然后启动容器

sudo docker run --name my_service -v /my_project:/project -p 8001:8001 -d java/springboot:1.0

通过docker日志检查服务启动状态

sudo docker logs my_service -f

2 构建MySQL容器

直接使用dockerhub mysql官方镜像即可轻松构建
创建空的挂载路径例如 mkdir /mysql_path

sudo docker run --name mysql57 \ 
  -v /mysql_path:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=root \
  -d -p 3306:3306 \
  mysql:5.7.26

注意 -e MYSQL_ROOT_PASSWORD=root 设置 root 密码为 root

3 构建Nginx容器

直接使用dockerhub nginx官方镜像即可轻松构建

docker run --name nginx \
  -v /my_nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /my_nginx/html:/etc/nginx/html -d -p 8080:8080 \
  nginx:1.17.0

可以打开浏览器进行验证,http://server_ip:8080

4 docker compose容器整合

上述步骤讲述了SpringBoot、MySQL、Nginx容器独立运行的方式,接下来将进行整合,目标是实现3个容器整体打包启动,并内部组网

首先我们规划一下工程目录结构

my_project                      # 项目部署根目录
├── docker-compose              # docker-compose目录
│   └── docker-compose.yml      # docker-compose.yml配置文件
├── mysql                       # mysql数据保存目录
├── nginx                       # nginx前端程序运行目录
│   ├── dist                    # 前端dist打包文件目录
│   └── nginx.conf              # nginx配置文件
└── service                     # 后端服务目录
    ├── application-prod.yml    # springboot配置文件
    └── my_service.jar          # springboot打包jar文件

docker-compose.yml 配置

version: "3"

  services:
    nginx:
      image: nginx:1.17.0
      ports:
        - "8080:8080"
      volumes:
        - "/my_project/nginx/dist:/etc/nginx/html"
        - "/my_project/nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
      links:
        - springboot
  
    springboot:
      image: java/springboot:1.0
      ports:
        - "8001:8001"
      volumes:
        - "/my_project/service:/project"
      links:
        - mysql57
    
    mysql57:
      image: mysql:5.7.26
      ports:
        - "3306:3306"
      volumes:
        - "/my_project/mysql:/var/lib/mysql"
      environment:
        MYSQL_ROOT_PASSWORD: root

可以看出,其实是将前3步配置进行了整合,然后增加links,让3个容器内部组网

services下描述的内容全部都是各个容器的构建和启动方式

nginxspringbootmysql57,分别是3个容器的别名

links中直接填写别名,让容器自动建立网络通信,那么在对应的配置文件的网络部分也要做相应的调整

application-prod.yml 中连接数据库字符串,我们将

jdbc:log4jdbc:mysql://127.0.0.1/dbname

改为 links 中的别名,也就是 mysql57

jdbc:log4jdbc:mysql://mysql57/dbname

nginx.conf 中的转发地址也要调整为对应容器的网络别名

location /api/ {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://127.0.0.1:8001;
    proxy_redirect off;
    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 /api/ {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://springboot:8001;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

这样容器启动时会根据内部网络地址自动组网联通,如果单独部署就会遇到serverip变化导致请求失败问题

最后,启动整合容器

cd /my_project/docker-compose
docker-compose up -d

也可以指定配置文件路径执行

docker-compose -f "/my_project/docker-compose/docker-compose.yml" up -d

停止容器

cd /my_project/docker-compose
docker-compose down

5 总结

我们日常工作中经常会遇到项目部署需求,使用docker部署是一种非常高效便捷的方式,由于其特殊的隔离机制,它不会原系统产生影响

需要注意的点在于

  1. java8在Linux下启动时需要修改随机数生成方式,不然会导致启动慢问题
  2. 注意容器内部的时区问题,容器时区往往默认为0,我们要改为 +8Asia/Shanghai
  3. 利用 Links 自动组网机制,解决繁琐的IP配置问题

服务器环境的部署需提前规划好工程目录,并做好对应记录,在后续更新维护时方便查阅

你可能感兴趣的:(docker,java,nginx)