Dockerfile应用案例教程

  • 1.现有环境
  • 2.部署方式
  • 方式一:直接部署jar包为容器(单个jar包)
  • 方式二:以启动jar包打包镜像,部署容器(单个和多个jar包均可)
  • 1.Dockerfile指令说明
  • 2.创建并制作Dockerfile文件
  • 3.制作镜像
  • 4.部署容器
  • 方式三:以启动脚本打包镜像,部署容器(单个和多个jar包均可)
  • 1.创建并制作启动脚本run.sh
  • 2.创建并制作Dockerfile文件
  • 3.制作镜像
  • 4.部署容器


1.现有环境

现有环境如下:

1.工作目录下有若干个可执行的jar包:在工作目录下打开命令行进行操作(Windows和Linux版的docker均可,这里以Windows为例)

dockerfile 出现多个entrypoint dockerfile 启动多个服务_linux


2.拉取任意一个能运行jar包的jdk镜像:我的是adoptopenjdk/openjdk12

dockerfile 出现多个entrypoint dockerfile 启动多个服务_linux_02


3.已具备jar包所需的基本组件:例如mysql、redis、nacos等

dockerfile 出现多个entrypoint dockerfile 启动多个服务_容器_03

2.部署方式

方式一:直接部署jar包为容器(单个jar包)

dockerfile 出现多个entrypoint dockerfile 启动多个服务_linux_04


假如我只想将nettyserver-1.0.36-SNAPSHOT.jar这个jar包部署成容器运行,只需要直接输入以下命令即可:

docker run -d --name nettyserver -p 8083:8083 -p 8066:8066 -v G:\platform\jarapp:/home/jarapp adoptopenjdk/openjdk12 java -jar -Dfile.encoding=utf-8 /home/jarapp/nettyserver-1.0.36-SNAPSHOT.jar
指令说明:
--name nettyserver:创建的容器名为nettyserver
-p 8083:8083 -p 8066:8066:该jar包所要暴露的端口为8083和8066
-v G:\platform\jarapp:/home/jarapp:将本机的G:\platform\jarapp目录挂载到容器中/home/jarapp目录
adoptopenjdk/openjdk12 :基于这个镜像创建的容器
java -jar -Dfile.encoding=utf-8 /home/jarapp/nettyserver-1.0.36-SNAPSHOT.jar:创建容器时执行这条命令

可以通过docker ps -a命令查看已有容器中是否有nettyserver。
该方式比较方便快捷,但不会生成镜像。

方式二:以启动jar包打包镜像,部署容器(单个和多个jar包均可)

1.Dockerfile指令说明

FROM:构建镜像基于哪个镜像
MAINTAINER:镜像维护者姓名或邮箱地址
RUN:构建镜像时运行的指令
CMD:运行容器时执行的shell环境
VOLUME:指定容器挂载点到宿主机自动生成的目录或其他容器
USER:为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户
WORKDIR:为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
HEALTHCHECH:健康检查
ARG:构建时指定的一些参数
EXPOSE:声明容器的服务端口(仅仅是声明)
ENV:设置容器环境变量
ADD:拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压
COPY:拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
ENTRYPOINT:运行容器时执行的shell命令

2.创建并制作Dockerfile文件

创建Dockerfile文件:

dockerfile 出现多个entrypoint dockerfile 启动多个服务_java_05


填入以下自定义内容:

#环境
FROM adoptopenjdk/openjdk12 
#作者信息
MAINTAINER funfan <1424393744@qq.com>
#将本地文件挂载到容器
EXPOSE 8082 8083 8066 8090
#拷贝
COPY ut-rtj1a-1.0.36-SNAPSHOT.jar /ut-rtj1a-1.0.36-SNAPSHOT.jar
COPY nettyserver-1.0.36-SNAPSHOT.jar /nettyserver-1.0.36-SNAPSHOT.jar
COPY essgserver-1.0.36-SNAPSHOT.jar /essgserver-1.0.36-SNAPSHOT.jar
#执行命令
CMD ["sh", "-c", "java -jar /ut-rtj1a-1.0.36-SNAPSHOT.jar > /rtj1a.log 2>&1 & java -jar /nettyserver-1.0.36-SNAPSHOT.jar > /nettyserver.log 2>&1 & java -jar /essgserver-1.0.36-SNAPSHOT.jar > /essgserver.log 2>&1"]

