java程序怎样在docker上面运行

x33g5p2x  于2022-02-11 转载在 Java  
字(3.3k)|赞(0)|评价(0)|浏览(418)

首先我这里讲解一个Java程序在docker上面运行部署的例子

首先介绍一下这是一个需要jdk和MySQL的项目,然后我们就需要在docker-compose上面写两个services

然后mysql挂载在宿主机下面,首先我先介绍一个docker-compose文件:(先不要复制,有坑!后面说)

  1. version: "3"
  2. services:
  3. mysql:
  4. image: mysql
  5. container_name: mysql
  6. command:
  7. --default-authentication-plugin=mysql_native_password
  8. --character-set-server=utf8mb4
  9. --collation-server=utf8mb4_general_ci
  10. restart: always
  11. environment:
  12. MYSQL_ROOT_PASSWORD: root
  13. ports:
  14. - 3306:3306
  15. volumes:
  16. # 数据挂载
  17. - /home/exam/mysql/data/:/var/lib/mysql/
  18. # 配置挂载
  19. - /home/exam/mysql/conf/:/etc/mysql/conf.d/
  20. # 初始化目录挂载
  21. - /home/exam/mysql/init/:/docker-entrypoint-initdb.d/
  22. mycity:
  23. # 指定容器名称
  24. container_name: mycity
  25. # 重启机制
  26. restart: always
  27. image: java:8
  28. volumes:
  29. # 本地jar包路径:容器内路径
  30. - /home/exam/mycity.jar:/mycity.jar
  31. # 挂载日志 -v A:B ,A指宿主机位置,B指容器位置
  32. - ./logs:/logs
  33. # 指定容器时间为宿主机时间
  34. - /etc/localtime:/etc/localtime
  35. # 访问端口
  36. ports:
  37. - "8088:8088"
  38. environment:
  39. # 指定时区
  40. - TZ="Asia/Shanghai"
  41. #启动容器后执行的命令
  42. 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包本身:首先是打包的时候要这样写:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-compiler-plugin</artifactId>
  6. <configuration>
  7. <source>8</source>
  8. <target>8</target>
  9. </configuration>
  10. </plugin>
  11. <plugin>
  12. <groupId>org.apache.maven.plugins</groupId>
  13. <artifactId>maven-shade-plugin</artifactId>
  14. <version>2.3</version>
  15. <executions>
  16. <execution>
  17. <phase>package</phase>
  18. <goals>
  19. <goal>shade</goal>
  20. </goals>
  21. <configuration>
  22. <transformers>
  23. <transformer
  24. implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  25. <mainClass>com.ftz.Demo.controller.Main</mainClass>
  26. </transformer>
  27. </transformers>
  28. </configuration>
  29. </execution>
  30. </executions>
  31. </plugin>
  32. </plugins>
  33. </build>

这里我们需要这样打包就可以将项目资源打包进去并且需要指定Main方法

然后说一下关于路径的问题,比如我们程序中有一个需要加载data.txt这样的语句,我们要想打成jar包在linux上运行成功就需要这样写:

之前的绝对路径写法就是错误的

然后就是数据库连接问题,由于我们是直接跑在docker容器内部的,所以我们需要在数据库加载文件中这样写:

这里的host直接写成docker中容器跑mysql服务的名称就可以连接上了

上面的步骤完成,还差一个就是,倘若你的java程序有用户交互的界面你就会发现按照上面那样写是不可以识别到Scanner的!因为docker不支持写命令行!

所以我们的dockers-compose文件就需要变一下,保持mysql不变,上面的java去掉最后一句自动执行改成让他不要挂掉的:

  1. tty: true
  2. stdin_open: true

整体文件:

  1. version: "3"
  2. services:
  3. mysql:
  4. image: mysql
  5. container_name: mysql
  6. command:
  7. --default-authentication-plugin=mysql_native_password
  8. --character-set-server=utf8mb4
  9. --collation-server=utf8mb4_general_ci
  10. restart: always
  11. environment:
  12. MYSQL_ROOT_PASSWORD: root
  13. ports:
  14. - 3306:3306
  15. volumes:
  16. # 数据挂载
  17. - /home/exam/mysql/data/:/var/lib/mysql/
  18. # 配置挂载
  19. - /home/exam/mysql/conf/:/etc/mysql/conf.d/
  20. # 初始化目录挂载
  21. - /home/exam/mysql/init/:/docker-entrypoint-initdb.d/
  22. mycity:
  23. # 指定容器名称
  24. container_name: mycity
  25. # 重启机制
  26. restart: always
  27. image: java:8
  28. volumes:
  29. # 本地jar包路径
  30. - /home/exam/mycity.jar:/mycity.jar
  31. # 挂载日志 -v A:B ,A指宿主机位置,B指容器位置
  32. - ./logs:/logs
  33. # 指定容器时间为宿主机时间
  34. - /etc/localtime:/etc/localtime
  35. # 访问端口
  36. ports:
  37. - "8088:8088"
  38. environment:
  39. # 指定时区
  40. - TZ="Asia/Shanghai"
  41. #启动容器后执行的命令
  42. tty: true
  43. stdin_open: true

然后你在docker启动服务以后,新开一个界面!然后用docker exec -it 容器名 /bin/bash进入内部去适用java -jar xxx.jar去运行这样服务就可以实现了!

相关文章

最新文章

更多

目录