前言
在上一篇中,博主对通过docker registry
完成私仓搭建的过程,进行了完整演示和说明。一个docker 环境(比如desktop),一个registry镜像,准备好这样的“2件套”
,就能换来一个私有仓库了。
简单么? 中肯的说,是相当简单了,所以该动手时一定要动动手。有句话这么说:“所有目标都是黑暗的,只有行动才与光明相伴”
。当你亲自走一遍自己未曾走过的路时,连路旁的花草都为你喝彩。
回顾一下,仓库有了,下一步是不是该琢磨搞点“粮食”
了? 博主正好也是这么想的(😁😁😁)。请允许继续紧跟博主的步伐,快乐的实践,从此玩转docker不是梦,Let’s go!
Q:如何创建人生第一个镜像
1. 物质基础
docker_env_12">1.1 docker env
首先需要自备一个可以运行docker
的环境,就像运行JAR
,必须提前安装JDK
一样。这里博主做一个不恰当的比喻,docker好似一个镜像的“编译器”
,负责构建 / 运行 / 删除镜像。如果是零基础的盆友,建议先用这个桌面工具——docker desktop
,操作从简入难,非常适合小白上手。但是,如果各位有一个Linux环境,那就更好了,可以无缝对接日常的工作。
1.2 maven project
找一个简单的maven project,改造为容器部署模式。我们可以去开源社区,随处可以找一个springboot project
,或者亲自create一个皆可以。
1.3 Dockerfile
Dockerfile
就像电影剧本一样,主宰着镜像(image
)的诞生过程。也就是说,你可以根据既定规则,“排兵布阵”
。什么阶段需要什么样的资源,从哪里获取,如何组织战斗,均需要在这个文件中定义。
严肃的讲:
1.3.1 文件指令集
指令 | 说明 |
---|---|
FROM | 指定基础镜像,也就是明确当前新镜像的依赖镜像是什么。(必须 ) |
LABEL | 添加镜像说明,使用键值对的格式:key=value(支持多个,空格分隔 )。 |
RUN | 指定在docker build 过程中执行的命令。支持shell 和exec 两种格式。 |
CMD | 指定容器启动时的命令。(写多条时,以最后一次为准 ) |
ENTRYPOINT | 指定容器默认的运行程序。(写多条时,不会覆盖之前的 ) |
EXPOSE | 声明容器运行时监听的特定网络端口。(仅用于声明 ) |
ENV | 在容器内部设置环境变量。 |
ADD | 将特定的文件、目录或远程URL复制到镜像中。(copy资源 ) |
COPY | 将文件或目录复制到镜像中。(copy资源 ) |
VOLUME | 为容器创建挂载点或声明卷。 |
WORKDIR | 设置后续指令的工作目录。 |
USER | 指定后续指令的用户上下文。 |
ARG | 定义在构建过程中传递给构建器的变量,为 docker build 命令设置。 |
ONBUILD | 当该镜像被用作另一个构建过程的基础时,添加触发器。 |
STOPSIGNAL | 设置发送给容器以退出的系统调用信号。 |
HEALTHCHECK | 定义周期性检查容器健康状态的命令。 |
SHELL | 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令 |
1.3.2 指令的意义
定义如此丰富的指令,是为制作一个镜像预设各种有逻辑有时序的操作(“你说不是剧本,我不信”
)。换句话说,在Linux
部署应用时,我们通常需要进行几个步骤:
- 创建系统用户
- 创建用户目录
- 用户权限设置
- 配置服务端口
- 应用打包
- 上传应用(或资源文件)
- 启动应用
那么dockerfile
其实也就是在描绘一张应用部署的“蓝图”
。
2. 镜像制作初体验
dockerfile_58">2.1 编写dockerfile
掌握了指令,我们可以开始熟练的使用它,博主以一个简单的示例着手,带着各位盆友体验一番dockerfile的妙处。基于springboot/springcloud
的微服务盛行于当下, 博主就选择一个简单的微服务下手吧。其中dockerfile指令如下:
# 基础镜像
FROM openjdk:8-jre
# 镜像的描述
LABEL author="一叶飞舟"
LABEL version="1.0"
LABEL description="该镜像用于部署一个微服务"
# 声明服务端口,与docker run -p含义不同,当然可以保持一致
EXPOSE 8888
# 挂载目录
VOLUME /home/ms
# 创建镜像工作目录
RUN mkdir -p /home/ms
# 指定目录
WORKDIR /home/ms
# 复制本地资源到镜像中
COPY ./jar/ondeservice.jar /home/ds/ondeservice.jar
# 定义启动容器默认执行的JAR
ENTRYPOINT ["java","-jar","ondeservice.jar"]
docker_build_81">2.2 docker build
docker build -t ondeservice:latest .
该命令通过读取当前目录的dockerfile文件,完成镜像的生成。当然你也可以通过-f
指定dockerfile目录,命令如下:
docker build -f /file/dockerfile -t ondeservice:latest .
镜像创建后,我们可以将其上传私仓,用于多环境部署,是不是很简单?
结语
本博将镜像的制作过程进行基本介绍和说明,以期抛砖引玉,我们完全可以施展各自的想法,在满足docker原则、规范的基础上,尽情的“玩”
!
系列回顾
微服务实战系列之玩转Docker(六)
微服务实战系列之玩转Docker(五)
微服务实战系列之玩转Docker(四)
微服务实战系列之玩转Docker(三)
微服务实战系列之玩转Docker(二)
微服务实战系列之玩转Docker(一)
微服务实战系列之云原生