本文共 3370 字,大约阅读时间需要 11 分钟。
一般情况下我们可以从公共渠道诸如 获取镜像上获取镜像,但是在实际生产过程中,往往需要定制化的镜像,例如修改一些配置文件,增加一些特殊的命令或软件等需求,这时就需要通过编写 Dockerfile 来生成自定义的镜像文件。
Dockerfile 是一个文本格式的配置文件,通过编写 Dockerfile 脚本来定义自己需要的镜像。Dockerfile 文件由一行行命令语句组成,文件中的注释信息以 # 开头。编辑好 Dcokerfile 文件之后,我们可以通过 docker build -t .
命令生成自己定义的镜像文件。
我们看一下 的 Dockerfile 文件:
FROM scratchADD alpine-minirootfs-20201218-x86_64.tar.gz /CMD ["/bin/sh"]
Dockerfile 文件主要由三部分组成:
scratch
指从空白开始。Dockerfile 中指令的一般格式为 INSTRUCTION arguments
,指令分两种 配置指令 和 操作指令,具体如下:
ARG <name>[=<default value>]
FROM <image>:<tag>
LABEL <key>=<value> <key>=<value>
EXPOSE <port>[/<protocol>]
ENV <key> <value>
ENTRYPOINT ["executable", "param1", "param2"]
或者 ENTRYPOINT command param1 param2
VOLUME ["/data"]
USER daemon
WORKDIR /path/to/workdir
STOPSIGNAL signal
HEALTHCHECK [OPTIONS] CMD command
SHELL ["executable", "parameters"]
RUN <command>
或 RUN ["executable", "param1", "param2"]
当命令较长时,可以用 \ 来换行。CMD ["executable", "param1", "param2"]
或 CMD command param1 param2
或 CMD ["param1", "param2"]
ADD <src> <dest>
COPY <src> <dest>
创建镜像的命令格式为
$ docker build [OPTIONS] PATH | URL | -
docker build 命令读取指定路径下的 Dockerfile 文件,并将该路径下的所有数据作为上下文发送给 Docker 服务端。服务端完成 Dockerfile 格式校验后,按顺序执行指令命令,遇到ADD、COPY和RUN指令会生成新一层的镜像文件。镜像创建成功后,返回镜像ID。
docker build 还有很多选项,最常用的是通过 -t
增加标签。
$ docker build -t test:0.1 .
当 Dockerfile 所在的文件夹文件过多时,为避免向服务端上传上下文过大,可以通过 .dockerignore 文件来让 Docker 忽略无关的文件。
$ cat .dockerignore*xls*docxREADME.md
总的来说,通过编写 Dockerfile 生成自定义镜像的过程不复杂,但是能生成高效的镜像还需要不断的尝试和联系,一般来说用于生产的镜像都尽量保证用途单一,减少镜像的层数,选择合适的基础镜像减小镜像文件大小,形成自己的版本号和标签管理规则,这样能提高自己生成镜像的质量。
下面就以一个简单定义 python 基础镜像的例子,基础的 python 镜像缺少很多包例如爬虫常用的 requests ,自己定义一个包含 requests 包的镜像,编写的 Dockerfile 如下:
FROM python:3.6RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
执行镜像的创建命令
$ docker build -t python-requests-3.6:0.1 .$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEpython-requests-3.6 0.1 3c2bb72b2066 2 minutes ago 884MBpython 3.6 85146760634c 7 weeks ago 874MB$ docker run --rm -it -v "$PWD":/usr/src -w /usr/src python-requests-3.6:0.1 python3Python 3.6.12 (default, Nov 18 2020, 14:46:32) [GCC 8.3.0] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import requests>>> response = requests.get("http://baidu.com")>>> print(response.text)
可以看到镜像内的 python 环境已经支持 requests 包了。利用这种方式,我们不用在本地维护开发环境,特别是多个版本的开发环境,通过 Docker 生成不同版本的镜像能够快速的实现多版本的开发环境,大家可以参考 。自己定义的各种镜像,可以上传到 DockerHub,更换电脑后仅需要安装 Docker,之前的各种开发环境就回来了。
对于 Docker 有进一步兴趣的,可以参考我的其他文章:
转载地址:http://jmrkz.baihongyu.com/