现有环境如下:
1.工作目录下有若干个可执行的jar包:在工作目录下打开命令行进行操作(Windows和Linux版的docker均可,这里以Windows为例)
2.拉取任意一个能运行jar包的jdk镜像:我的是adoptopenjdk/openjdk12
3.已具备jar包所需的基本组件:例如mysql、redis、nacos等
假如我只想将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。
该方式比较方便快捷,但不会生成镜像。
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命令
#环境
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包的指令删除即可。
**
根据Dockerfile制作镜像命令如下:
docker build -f 【dockerfile文件的路径】 -t 【自定义镜像名】:latest .
本案例中我自定义的镜像名为menjin,制作镜像的具体命令如下:
docker build -f menjin.dockerfile -t menjin:latest .
根据刚刚生成的镜像部署容器:
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
与方式一不同之处是,除了制作dockerfile文件外,还要制作一个启动脚本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包的指令删除即可。
#环境
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包的指令删除即可。
根据Dockerfile制作镜像命令如下:
docker build -f 【dockerfile文件的路径】 -t 【自定义镜像名】:latest .
本案例中我自定义的镜像名为acs,制作镜像的具体命令如下:
docker build -f acs.dockerfile -t acs:latest .
可以通过docker images
命令查看已有镜像中是否有acs。
根据刚刚生成的镜像部署容器:
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。