使用Docker制作Springboot镜像并部署

概要

以前我们部署一个项目,总要先预装各种环境,比如说你的项目使用的是Java语言,你需要先安装JDK,你用到了数据库,又要安装数据库,而且安装环境的过程中难免又遇到别的问题。如果你的项目运营得不错,用户量增加了,要增加服务器,于是你又要在一台新地服务器上安装环境。
后来有了docker, 只要你的服务器安装了Docker,就可以使用各种现成的镜像,这些镜像可以直接下载,然后通过一行命令直接运行程序。
我们希望我们自己的程序也能制作一个镜像,这样方便他人也方便自己进行复用。

Dockerfile

Dockerfile 是一个用来构建Docker镜像的文本文件
下面以YeBlog后端服务的Dockerfile为例,介绍怎么构建一个自己的镜像

YeBlog后端的Dockerfile

# Dockerfile FROM openjdk:13-alpine3.10 # 基础镜像 MAINTAINER yeyeck<yeyeck@sina.cn> # 维护人/组织 # 设置APK下载源为阿里云 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories # 修改alpine镜像的时区 RUN apk add -U tzdata RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo 'Asia/Shanghai' >/etc/timezone # 一些初始文件 ADD system/* /tmp/yeblog/system/ # 项目目录 WORKDIR /usr/local/app ADD yeblog-*.jar yeblog.jar # 环境变量 ENV JAVA_OPTS="" # 容器启动运行的指令 ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar yeblog.jar # 暴露端口 EXPOSE 8090

指令详解

  • FROM 指定基础镜像
FROM <image>:<tag>
  • MAINTAINER 注明镜像维护人/组织
MAINTAINER <maintainer>
  • ADD 复制文件,如果是压缩文件会先解压
ADD <source> <dest>
  • RUN 运行指定命令, 创建镜像(docker build)时运行
RUN command
  • CMD 运行指定命令,启动镜像(docker run)时执行
CMD command # 或者 CMD ["<可执行文件或命令>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
  • ENV 设置环境变量,可用${env_name}获取值
ENV env_name=env_value
  • ENTRYPOINT 启动镜像时执行的命令,一般是我们自己的程序启动命令
ENTRYPOINT command # 或者 ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
  • EXPOSE 暴露端口,如果我们的项目提供了网络服务
EXPOSE port

Springboot配置文件怎么依赖其他容器的数据

因为我们的项目经常要用到其他服务,比如数据库,我们希望数据库也是Docker部署的,所以我们要获取到Mysql容器的数据和登录密码

# Yeblog的application-pro.yml server: port: 8090 tomcat: accesslog: enabled: true directory: /tmp/yeblog/logs/tomcat spring: datasource: url: jdbc:mysql://mysql:3306/yeblog?useUnicode=true&characterEncoding=utf-8 # for docker build driver-class-name: com.mysql.cj.jdbc.Driver username: root password: ${MYSQL_ENV_MYSQL_ROOT_PASSWORD} # for docker builder hikari: minimumIdle: 5 maximumPoolSize: 15 max-lifetime: 60000 redis: database: 0 host: redis # for docker port: 6379 password: ${REDIS_PASSWORD} # for docker lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 mybatis: configuration: map-underscore-to-camel-case: true logging: file: name: /tmp/yeblog/logs/blog/yeblog.log

在这个配置文件中我们没有使用IP,而是用mysql,这样我们用–link :mysql把两个容器关联后就可以使用mysql作为host访问mysql容器。
–link :alias-name 会把关联的container的环境变量复制一份到启动的容器中。
比如下面这两个容器,yeblogdb有一个环境变量MYSQL_ROOT_PASSWORD,YeBlog容器关联了yeblogdb,并设置别名为mysql,那么YeBlog容器内就会生成一个MYSQL_ENV_MYSQL_ROOT_PASSWORD变量,这个变量的命名是ALIAS_ENV_<PARAM>
所以上面的allication-pro.yml配置的数据库连接参数就可以作用了。

# 启动Mysql容器,设置密码环境变量 docker run -p 3306:3306 --env MYSQL_ROOT_PASSWORD=password --name yeblogdb -d mysql:5.7 # 启动Yeblog后端服务,关联yeblogdb docker run -d -p 8090:8090 \ -v /dockerData/yeblog/headers:/tmp/yeblog/headers \ -v /dockerData/yeblog/image:/tmp/yeblog/image \ -v /dockerData/yeblog/logs:/tmp/yeblog/logs \ --link yeblogdb:mysql \ --link redis:redis \ --env REDIS_PASSWORD=password --name yeblog yeyeck233/yeblog_backend:1.1
阅读(33)
评论(0)
updated@2020-11-16
评论区
目录