首先我这里讲解一个Java程序在docker上面运行部署的例子
首先介绍一下这是一个需要jdk和MySQL的项目,然后我们就需要在docker-compose上面写两个services
然后mysql挂载在宿主机下面,首先我先介绍一个docker-compose文件:(先不要复制,有坑!后面说)
version: "3"
services:
mysql:
image: mysql
container_name: mysql
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- 3306:3306
volumes:
# 数据挂载
- /home/exam/mysql/data/:/var/lib/mysql/
# 配置挂载
- /home/exam/mysql/conf/:/etc/mysql/conf.d/
# 初始化目录挂载
- /home/exam/mysql/init/:/docker-entrypoint-initdb.d/
mycity:
# 指定容器名称
container_name: mycity
# 重启机制
restart: always
image: java:8
volumes:
# 本地jar包路径:容器内路径
- /home/exam/mycity.jar:/mycity.jar
# 挂载日志 -v A:B ,A指宿主机位置,B指容器位置
- ./logs:/logs
# 指定容器时间为宿主机时间
- /etc/localtime:/etc/localtime
# 访问端口
ports:
- "8088:8088"
environment:
# 指定时区
- TZ="Asia/Shanghai"
#启动容器后执行的命令
entrypoint: java -server -Xms256m -Xmx256m -jar -Dserver.port=8088 -Dspring.profiles.active=local mycity.jar
我们首先分析一下这个文件,第一个是一个mysql服务:
我们其实重点就是最后的挂载,我们将容器内的 # 初始化目录挂载 - /home/exam/mysql/init/:/docker-entrypoint-initdb.d/ 这个的作用就是可以初始化sql脚本:
第二个服务就是我们的jar包了:起了个名字叫mycity,然后其他的类同
接下来说一下关于jar包本身:首先是打包的时候要这样写:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.ftz.Demo.controller.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
这里我们需要这样打包就可以将项目资源打包进去并且需要指定Main方法
然后说一下关于路径的问题,比如我们程序中有一个需要加载data.txt这样的语句,我们要想打成jar包在linux上运行成功就需要这样写:
之前的绝对路径写法就是错误的
然后就是数据库连接问题,由于我们是直接跑在docker容器内部的,所以我们需要在数据库加载文件中这样写:
这里的host直接写成docker中容器跑mysql服务的名称就可以连接上了
上面的步骤完成,还差一个就是,倘若你的java程序有用户交互的界面你就会发现按照上面那样写是不可以识别到Scanner的!因为docker不支持写命令行!
所以我们的dockers-compose文件就需要变一下,保持mysql不变,上面的java去掉最后一句自动执行改成让他不要挂掉的:
tty: true
stdin_open: true
整体文件:
version: "3"
services:
mysql:
image: mysql
container_name: mysql
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- 3306:3306
volumes:
# 数据挂载
- /home/exam/mysql/data/:/var/lib/mysql/
# 配置挂载
- /home/exam/mysql/conf/:/etc/mysql/conf.d/
# 初始化目录挂载
- /home/exam/mysql/init/:/docker-entrypoint-initdb.d/
mycity:
# 指定容器名称
container_name: mycity
# 重启机制
restart: always
image: java:8
volumes:
# 本地jar包路径
- /home/exam/mycity.jar:/mycity.jar
# 挂载日志 -v A:B ,A指宿主机位置,B指容器位置
- ./logs:/logs
# 指定容器时间为宿主机时间
- /etc/localtime:/etc/localtime
# 访问端口
ports:
- "8088:8088"
environment:
# 指定时区
- TZ="Asia/Shanghai"
#启动容器后执行的命令
tty: true
stdin_open: true
然后你在docker启动服务以后,新开一个界面!然后用docker exec -it 容器名 /bin/bash进入内部去适用java -jar xxx.jar去运行这样服务就可以实现了!
|