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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