# 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参数指定打包的镜像名称,镜像名称分为repository和tag。注意最后还有一个.用来指定上下文。
另一种方式是借助Maven的dockerfile-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
对于单个镜像启动,可以直接执行Docker的run命令:
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_on,demo会在db启动后再启动。
在文件所处目录下执行命令后台启动:
docker-compose up -d
执行后,查看容器运行状态:docker-compose ps -a