用Docker创建一个包含Spring Boot、CentOS、Apache和MySQL的环境

简要概括

docker-web-db.png

我正在使用Apache和Spring Boot应用程序之间的反向代理。
通常,人们更喜欢使用Alpine作为轻量级Linux来构建OpenJDK映像,但为了创建一个与公司测试环境接近的状态,我选择了这种配置。
除非有特殊理由,我认为最好使用openjdk:8-jdk-alpine,就像下面的文章所推荐的那样。
https://spring.io/guides/topicals/spring-boot-docker

文件结构

ルートディレクトリ
   ├── docker-compose.yml
   ├── web
   │   ├── Dockerfile
   │   └── startup.sh
   ├── db
   │   └── Dockerfile
   ├── apache
   │   └── httpd.conf
   ├── initdb
   │   └── initdb.sql
   └── spring-boot
       └── 以下Spring Bootアプリケーション

Docker-Compose docker-composer

因为我们要创建一个Web服务器容器和一个MySQL容器,所以我编写了以下docker-compose.yml文件。

version: "3"
services:
  web:
    build:
      context: ./web
    ports:
      - 5678:5678
    privileged: true
    tty: true
    links:
      - db
    volumes:
      - ./spring-boot/:/var/www/spring-boot/
      - ./apache/httpd.conf:/etc/httpd/conf/httpd.conf
    container_name: "centos-apache-jdk"
  db:
    build:
      context: ./db
    ports:
      - "13306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root
    container_name: "mysql5.7-jp"
    volumes:
      - ./initdb/:/docker-entrypoint-initdb.d

由于现在MySQL需要支持日语,因此我们准备了一个Dockerfile。

重点在于在启动db容器时可以插入初始数据。在MySQL官方镜像中,将.sql文件或.sh文件放置在/docker-entrypoint-initdb.d目录下,它会在初次启动时自动执行。

Dockerfile for web container

我以CentOS映像为基础,安装了Apache和OpenJDK。

FROM centos:7.6.1810

RUN yum -y update

# apacheをインストール
RUN yum -y install httpd

# openjdkのダウンロード
RUN curl -OL https://download.java.net/java/GA/jdk12/33/GPL/openjdk-12_linux-x64_bin.tar.gz
# 解凍
RUN tar zxf openjdk-12_linux-x64_bin.tar.gz -C /opt
# alternativesに登録
RUN alternatives --install /usr/bin/java java /opt/jdk-12/bin/java 1
RUN alternatives --install /usr/bin/jar jar /opt/jdk-12/bin/jar 1
RUN alternatives --install /usr/bin/javac javac /opt/jdk-12/bin/javac 1
# JAVA_HOME設定
ENV JAVA_HOME /opt/jdk-12

WORKDIR /var/www/spring-boot/

COPY startup.sh /startup.sh
RUN chmod 744 /startup.sh
# コンテナ作成時に起動スクリプト実行(ApacheとSpring Bootアプリケーション起動)
CMD ["/startup.sh"]

鉴于最新的OpenJDK12无法通过yum安装,我选择通过下载二进制文件的方式进行安装。如果没有特别要求,OpenJDK11可以通过yum安装,更为简单。

这里的要点是将Apache和Spring Boot应用程序的启动整合到一个启动脚本中。
原因是无论如何写多个CMD命令,只有最后一行会被执行。因此,为了使Apache和Spring Boot应用程序一直运行,必须使用CMD来执行,所以我将其整合到了一个Shell脚本中。详细信息可参考以下文章:
https://sleepless-se.net/2018/05/26/docker%E3%81%A7%E8%A4%87%E6%95%B0cmd%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

顺便提一下,启动脚本中包含以下内容。

#!/bin/bash

# Apacheの起動
/usr/sbin/httpd -D FOREGROUND

# Spring Bootアプリケーションの起動
./gradlew bootRun

Apache的配置文件

由于本篇文章重点讨论Docker,所以不会详细介绍,但会从默认配置开始讲解。

    1. 创建端口为9876的虚拟主机

将Listen指定为5678

将DocumentRoot和Directory指定为/var/www/spring-boot

我进行了更改。对于virtualhost 1,在conf文件的最底部添加了以下内容。

LoadModule rewrite_module modules/mod_rewrite.so

# Spring Boot application
<VirtualHost *:5678>
    ServerName localhost
    ProxyPass / http://127.0.0.1:9876/
    ProxyPassReverse / http://127.0.0.1:9876/
</VirtualHost>

DB容器的Dockerfile

鑑於 MySQL 公式映像容器無論進入其中還是進行初始資料投入都無法輸入日文且會產生亂碼,因此我們創建了以下的 Dockerfile 以支援日文。

# Dockerfile_MySQL
FROM mysql:5.7

# Set debian default locale to ja_JP.UTF-8
RUN apt-get update && \
    apt-get install -y locales && \
    rm -rf /var/lib/apt/lists/* && \
    echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
    locale-gen ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8

# Set MySQL character
RUN { \
    echo '[mysqld]'; \
    echo 'character-set-server=utf8mb4'; \
    echo 'collation-server=utf8mb4_general_ci'; \
    echo '[client]'; \
    echo 'default-character-set=utf8mb4'; \
} > /etc/mysql/conf.d/charset.cnf

这篇文章基本上是以下伟大文章的翻版。请点击此链接查看原文:https://qiita.com/muff1225/items/48e0753e7b745ec3ecbd

最后

只需使用这个容器启动,就可以构建所需的环境。

docker-compose build
docker-compose up

由于在web容器中做了太多的事情,这可能不是正常使用docker的方式。但是,当需要与测试环境相匹配或满足其他要求时,您可以尝试使用这种配置。

bannerAds