1、摘要
我们常常需要在虚机中使用docker部署我们的服务,中间涉及到docker安装、jar包的准备、镜像的生成、使用docker-compose启动服务等过程,所以特地写篇博客记录下这些步骤。
先上一张代码结构图和一张虚机上的目录结构图:
首先是代码结构。我喜欢把Dockerfile文件和docker-compose文件在代码里也放一份,一来是备份,怕虚机上的丢了;二来通过流水线构建镜像的话需要在代码里有Dockerfile和deploy文件。
其次是虚机上各个文件的作用。api-back.jar不用多说,服务的jar包;
config目录里放的是配置文件,docker-compose文件里会写明把这个目录整个挂载到镜像里,Dockerfile文件会在启动命令里指定使用这个目录里的配置文件,从而把配置文件挂载出来,方便修改。
docker-compose.yml文件里指定了构建镜像和启动服务的一些配置,用来构建镜像、启动/停止服务。
Dockerfile-api-back文件用于构建镜像。
start.sh用于一键更新服务。
接下来详细介绍各个步骤以及涉及到的文件。
2、安装docker和docker-compose
在虚机上安装docker和docker-compose,详细操作可见(TODO)。
3、生成jar包或dist包
这一步比较简单,后端执行maven clean install就行,不过我喜欢在pom文件中指定jar包生成的位置,把所有微服务的jar包都统一生成到根目录的target下。关于pom文件中maven插件的作用可以看我另一篇博客。
前端生成dist包一般就是控制台执行npm run build,我不是专业的就不展开说了。
生成之后把jar包或dist包上传到虚机上,比如这里我统一上传到了/api-back目录下。
2、编写Dockerfile文件
#指定基础镜像
FROM moxm/java:1.8-full
#添加jar包到镜像,注意jar包的位置需要和下面启动命令里jar包的位置一样,不然启动的时候就找不着jar包了
ADD ./api-back.jar /opt/api-back.jar
#设置服务时区
ENV TZ=Asia/Shanghai
# 设置容器端口
EXPOSE 7700
# 设置启动命令,在启动命令里指定了配置文件的位置,后续可以在docker-compose里把这个目录挂载出来,方便修改配置文件,这样就不用改个配置还得改代码并重新打包。
CMD java -Dspring.config.location=/opt/config/ -jar /opt/api-back.jar
关于Dockerfile文件的详细介绍可以看这(TODO)
3、编写docker-compose文件
version: "3.7"
services:
api-back:
build:
context: ./
dockerfile: ./Dockerfile-api-back
image: api-back:v1.0
container_name: api-back
restart: always
privileged: true
ports:
- 7700:7700
volumes:
- ./config:/opt/config
environment:
- TZ=Asia/Shanghai
- JAVA_OPTS=-server -Xmx512m -Xms512m -Djava.awt.headless=true
有了docker-compose文件后,就可以在docker-compose文件所在目录下执行以下命令:
构建镜像:docker-compose build
停止服务:docker-compose down
启动服务:docker-compose up -d
docker-compose build构建的镜像名和tag是由docker-compose文件中的image指定的,比如上面的docker-compose文件构建出来的镜像就是api-back:v1.0。如果想要构建其他tag的镜像,记得改image中的tag哦。
关于docker-compose的详细介绍可见(TODO)。
4、编写start.sh文件
#构建镜像
docker-compose build
#重启服务
docker-compose down
docker-compose up -d
可以把步骤3中的几个命令放到一个.sh文件中;后续想更新服务就只需要上传最新的jar包,然后执行sh start.sh,就可以自动构建并更新服务了。
不过需要注意的是,一直使用同一个tag构建镜像,会导致新的镜像挤占掉旧镜像的tag,从而使旧镜像成为空悬镜像,像这样:
大量的无意义的空悬镜像会占用磁盘空间,需要定期清理,可以执行以下命令清理空悬镜像:docker image prune