一、引言
ok呀,花个十分钟跟小编一起学习下docker镜像文件是怎么制作的~
保证让你收获满满~
二、目录
目录
三、Dockerfile(制作镜像脚本化)
3.1 什么是Dockerfile
Dockerfile 是一个文本文件,里面包含了一条条构建镜像指令,每一条镜像指令都是描述该层镜像是如何构建的。
- dockerfile 用于指示docker image build 命令自动构建image的源代码
- 是纯文本文件(执行构建命令时要把后缀.txt去掉)
3.1 为什么使用Dockerfile
那么肯定会有小伙伴问了,在docker hub中官方已经提供了很多镜像足够满足我们所有的服务了,为什么还需要自己去自定义制作镜像呢 ?
答:
- 我们可以将自己的应用打包成镜像,这样就可以将我们的应用在容器当中运行了。
- 我们还可以对官方镜像做扩展,以打包成我们生产需要的镜像了。
四、docker build工作原理
docker build [选项] <上下文路径/URL/->
docker build 后面的.表示当前目录,也是指定上下文的路径
上下文:
Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 Docker Remote API ,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。
当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY 指令、ADD 指令等。而 docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?
这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。
那么为什么会有人误以为.·是指定 Dockerfile 所在目录呢?这是因为在默认情况下,如果不额外指定 Dockerfile 的话,会将上下文目录下的名为 Dockerfile 的文件作为 Dockerfile。
这只是默认行为,实际上 Dockerfile 的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,比如可以用 -f …/Dockerfile 参数指定某个文件作为 Dockerfile。
当然,一般大家习惯性的会使用默认的文件名 Dockerfile,以及会将其置于镜像构建上下文目录中。
五、Dockerfile常用指令
5.1 Dockerfile 编写规范
- #描述注释
- 指令必须要大写,后面至少需要带一个参数
- 指令是按照从上到下的顺序执行的
5.2 Dockerfile 指令
1.FROM 指定父镜像: 基于哪个镜像image构建 指定基础镜像,必须为第一个命令
2.MAINTAINER :维护者
3.RUN: 容器创建的时候执行一段命令 构建镜像时执行的命令
4.ADD: 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
5.COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
6.CMD:构建容器后调用,也就是在容器启动时才进行调用。 .sh执行文件
7.ENV: 设置环境变量
8.EXPOSE: 指定于外界交互的端口
9.VOLUME 用于指定持久化目录
10.WORKDIR 设置进入容器时的路径 默认访问的目录
六、制作镜像(实战演示)
大致流程图:
ok呀,没看懂是不是,下面跟小编一起写个案例,你就懂了,接着往下看:
案例一:我现在想定制一个centos的镜像,需要满足以下两点要求
- 启动容器镜像,默认进入 /usr 的目录
- 实现支持 vim 插件
第一步:编写Dockerfile文件
# 继承docker hub中的centos镜像,版本为7
FROM centos:7
# 作者
MAINTAINER wangyan-centos
# 环境变量 /usr
ENV MYPATH /usr
# 引用环境变量,进入容器中,默认进入 /usr 目录
WORKDIR $MYPATH
# 容器创建的时候,下载vim插件
RUN yum -y install vim
# 暴露端口
EXPOSE 80
# 启动容器,执行.sh文件
CMD /bin/bash
第二步:执行 docker build -f Dockerfile -t 镜像名称:版本号 . 成一个镜像文件
命令解释:
-f :指定Dockerfile目录文件
. : 指定当前目录,千万别忘加了这个 “.”
第三步:docker run运行容器,docker run -it kkt:1
到这里就运行成功了,可以看到运行容器默认就进入 /usr 的目录,vim插件也是已经下载好了。
案例二 :以我们的springboot项目为例,新建一个springboot项目,并将项目制作成一个镜像,运行成功并且访问。
第一步:准备一个springboot项目,新建项目我相信大家都会,这里就写个简单的接口访问,以便测试。
/**
* @Author WangYan
* @Date 2023/10/7 16:12
* @Version 1.0
*/
@RestController
public class controller {
@RequestMapping("/index")
public String toString() {
return "hello docker";
}
}
第二步:编写Dockerfile文件命令
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER wangyan-demo001
# 将jar包添加到容器中并更名为mayikt.jar
ADD dockerTest.jar mayikt.jar
# 运行jar包
ENTRYPOINT ["java","-jar","/mayikt.jar"]
#暴露8080端口
EXPOSE 8080
第三步:将Dockerfile构建成镜像文件 docker build -f Dockerfile -t wangyan-springboot:1 .
第四步:docker运行该容器,docker run -d -p 8080:8081 wangyan-springboot:1
拜拜~
有任何问题欢迎大家指出~
Thank You !