编写 Dockerfile 生成自定义镜像
一般情况下我们可以从公共渠道诸如 DockerHub 获取镜像上获取镜像,但是在实际生产过程中,往往需要定制化的镜像,例如修改一些配置文件,增加一些特殊的命令或软件等需求,这时就需要通过编写 Dockerfile 来生成自定义的镜像文件。
Dockerfile介绍
Dockerfile 是一个文本格式的配置文件,通过编写 Dockerfile 脚本来定义自己需要的镜像。Dockerfile 文件由一行行命令语句组成,文件中的注释信息以 # 开头。编辑好 Dcokerfile 文件之后,我们可以通过 docker build -t . 命令生成自己定义的镜像文件。
Dockerfile基本结构
我们看一下 alpine 的 Dockerfile 文件:
FROM scratch
ADD alpine-minirootfs-20201218-x86_64.tar.gz /
CMD ["/bin/sh"]
Dockerfile 文件主要由三部分组成:
- FROM 属于配置指令部分,表明基于的镜像名称。
scratch指从空白开始。 - ADD 属于操作指令部分,表示向镜像内加入内容。
- CMD 也属于操作指令部分,一般做为最后一行,表示运行容器时的操作命令。
指令说明
Dockerfile 中指令的一般格式为 INSTRUCTION arguments ,指令分两种 配置指令 和 操作指令,具体如下:
- 配置指令
- ARG : 定义创建镜像过程中使用的变量,格式为
ARG <name>[=<default value>] - FROM : 指定所创建镜像的基础镜像。格式为
FROM <image>:<tag> - LABEL : 为生成的镜像添加元数据标签信息,辅助过滤特定镜像。格式为
LABEL <key>=<value> <key>=<value> - EXPOSE : 声明镜像内服务监听的端口。格式为
EXPOSE <port>[/<protocol>] - ENV : 指定环境变量,该变量在容器中存在,也可在容器启动时覆盖。格式为
ENV <key> <value> - ENTRYPOINT : 指定镜像的默认入口命令,做为容器启动时的根命令执行。格式为
ENTRYPOINT ["executable", "param1", "param2"]或者ENTRYPOINT command param1 param2 - VOLUME : 创建一个数据卷挂载点。格式为
VOLUME ["/data"] - USER : 指定容器运行时的用户名或UID,后续的RUN指令也使用该用户身份。格式为
USER daemon - WORKDIR : 配置RUN\CMD\ENTRYPOINT等指令的工作目录,推荐使用绝对路径。格式为:
WORKDIR /path/to/workdir - ONBUILD : 指定当基于所生成镜像创建子镜像时,自动执行的操作指令。
- STOPSIGNAL : 指定容器接收退出的信号值。格式为:
STOPSIGNAL signal - HEALTHCHECK : 配置容器健康检查命令,自 Docker 1.12 开始支持。格式为:
HEALTHCHECK [OPTIONS] CMD command - SHELL : 指定默认的shell类型。格式为:
SHELL ["executable", "parameters"]
- ARG : 定义创建镜像过程中使用的变量,格式为
- 操作指令
- RUN : 运行指定命令。格式为:
RUN <command>或RUN ["executable", "param1", "param2"]当命令较长时,可以用 \ 来换行。 - CMD : 指定容器启动时默认执行的命令,每个Dockerfile只能有一条CMD命令。格式有三种,分别为:
CMD ["executable", "param1", "param2"]或CMD command param1 param2或CMD ["param1", "param2"] - ADD : 添加内容到镜像中,将SRC内容复制到DEST中。格式为:
ADD <src> <dest> - COPY : 复制内容到镜像中。格式为 :
COPY <src> <dest>
- RUN : 运行指定命令。格式为:
创建镜像
创建镜像的命令格式为
$ 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
*docx
README.md
实战案例
总的来说,通过编写 Dockerfile 生成自定义镜像的过程不复杂,但是能生成高效的镜像还需要不断的尝试和联系,一般来说用于生产的镜像都尽量保证用途单一,减少镜像的层数,选择合适的基础镜像减小镜像文件大小,形成自己的版本号和标签管理规则,这样能提高自己生成镜像的质量。
下面就以一个简单定义 python 基础镜像的例子,基础的 python 镜像缺少很多包例如爬虫常用的 requests ,自己定义一个包含 requests 包的镜像,编写的 Dockerfile 如下:
FROM python:3.6
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
执行镜像的创建命令
$ docker build -t python-requests-3.6:0.1 .
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python-requests-3.6 0.1 3c2bb72b2066 2 minutes ago 884MB
python 3.6 85146760634c 7 weeks ago 874MB
$ docker run --rm -it -v "$PWD":/usr/src -w /usr/src python-requests-3.6:0.1 python3
Python 3.6.12 (default, Nov 18 2020, 14:46:32)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> response = requests.get("http://baidu.com")
>>> print(response.text)
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
可以看到镜像内的 python 环境已经支持 requests 包了。利用这种方式,我们不用在本地维护开发环境,特别是多个版本的开发环境,通过 Docker 生成不同版本的镜像能够快速的实现多版本的开发环境,大家可以参考 利用 Docker 构建一个简单的 java 开发编译环境 。自己定义的各种镜像,可以上传到 DockerHub,更换电脑后仅需要安装 Docker,之前的各种开发环境就回来了。
对于 Docker 有进一步兴趣的,可以参考我的其他文章:
- Docker 入门介绍
- 在Redhat 7.3中采用离线方式安装Docker
- 创建自己的Docker基础镜像
- Docker存出载入镜像
- Docker Compose 使用介绍
- 使用 Docker 快速搭建PHP开发环境
- Docker Compose 建立ELK集群
最后说点杂事,2021年刚开始没几天,年前立下的雄心壮志马上被各种无计划的事打乱了,感觉总是被打断,感觉总是时间不够用,原来以为是自己能力不够用,最近在云+社区上读了一个时间管理系列文章,才发现原来是自己坚持不够,给了自己点信心,2021刚开始还要继续加油才是,附上这个系列文章的链接,感兴趣的朋友可以读一读。

