# Docker 部署

Docker是一个开源的容器引擎,将应用程序和基础设施层隔离,将基础设施当作程序一样进行管理,可以更快地打包、测试以及部署应用程序,缩短从编写到部署运行代码的周期。

下面介绍Maven工程如何打包镜像并运行,运行需要先安装Docker

# 构建镜像

# Dockerfile

我们常用Dockerfile来定制构建镜像所需执行的指令,通过下载中心 (opens new window)下载的Fly Framework后端初始工程中,已默认添加了Dockerfile文件,该文件位于工程主目录。

Dockerfile

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • FROM:指定镜像源openjdk:8-jdk-alpine,后续基于该镜像进行构建
  • ARG:设置参数JAR_FILE,可以在后续指令中以${JAR_FILE}形式使用
  • COPY:复制文件到镜像中,第一个参数为源文件地址,后者为复制的目标文件地址
  • ENTRYPOINT:指定镜像的默认入口命令

Docker通过该文件执行设置好的指令操作流程,适用于简单的Java应用工程,可以根据需要调整。

# 构建

编写好Dockerfile文件后,构建镜像一般有两种方式。一是直接执行Docker命令构建:

docker build -t {repository}:{tag} .

-t参数指定打包的镜像名称,镜像名称分为repositorytag。注意最后还有一个.用来指定上下文。

另一种方式是借助Mavendockerfile-maven-plugin插件,该插件主要作用是在项目构建的时候生成基于项目的docker镜像文件,简化了工程打包后在手动执行命令的过程。

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>1.3.6</version>
    <executions>
    	<execution>
            <id>default</id>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <repository>${project.groupId}/${project.artifactId}</repository>
        <tag>${project.version}</tag>
        <buildArgs>
            <JAR_FILE>target/docker/${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
</plugin>

# 运行镜像

可以通过两种方式运行镜像,区别是针对的镜像数量和是否有启动顺序要求等。

# run

对于单个镜像启动,可以直接执行Dockerrun命令:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

设上一步构建出来的镜像为group/demo:v1,启动时将宿主机的8080端口映射到容器的8080端口,并取别名为test-demo

docker run -itd --name=test-demo -p 8080:8080 group/demo:v1

执行后,查看容器运行状态:docker ps -a

# docker-compose

当需要运行一系列镜像容器,且有启动顺序要求时,可以使用docker-compose文件配置,进行容器的参数设置、管理。

windows/mac平台上,docker-compose不用单独安装。不过在linux下,docker-compose可能需要单独进行安装,验证是否安装:docker-compose --version

新建一个docker-compose.yml(默认文件名)文件:

version: "3.7"
services:
  xxx: # 需要启动的容器服务
    ... # 为该容器配置的一系列参数
  xxx2: # 需要启动的第二个容器服务
    ... # 为该容器配置的一系列参数

docker-compose.yml的配置参数与docker run 命令的参数基本一致,存在个别不同,示例:

version: "3.7"
services:
  demo:
    image: group/demo:v1
    restart: always
    ports:
      - "8080:8080"
    container_name: test-demo
    depends_on:
      - db
  db:
    image: mysql
    restart: always
    ports:
      - "3307:3306"
    enviroment:
      - MYSQL_ROOT_PASSWORD=root
    container_name: test-db
    volumes:
      - e:/docker_files/test_mysql:/var/lib/mysql

示例中有两个服务,一个是demo,一个是db。由于demo配置了depends_ondemo会在db启动后再启动。

在文件所处目录下执行命令后台启动:

docker-compose up -d

执行后,查看容器运行状态:docker-compose ps -a

顶部