共计 2964 个字符,预计需要花费 8 分钟才能阅读完成。
在前文,咱们介绍了 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
它们都是容器启动时运行的指令。
有如下几个关键技术点须要把握:
- CMD 与 ENTRYPOINT 的区别:CMD 间接运行单条命令,ENTRYPOINT 用于运行一个脚本
- 指令的 Shell 和 Exec 语法模式
# Shell 模式
CMD ping localhost
# Exec 模式
CMD ["/bin/ping","localhost"]
可见它们从写法上一种是命令行模式,一种是数组模式。
但它们不仅仅写法上不同,更重要的是运行形式不同。
- CMD 模式相当于调用 Shell 后再运行指令,例如下面的例子实际上相当于:/bin/sh -c “ping localhost”
- ENTRYPOINT 模式相当于间接运行指令,例如下面的例子实际上相当于:/bin/ping localhost
- 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)):
次要有两种模式的存储卷模式:
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"
共享卷
多个容器共享一个存储卷是十分典型的利用场景:
下篇内容:
- 端口与互联:容器与宿主机、容器与容器、容器与内部的连贯与通信机制
-
用户权限:容器中的用户与宿主机的用户之间的关系
本文由 Websoft9 原创公布,转载请注明出处。