编写 Dockerfile 生成自定义镜像的更多相关文章
- Docker学习(六)Dockerfile构建自定义镜像
Docker学习(六)Dockerfile构建自定义镜像 前言 通过前面一篇文章可以知道怎么去使用一个镜像搭建服务,但是,如何构造自己的一个镜像呢,docker提供了dockerfile可以让我们自己 ...
- 实战docker,编写Dockerfile定制tomcat8镜像,实现web应用在线部署
最初在tomcat上部署web应用的方式,是通过maven的maven-compiler-plugin插件先打成war包,再将war包复制到tomcat的webapps目录下,后来用上了tomcat7 ...
- Dockerfile制作自定义镜像
本文介绍最精简的Dockerfile文件构建镜像,Docker启动的时候可以启动一个shell脚本 1.首先编写Dockerfile文件 说明 1.启动的这个shell脚本一定是不退出的,比如服务器的 ...
- 实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署
最初在tomcat上部署web应用的方式,是通过maven的maven-compiler-plugin插件先打成war包,再将war包复制到tomcat的webapps目录下,后来用上了tomcat7 ...
- 自己动手编写 Dockerfile 构建自定义的Jenkins
1.构建jenkins 镜像 vim Dockerfile FROM jenkins USER root ARG dockerGid=999 RUN echo "docker:x:${d ...
- docker学习笔记-06:自定义DockerFile生成镜像
一.自定义centos的DockerFile 1.从阿里源里拉的centos镜像新建的容器实例中,没有vim编辑器和ifconfig命令,所以自定义centos的DockerFile,创建自己想要的镜 ...
- Dockerfile详解,以及构建自定义镜像
Dockerfile使用 前面的操作我们一直下载下载官方已经构建好的镜像,直接下载后就可以run,如果我们想要在镜像中添加自己的应用,比如在tomcat中添加自己的app,构建一个自定义的镜像,那么我 ...
- Docker | 第五章:构建自定义镜像
前言 上一章节,主要是介绍了下Dockerfile的一些常用命令的说明.我们知道,利用Dockerfile可以构建一个新的镜像,比如运行Java环境,就需要一个JDK环境的镜像,但直接使用公共的镜像时 ...
- Dockfile 生成docker镜像文件大小的比较
下面就是我针对docker file同一个文件,按照layer层的个数的多少,分别构建了两个镜像的jenkins-master.两者大小相差300MB. <1> layer层数太多,没有将 ...
随机推荐
- Python匹配对象的groups、groupdict和group之间的关系
匹配对象的groups()方法返回一个包含所有参与匹配的子组(不含组0)的匹配到的搜索文本子串的元组,groupdict返回一个包含所有匹配到的命名组的组名为键值和命名组匹配到的搜索文本子串为值作为元 ...
- Go语言的context包从放弃到入门
目录 一.Context包到底是干嘛用的 二.主协程退出通知子协程示例演示 主协程通知子协程退出 主协程通知有子协程,子协程又有多个子协程 三.Context包的核心接口和方法 context接口 e ...
- 团队作业3_需求改进&系统设计
一.需求&原型改进 1.需求改进: (1)发现问题:通过发布问卷调查及收集整理的形式发现用户的新需求: (2)修改需求:考虑新增提醒用户未完成事件的功能. 附:用户调查问卷(如下) 调研途 ...
- mock.js 和easy-mock使用
mock.js 1.项目中引入mock.js <script src="../static/js/mock.js" type="text/javascript&qu ...
- 微软面试题:剑指 Offer 51. 数组中的逆序对 Hard 出现次数:3
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. 输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5 限制: ...
- 题解-MtOI2019 幽灵乐团
题面 MtOI2019 幽灵乐团 给定 \(p\),\(Cnt\) 组测试数据,每次给 \(a,b,c\),求 \[\prod_{i=1}^a\prod_{j=1}^b\prod_{k=1}^c\le ...
- Java集合源码分析(九)——HashSet
简介 HashSet就是一个集合,里面不能有重复的元素,元素也是无序的. HashSet其实就是调用了HashMap实现的,所以,它也不是线程安全的. HashSet通过iterator()返回的迭代 ...
- vue2实现路由懒加载
一.什么是懒加载 顾名思义,懒加载就是随用随加载,什么时候需要就什么时候加载. 二.为什么需要懒加载 在单页应用中,如果没有使用懒加载,webpack打包后的文件会很大,这时进入首页时的加载时间会很长 ...
- C# 高性能对象映射
1.之前在使用AutoMapper 框架感觉用着比较不够灵活,而且主要通过表达式树Api 实现对象映射 ,写着比较讨厌,当出现复杂类型和嵌套类型时性能直线下降,甚至不如序列化快. 2.针对AutoMa ...
- 哔哩哔哩直播录制工具v1.1.18
软件介绍 看直播有时候非常精彩想要录制下来,或者非常喜欢某个主播想录制下直播全程,可去找录制软件的时候却发现有这样那样的问题,导致一番操作不尽人意.但是现在<B站直播录制工具>可以完美解决 ...