文章目录
1. 镜像构建
- 在构建容器化应用时,相当重要的步骤莫过于镜像制作,通常镜像的制作有两种方式:
- 使用现有的容器使用docker commit 生成镜像
- 使用Dockerfile进行镜像构建
- 采用docker commit 生成的镜像实际上是容器内的文件系统进行修改再进行提交,而运行的容器实际上是在镜像的文件系统顶层添加了一层读写层,所都的修改都是基于这一层,当生成镜像时会将这一层数据保存,所以每次使用commit提交镜像时候都会比原来多一层,这样会使得镜像越来越大并且不易维护。同时,对于镜像使用者来说完全不透明,使用者不清楚该镜像怎么样构建的,是否安全等,这种方式及其不推荐。
- 而使用Dockerfile构建镜像,对于使用者来说完全透明,构建镜像的每一个步骤都在Dockerfile文件中描述的清清楚楚,同时当需要对镜像修改时候,只需修改Dockerfile文件中的指令,维护镜像只需要维护一个Dockerfile,这也是镜像构建的最佳方式。
1.1 docker commit (不推荐)
注意:dockercommit 无法看到我们在 shell 中做了什么操作,镜像无法审计,有安全隐患,不推荐使用
docker load -i busybox.tar
或者 docker pull busybox
拉取一个镜像
docker run it --name vm1 busybox
运行容器
Ctrl+p+q
退出容器但不不关闭容器
docker tattach vm1
重新连接到容器
docker commit vm1 test:v1
提交更改过的容器
1.2 Dockerfile方式(推荐)
新建一个目录来存放dockerfile,里面不要放其他文件mkdir /root/docker
vim /root/docker/dockerfile
[root@server2 ~]# mkdir /root/docker
[root@server2 ~]# vim /root/docker/dockerfile
[root@server2 ~]# cat /root/docker/dockerfile
FROM busybox
RUN echo testmyr1 > file1
RUN echo testmyr2 > file2
cd /root/docker
docker build -t test:v2.
.表示提交当前目录中的内容
docker history test:v2
可以看见构建过程
- 相同的步骤从缓存中读取
注意:要使用缓存特性,前面的内容都不能更改,只能新增
2. dockerfile详解
- Dockerfile实际上就是一个文本文件,只不过这里的文件内容被Docker Deamon识别从而进行镜像构建。
- 使用Dockerfile步骤:
- 编写Dockerfile文件,用于描述镜像生成的步骤
- 使用docker build -t name:tag 命令构建镜像
2.1语法规则
1.#号代表注解。
2.Dockerfile每一行都是以某个指令(约定大写字母)开始,后面可加参数构成完整指令,用于描述镜像构建步骤。
3.指令从上倒下依次执行
4.Dockerfile的第一个指令一定是FROM指令,用于指定基础镜像
5.Dockerfile还可以使用.dockerignore文件来忽略在制作镜像时候需要忽略的文件或者目录,列如使用COPY指令时候忽略某些文件或者目录。
6.所有指令参数为数组时,最好使用双引号
- 环境变量引用
1.若要在Dockerfile中引环境变量则使用$variable_name或${variable_name}
2.当变量为空或者变量值未设置可以使用${variable_name:-value}来指定变量的默认值
- docker build命令
- docker build 命令用于基于Dockerfile构建镜像,使用语法:
docker build [OPTIONS] PATH | URL | -
- 其中PATH代表含有Dockfile的目录,当然也可以是URL中含有Dockerfile
常用选项:
-t, --tag list 指定生成镜像标签,格式为name:tag
-f, --file string 单独指定Dockerfile文件位置
--build-arg list 设置构建时的变量
--no-cache 构建镜像时候不使用缓存
2.2 指令详解
- Dockerfile的基本指令有十三个,分别是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD
类型 | 命令 |
---|---|
基础镜像信息 | FROM |
维护者信息 | |
镜像操作指令 | RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等 |
容器启动时执行指令 | CMD、ENTRYPOINT |
- FROM :指定基础镜像
定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个busybox镜像的容器,再进行修改一样,基础镜像是必须指定的。而FROM就是指定基础镜 像,因此一个Dockerfile中FROM是必备的指令,并且必须是第一条指令。
如:指定busybox作为基础镜像
FROM buxybox
- RUN:执行命令
RUN指令在新镜像内部执行的命令,如:执行某些动作、安装系统软件、配置系统信息之类&#