在一个容器中安装Mysql Redis Java Nginx
12 月是我们集团的信息宣传月,信息部门需要我们提供出一个测试的系统环境可以给中层领导访问做考试,且每个人的环境需要独立.之前我们系统是前后端分离的方案,数据库独立,前端一个容器,后端一个容器,还有一个 Reids 容器.但是考试方希望我们提供出一个镜像包含完整的内容.
需求
一个镜像包含应用的完成运行环境
步骤说明
- 创建一个包含全部中间件的镜像
allinone-middleware
- 进入容器进行初始化操作
- 基于容器创建镜像
allinone-init
- 基于最新镜像创建可以启动的镜像
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
评论