#需求
目前有 初始化数据库文件oasys.sql,还有springboot的jar文件。oasys.jar中默认指向的数据库是127.0.0.1, 3306,用户名和密码都是root,版本为5.7及以下。需要运行的java版本是java1.8

oasys.jar启动默认的端口是8088.默认用户名是soli/123456

所需要的文件见本文附件。

考虑使用已有的Mysql5.7镜像

初始化目录

先安装好docker-ce
然后mkdir -p ~/docker/oasys
cd ~/docker/oasys
把附件中的二个文件复制到目录,如下

[root@master1 oasys]# tree -L 2
.
├── docker-compose.yml
├── Dockerfile
├── oasys.jar
├── oasys.sql
├── rebuild
└── supervisord.conf

0 directories, 6 files

选择supervior插件运行2个程序

docker默认一个docker只能运行一个进程,因此在目前的镜像中,要运行Mysqld和java二个程序需要考虑使用supervisor插件,而且需要配置supervisor.conf的配置文件。

由于默认的数据库用户名和密码都是root,因此使用ENV MYSQL_ROOT_PASSWORD=root执行,改镜像会按照此密码进行设置数据库。

默认情况下,该镜像会默认运行/docker-entrypoint_initdb.d目录下的所有sql文件,因此这这里增加初始化文件。

最后运行java -jar oasys.jar,
dockerfile如下

from mysql:5.7
ENV MYSQL_ROOT_PASSWORD root
RUN yum -y  install java java-devel supervisor
WORKDIR /docker-entrypoint-initdb.d
# 设置工作目录
WORKDIR /docker-entrypoint-initdb.d

# 设置语言环境
ENV LANG=C.UTF-8

# 添加 SQL 初始化脚本
ADD oasys.sql .

# 复制 Java 应用程序
COPY oasys.jar .

# 复制 supervisor 配置文件
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf


# 暴露端口
EXPOSE 8088
EXPOSE 3306

# 启动 supervisor
CMD [ "/usr/bin/supervisord", "-c" ,"/etc/supervisor/conf.d/supervisord.conf"]

给出supervisor.conf文件

[supervisord]
nodaemon=true


[program:mysql]
command=docker-entrypoint.sh mysqld
autostart=true
autorestart=true

[program:javaapp]
command=java -jar /docker-entrypoint-initdb.d/oasys.jar 2>/var/log/oasys.log >&2 &
autostart=true
autorestart=true

重新设置docker镜像

因为目前国外的镜像很多不能下载,需要使用代理,目前利用学校的自己准备好的镜像库进行配置.

注意: https://docker-push.ycjy.info
是用来提交镜像的,实际是反向代理到127.0.0.1:8083 http端口默认的用户名是yanfeng,密码是 1qaz!QAZ

https://nexus.ycjy.info 是用来获取公司内部镜像的,实际是反向代理到127.0.0.1:8082 http端口

因为docker-ce已经不支持http pull and push了,因此这2个方面都使用nginx做了https的反向代理。

cat >/etc/docker/daemon.json <<EOF
{
"registry-mirrors" : [
      "https://noohub.ru",
      "https://huecker.io",
      "https://dockerhub.timeweb.cloud" ,
      "https://docker.m.daocloud.io",
      "https://nexus.ycjy.info"
  ],
  "insecure-registries" : [
    "https://nexus.ycjy.info",
    "http://nexus.ycjy.info:8082",
    "https://docker-push.ycjy.info" 
  ],
  "dns" : [ "192.168.10.1" , "8.8.8.8" ]
}
EOF

执行

docker build -t docker-push.ycjy.info/oasys:1.0 .
# 其中-t是打标签,标签的名称和你将来要提交的服务器的名称是要一样的。
# 如果忘记打标签,可以重新打标签
docker tag 0eafe2323aefa docker-push.ycjy.info/oasys:latest

打包过程是实际上会遇到很多的错误,都是在不停尝试当中成功的。

提交编译

先登陆

docker login docker-push.ycjy.info
yanfeng
1qaz!QAZ

然后提交
docker push docker-push.ycjy.info/oasys:1.0

测试

临时启动,并注意关闭防火墙或者放行8088

docker run --rm -p 8088:8088 nexus.ycjy.info/oasys:1.0

考虑使用docker-compose

用这个就更加简单了
看下面的docker-compose.yml

version: '3.8'

services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./oasys.sql:/docker-entrypoint-initdb.d/oasys.sql
    ports:
      - "3306:3306"

  javaapp:
    image: openjdk:8-jdk
    volumes:
      - ./oasys.jar:/app/oasys.jar
    working_dir: /app
    command: ["java", "-jar", "oasys.jar"]
    ports:
      - "8088:8088"
    depends_on:
      - mysql

直接运行
docker-compose up -d

不成功,因为oasys.jar写死了localhost,不同的网络不能成为Localhost,除非使用解压oasys.jar重新打包

jar xf oasys.jar
jar cf oasys.jar ….

version: '3.0'

services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
#      MYSQL_ROOT_HOST: localhost
    volumes:
      - ./oasys.sql:/docker-entrypoint-initdb.d/oasys.sql
    ports:
      - "3306:3306"
      - "8088:8088"

  javaapp:
    image: openjdk:8-jdk
    volumes:
      - ./oasys.jar:/app/oasys.jar
    working_dir: /app
#@    command: ["java", "-jar", "oasys.jar"]
    command: ["sh", "-c", "sleep 60 && java -jar oasys.jar"]  # 等待60秒后启动
    depends_on:
       - mysql
    network_mode: "service:mysql"  # 共享mysql容器的网络

需要等到60秒数据库启动完成。

附件
作者:严锋  创建时间:2024-07-22 21:10
最后编辑:严锋  更新时间:2025-05-09 15:48