**

如果只需制作单个jar包的镜像,只需将有关多余jar包的指令删除即可。

**

3.制作镜像

根据Dockerfile制作镜像命令如下:

docker build -f 【dockerfile文件的路径】 -t 【自定义镜像名】:latest .

本案例中我自定义的镜像名为menjin,制作镜像的具体命令如下:

docker build -f menjin.dockerfile -t menjin:latest .

可以通过docker images命令查看已有镜像:

dockerfile 出现多个entrypoint dockerfile 启动多个服务_容器_06

4.部署容器

根据刚刚生成的镜像部署容器:

docker run -d --name 【自定义容器名】 -p 【需要暴露的端口号】 【所基于的镜像名】

本案例中我自定义容器名也为menjin,3个jar包的暴露端口有8082、8083、8066、8090:

docker run -d --name menjin -p 8082:8082 -p 8083:8083 -p 8066:8066 -p 8090:8090 menjin

可以通过docker ps -a命令查看已有容器:

dockerfile 出现多个entrypoint dockerfile 启动多个服务_jar_07

方式三:以启动脚本打包镜像,部署容器(单个和多个jar包均可)

与方式一不同之处是,除了制作dockerfile文件外,还要制作一个启动脚本run.sh

dockerfile 出现多个entrypoint dockerfile 启动多个服务_容器_08

1.创建并制作启动脚本run.sh

填入以下内容:(jar包为工作目录的jar包)

#!/bin/bash
nohup java -jar -Dfile.encoding=utf-8 /ut-rtj1a-1.0.36-SNAPSHOT.jar & nohup java -jar -Dfile.encoding=utf-8 /essgserver-1.0.36-SNAPSHOT.jar & nohup java -jar -Dfile.encoding=utf-8 /nettyserver-1.0.36-SNAPSHOT.jar

注意事项:在windows编辑的sh脚本的行尾符是CRLF格式的,要在linux中运行的话要改成LF格式才行。更换脚本格式的方法可以自行百度,我是采用notepad++工具将CRLF替换为LF的:

如果只需制作单个jar包的镜像,只需将有关多余jar包的指令删除即可。

2.创建并制作Dockerfile文件

#环境
FROM adoptopenjdk/openjdk12 
#作者信息
MAINTAINER funfan <1424393744@qq.com>
EXPOSE 8082 8083 8066 8090
#拷贝
COPY run.sh /run.sh
COPY ut-rtj1a-1.0.36-SNAPSHOT.jar /ut-rtj1a-1.0.36-SNAPSHOT.jar
COPY nettyserver-1.0.36-SNAPSHOT.jar /nettyserver-1.0.36-SNAPSHOT.jar
COPY essgserver-1.0.36-SNAPSHOT.jar /essgserver-1.0.36-SNAPSHOT.jar
#RUN命令
RUN chmod 777 /run.sh
#执行命令
ENTRYPOINT ["sh","/run.sh"]

如果只需制作单个jar包的镜像,只需将有关多余jar包的指令删除即可。

3.制作镜像

根据Dockerfile制作镜像命令如下:

docker build -f 【dockerfile文件的路径】 -t 【自定义镜像名】:latest .

本案例中我自定义的镜像名为acs,制作镜像的具体命令如下:

docker build -f acs.dockerfile -t acs:latest .

可以通过docker images命令查看已有镜像中是否有acs。

4.部署容器

根据刚刚生成的镜像部署容器:

docker run -d --name 【自定义容器名】 -p 【需要暴露的端口号】 【所基于的镜像名】

本案例的自定义容器名也为acs,3个jar包的暴露端口有8082、8083、8066、8090:

docker run -d --name acs -p 8082:8082 -p 8083:8083 -p 8066:8066 -p 8090:8090 acs

可以通过docker ps -a命令查看已有容器中是否有acs。