首先我这里讲解一个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去运行这样服务就可以实现了!