背景
生产过程中,一个服务制作一个镜像,有点太占用空间,由此,考虑设置一个镜像能支持多个服务的部署,通过文件挂载的模式,通过启动容器时候传递参数实现该需求。
思路
1、编写dockerfile镜像镜像
- 生成镜像需要具备jdk的基础环境
- dockerfile需要支持参数传递
- 在构建镜像和启动容器的时候能够支持文件路径挂载
2、构建镜像
3、执行镜像生成容器
4、启动容器
5、查看容器运行日志
编写dockerfile
dockerfile是生成镜像的基础
# 集成某个初始镜像
FROM openjdk:11-jre-slim
#设置容器启动时Springboot启动参数--默认值为空
ENV JAVA_OPTS=
# 设置build-arg key=value build参数
# ARG params=build时指定的参数
# 设置jar的路径及名称
ENV JAR_NAME=
## 创建文件路径
RUN mkdir -p /ssss
## 指定工作路径
WORKDIR /ssss
## 拷贝文件数据--本场景不需要该命令
#COPY *.jar /ssss/$JAR_NAME
## 声明要使用的端口
EXPOSE 8080
## 启动jar 脚本
CMD java -jar $JAVA_OPTS $JAR_NAME
#ENTRYPOINT ["sh" "-c" "java -jar $JAVA_OPTS /apps/app.jar"]
构建镜像
## -t 打上标签 .表示使用当前路径下的Dockerfile
docker build -t test .
出现successfully表示成功了,中间出现的语法构建错误问题,根据错误提示,基本上都能解决。
## 查看当前所有的镜像系想你
docker images
该test镜像就是后面运行出各个容器的基础,仅有这一个镜像
启动容器-(test-one)
进入需要挂载和启动的Springboot路径,执行以下命令 ,执行第一个需要运行的Springboot服务
## -d 后台运行
## --name 为容器起个名称
## -v 文件路径挂载
## -e 是设置dockerfile中设置的环境变量 --多个变量可以使用多个-e标签
## -p 端口映射 宿主机器端口:容器端口
## `pwd`为当前路径,笔者当前的springboot jar路径为 /data/docker/server/server1.jar
## 最后面test为镜像名称
docker run -d --name test-one -v `pwd`:/server1/ -e JAR_NAME=/server1/server1.jar -e JAVA_OPTS="-Dserver.port=10008" -p 10008:10008 test
启动容器-(test-2)
进入需要挂载和启动的Springboot路径,执行以下命令 ,执行第二个需要运行的Springboot服务
## -d 后台运行
## --name 为容器起个名称
## -v 文件路径挂载
## -e 是设置dockerfile中设置的环境变量 --多个变量可以使用多个-e标签
## -p 端口映射 宿主机器端口:容器端口
## `pwd`为当前路径,笔者当前的springboot jar路径为 /data/docker/server/server2.jar
## 最后面test为镜像名称
docker run -d --name test-one -v `pwd`:/server/ -e JAR_NAME=/server/server2.jar -e JAVA_OPTS="-Dserver.port=10008" -p 10009:10008 test
查看容器是否在运行
docker ps
查看接口文档,验证容器是否启动成功
至此,支持多个jar应用部署的镜像制作完整,应用改变jdk版本只需要将该镜像的jdk修改即可,一下是可能会使用到的docker命令
## 搜索镜像
docker search openjdk
## 列出当前所有镜像
docker iamges
## 列出所有容器
docker ps -a
## 列出所有运行容器
docker ps
## 删除所有none标签的镜像
docker rmi $(docker images| grep none | awk '{print $3}')
## 通过已知镜像查看镜像的dockerfile---由此得到的dockerfile并不准
docker history test --format "{{.CreatedBy}}" --no-trunc
记录备查