一、背景
作为云原生架构下的devops开发,怎么能离得了Docker呢,本文作为devops系列文章的第一篇,将详细说明如何制作一个docker镜像,以及推送到镜像仓库,直到拉取镜像,运行一个容器的整个过程。
二、编写Dockerfile
FROM openjdk:8u201-jdk-alpine3.9
#构建参数
ARG WORK_PATH="/opt/xxx"
# 设置时区
RUN apk update && apk add ca-certificates && \
apk add tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
ARG APPNAME
ARG PACKAGE_PATH="target"
COPY ${PACKAGE_PATH}/${APPNAME}.jar ${WORK_PATH}/${APPNAME}/packages/${APPNAME}.jar
# 暴露端口
ARG PORT
EXPOSE ${PORT}/tcp
# 创建dump目录
RUN mkdir -p ${WORK_PATH}/${APPNAME}/dump
# 创建resources目录
RUN mkdir -p ${WORK_PATH}/${APPNAME}/resources
# 安装curl工具
RUN apk add curl
# 切换工作目录
WORKDIR ${WORK_PATH}
# 环境变量,这里配置了默认参数
ENV JAVA_OPTS="-Xms64m -Xmx512m"
ENTRYPOINT exec java ${JAVA_OPTS} \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=${WORK_PATH}/${APPNAME}/dump \
-jar ${APPNAME}/packages/${APPNAME}.jar
三、生成镜像Docker build
注意最末尾的“.”别落下了!!
docker build --build-arg APPNAME="devops-service" --build-arg PORT="8085" -t xxx/devops-service:1.0.7 .
四、查询镜像Docker images
docker images | grep dev
xxx/devops-service 1.0.7 df5c6b422946 17 minutes ago 207MB
五、运行docker容器
# 注意,在正式运行的时候,建议使用 -d 替代 -it
docker run -it --name devops-service \
-e JAVA_OPTS='-Xms64m -Xmx512m -Dspring.profiles.active=dev' \
-e APPNAME='devops-service' \
-p 8085:8085 \
xxx/devops-service:1.0.7
六、验证![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fdc61b8da9db5fdd0af5c289530fc475.png)
从下图可以看出,当前服务的运行命令是
java -Xms64m -Xmx512m -Dspring.profiles.active=dev -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/devops-service/dump -jar devops-service/packages/devops-service.jar
- 因为我们在运行容器的时候,有对环境变量JAVA_OPTS进行替换为“-Xms64m -Xmx512m -Dspring.profiles.active=dev”。(你也可以不传入,因为我在Dockerfile中有对JAVA_OPTS变量进行初始化)
- 查看端口,你可以使用命令netstat
七、推送镜像到仓库
说到Docker镜像仓库,一般都是选择harbor了,这方面的文章也比较多。本文我将演示使用nexus作为docker镜像仓库。
- 参考我之前写的一篇文章:https://blog.csdn.net/zhuganlai168/article/details/130850155
# 1、登录nexus
docker login 192.168.5.6:8086 -u 150xxxx9916 -p 123456
# 在本地,查看之前已做好的docker镜像
docker images | gerp devops-service
# 2、给镜像打tag
# 注意:Hosted私有仓库,而非group组合仓库
docker tag xxx/devops-service:1.0.7 192.168.5.6:8086/xxx/devops-service:1.0.7
# 3、推送
docker push 192.168.5.6:8086/xxx/devops-service:1.0.7
在Nexus进行确认镜像:
可以看到,自制的镜像已经推送到我们的私有仓库了。
其他的机器就可以愉快地docker pull xxx/devops-service:1.0.7,把docker镜像下载下来了。
至此,我们devops容器化部署的第一步就算告一段落。后期,我将在k8s中,使用helm来部署这个java服务。