Docker速学(二) Dockerfile和数据卷

在前文,我们介绍了Docker学习的基本方法和原理,以及基础三大件:镜像、容器、仓库。

回顾:

Docker小白入门建议及基本原理介绍

Docker速学(一) 镜像和容器

今天,小九介绍的内容是Dockerfile和数据卷。Docker的镜像生产:通过 Dockerfile 编排镜像所需的资源。而数据卷,是Docker的数据存储方案。

下面我们开始正式的介绍~

Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令 (opens new window)和说明。

理解每个指令的用法是掌握 Docker 技术的关键

具体使用请直接阅读官方文档 (opens new window)

关于 Dockerfile,下面我们再传递几个重要的观点:

  • Dockerfile 是 Docker 运维开发工作的关键
  • Dockerfile 文件主要用于编写应用的安装过程
  • 应用的初始化过程可以在 Dockerfile 中引入,然后在独立的脚本中编写
  • Dockerfile 必须构建成镜像后再供用户使用,直接基于 Dockerfile 运行容器可能会由于网络问题导致无法达成预期目的

指令不仅仅用于设计 Docker 镜像,还有一部分指令与容器运行时密切相关,包括:

  • CMD
  • ENTRYPOINT
  • WORKDIR
  • ENV
  • USER
  • VOLUME

CMD 和 ENTRYPOINT

它们都是容器启动时运行的指令。

有如下几个关键技术点需要掌握:

  1. CMD 与 ENTRYPOINT 的区别:CMD 直接运行单条命令,ENTRYPOINT 用于运行一个脚本
  2. 指令的 Shell 和 Exec 语法模式
# Shell 模式
CMD ping localhost

# Exec 模式
CMD ["/bin/ping","localhost"] 

可见它们从写法上一种是命令行模式,一种是数组模式。

但它们不仅仅写法上不同,更重要的是运行方式不同。

  • CMD 模式相当于调用 Shell 后再运行指令,例如上面的例子实际上相当于: /bin/sh -c "ping localhost"
  • ENTRYPOINT 模式相当于直接运行指令,例如上面的例子实际上相当于: /bin/ping localhost
  1. CMD 与 ENTRYPOINT 组合使用:组合使用的时候 CMD 作为 ENTRYPOINT 的一个参数

组合使用 ENTRYPOINT 和 CMD 命令式, 确保你一定用的是 Exec 表示法. 如果用其中一个用的是Shell表示法, 或者一个是Shell表示法, 另一个是Exec表示法, 你永远得不到你预期的效果.

下表列出了如果把Shell表示法和Exec表示法混合, 最终得到的命令行, 可以看到如果有Shell表示法存在, 很难得到正确的效果:

Dockerfile    Command

ENTRYPOINT /bin/ping -c 3
CMD localhost               /bin/sh -c '/bin/ping -c 3' /bin/sh -c localhost


ENTRYPOINT ["/bin/ping","-c","3"]
CMD localhost               /bin/ping -c 3 /bin/sh -c localhost

ENTRYPOINT /bin/ping -c 3
CMD ["localhost"]"          /bin/sh -c '/bin/ping -c 3' localhost

ENTRYPOINT ["/bin/ping","-c","3"]
CMD ["localhost"]            /bin/ping -c 3 localhost

从上面看出, 只有ENTRYPOINT 和 CMD 都用 Exec 表示法, 才能得到预期的效果。

WORKDIR

ENV

USER

先看官方的定义:

The USER instruction sets the user name (or UID) and optionally the user group (or GID) to use when running the image and for any RUN, CMD and ENTRYPOINT instructions that follow it in the Dockerfile.

有几个关键信息:

  • 适用于 RUN, CMD and ENTRYPOINT 三个指令

VOLUME

对于 VOLUME 申明的目录,容器运行后会自动在 /var/lib/docker/volumes 下创建如下的匿名卷。

/var/lib/docker/volumes/b58ec6901901202b215315db8d958848d910d51dc37c781e29c133064ed5842d

当我们运行 docker-compose down 删除容器时,匿名卷不会被删除,只有运行 docker-compose down -v 才会删除这个卷。

数据卷

Docker 容器的理念是运行时,因此它并不向普通的虚拟机一样,可以方便的更改任何文件。

但用户在实际使用 Docker 的过程中,一定有持久保存数据(包含配置文件)的需求,那么 Docker 是如何解决这个问题的呢?

概述

Docker 提供了一套数据存储的方案(卷 (opens new window)):

img

主要有两种形式的存储卷模式:

Named Volumes Bind Mounts
路径 /var/lib/docker/volumes 目录下 任意位置
启用方式 my-volume:/usr/local/data /path/to/data:/usr/local/data
预先定义 可以先定义,也可以不定义 不需要
名称 my-volume_default 或 my-volume data
文件权限 权限宽松 受制于宿主机文件权限
空目录下数据方向 容器 → Named Volume Bind Volume → 容器
非空目录下数据方向 Named Volume → 容器 Bind Volume → 容器

我们根据持久化数据挂载的几种场景进行试验,得出如下的现象:

  • 容器启动后由 CMD 和 ENTRYPOINT 产生的数据区别于镜像中 COPY/ADD 层的数据,前者我们称之动态数据,后者为静态数据。显然,动态数据不受挂载影响。
  • 宿主机目录优先定律:挂载双方都有数据时,宿主机目录覆盖容器目录
  • Bind Mounts 与 Named Volumes 有差异:Bind Mounts 任何情况下都会覆盖容器目录,而 Named Volumes 挂载空目录时会先拷贝容器目录的数据

Named Volumes 在 Docker 中被推荐为首选方式,它与 Bind Mounts 相比,有以下优点:

  • 与 Bind Mounts 相比,Named Volumes 更容易备份或迁移。
  • 可以使用 Docker CLI 命令或 Docker API 来管理。
  • Named Volumes 在 Linux 和 Windows 容器上都能工作。
  • Named Volumes 可以在多个容器之间更安全的共享。
  • Named Volumes 驱动程序允许你在远程主机或云上提供存储、加密或其他功能。
  • 新 Named Volumes 的内容可以由容器预填充。

使用卷

下面是一个通过 -v 使用卷的范例:

 docker run -dp 3000:3000 \
     -w /app -v "$(pwd):/app" \
     node:12-alpine \
     sh -c "yarn install && yarn run dev"

共享卷

多个容器共享一个存储卷是非常典型的应用场景:

img

下篇内容:

  • 端口与互联:容器与宿主机、容器与容器、容器与外部的连接与通信机制
  • 用户权限:容器中的用户与宿主机的用户之间的关系

本文由Websoft9原创发布,转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容