在一个容器中安装Mysql Redis Java Nginx

12 月是我们集团的信息宣传月,信息部门需要我们提供出一个测试的系统环境可以给中层领导访问做考试,且每个人的环境需要独立.之前我们系统是前后端分离的方案,数据库独立,前端一个容器,后端一个容器,还有一个 Reids 容器.但是考试方希望我们提供出一个镜像包含完整的内容.

需求

一个镜像包含应用的完成运行环境

步骤说明

  1. 创建一个包含全部中间件的镜像 allinone-middleware
  2. 进入容器进行初始化操作
  3. 基于容器创建镜像 allinone-init
  4. 基于最新镜像创建可以启动的镜像 allinone-run

物料准备

  • dockerfile
  • 程序 Jar 包
  • 程序 配置文件
  • 前端 文件
  • nginx 配置文件
  • 数据库初始文件
  • 启动脚本文件

文件目录

app.jar 程序 Jar 包
application.yaml 程序配置文件
dockerfile-middleware
dockerfile-init
dockerfile-run
init.sql   数据库初始文件
nginx.conf nginx 配置文件
public.tar 前端 文件
start.sh   启动脚本文件

start.sh

#!/bin/bash
service mysql start

nohup redis-server &

nginx

java -jar /app.jar --spring.config.location=/application.yaml

Do it

创建镜像 allinone-middleware

这里我们基于 ubuntu 来创建一个容器,然后再通过容器创建一个镜像.

FROM ubuntu:20.04

# 安装一切需要的内容
RUN apt-get update && apt-get install -y \
    wget \
    curl \
    gnupg \
    lsb-release \
    software-properties-common \
    openjdk-8-jdk \
    nginx \
    mysql-server \
    redis-server \
    vim

创建镜像应用镜像

docker build -t allinone-middleware .

创建镜像 allinone-init

FROM allinone-middleware:latest

COPY init.sql init.sql

打包镜像

docker build -t allinone-init -f docker-allinone-init .

启动镜像

docker run -it allinone-init:latest tail -f /dev/null

进入镜像

docker exec -it contariner-id bash
# 启动数据库
service mysql start
# 导入数据
mysql
CREATE DATABASE database;
mysql -u root database < init.sql
# 修改 mysql root 用户权限
ALTER USER 'root'@'%' IDENTIFIED WITH 'mysql_native_password' BY '123456';
FLUSH PRIVILEGES;
# 退出 mysql 操作台
exit
# 停机Mysql
service mysql stop
usermod -d /var/lib/mysql/ mysql

将容器打包成镜像

docker commit container-id docker-allinone-init

创建启动镜像

FROM docker-allinone-init:latest

COPY app.jar app.jar
COPY application.yaml application.yaml
COPY nginx.conf /etc/nginx/nginx.conf
COPY start.sh /start.sh
ADD public.tar /var/www/web/

ENTRYPOINT ["/start.sh"]
EXPOSE 8522

打包

docker build -t allinone-init -f docker-allinone-run .

启动镜像

docker run -it -p 8522:8522 allinone-run:latest

确认无误后导出镜像

导出镜像

docker save -o allinone.tar allinone-run:latest