目录
一、docker存储驱动及其选择
二、使用overlay2存储驱动
三、迁移docker根目录
四、docker存储的挂载类型
五、开发docker镜像
一、docker存储驱动及其选择
(一)概述
1.docker存储驱动与联合文件系统
一联合文件系统(UnionFS)是一种为Linux、FreeBSD和NetBSD操作系统设计的,将其他文件系统合并到一个联合挂载点的文件系统。
二Docker引擎可以使用联合文件系统的多种变体
AUFS
OverlayFS
Btrfs
BFS
DeviceMapper
三联合文件系统实际上是由存储驱动实现的,相应的存储驱动有aufs、overlay、overlay2、devicemapper、btrfs、zfs、vfs等。
(二)、选择docker存储驱动的总体原则
一在最常用的场合使用具有最佳整体性能和稳定性的存储驱动。
二如果内核支持多个存储驱动,则Docker会提供要使用的存储驱动的优先级列表。
三优先使用Linux发行版默认的存储驱动。
四一些存储驱动要求使用特定格式的底层文件系统,这可能会限制选择。
五选择存储驱动还要取决于工作负载的特征和所需的稳定性级别。
(三)、主流的docker存储驱动
一对于所有当前支持的Linux发行版,overlay2存储驱动是首选。 CentOS和RHEL的最新版本现在已经支持overlay2存储驱动,并将overlay2作为推荐的存储驱动。
二对于Docker 18.06或更早的版本,aufs存储驱动是首选。
三devicemapper存储驱动用于生产环境时需要配置为direct-lvm模式。
四btrfs和zfs存储驱动对底层文件系统(backing filesystem)有用。
五vfs存储驱动用于测试,适合那些没有“写时拷贝”的文件系统。
六存储驱动的选择可能受到Docker版本、操作系统内核和发行版本的限制。
二、使用overlay2存储驱动
(一)、使用overlay2存储驱动的要求
1.docker版本要求
Docker EE 17.06.02-ee5或更高版本支持overlay2存储驱动。
虽然Docker CE版本支持overlay存储驱动,但是建议使用overlay2存储驱动。
2.Linux内核版本要求
4.0或更高版本的Linux内核。
RHEL或CentOS可使用3.10.0-514或更高版本的内核。
如果使用更低版本的内核,则可使用overlay存储驱动,但不推荐这样做。
3.底层文件系统要求
ext4。
xfs,但仅限于启用d_type的情形。
(二)、配置docker使用overlay2存储驱动
1.docker安装默认使用overlay2存储驱动的情形
从Ubuntu 14.04版本开始支持overlay2存储驱动
从CentOS 7.4版本开始,安装过程中建立的xfs文件系统开始支持d_type,安装Docker默认使用的就是overlay2存储驱动。
2.将存储驱动变更为overlay2
停止docker:systemctl stop docker
将/var/lib/docker的内容复制到一个临时位置:cp -au /var/lib/docker /var/lib/docker.bk
如果要使用一个独立于/var/lib/所用的底层文件系统,先格式化该文件系统,然后将它挂载到/var/lib/docker。确保将该挂载设置添加到/etc/fstab,使之保存下来。
编辑/etc/docker/daemon.json文件,添加以下内容:"storage-driver": "overlay2"
启动Docker:systemctl start docker
使用docker info 命令验证Docker守护进程是否正在使用overlay2存储驱动。
3.在CentOS 7版本操作系统上使用overlay2存储驱动
安装一台运行CentOS 7.0版本操作系统的计算机,并在其中安装Docker CE,默认使用的是 devicemapper存储驱动,将存储驱动变更为overlay2。
解决xfs文件系统的d_type支持问题:升级Linux内核至4.0或更高的版本,以支持overlay2存储驱动。备份/var/lib/docker,通常将/var/lib/docker的内容复制到一个临时位置。
如果Docker正在运行,则先要停止Docker运行。以下针对低于CentOS 7.4版本的情形
CentOS 7.4版本以下的操作系统版本安装时创建的xfs文件系统没有启用d_type支持,解决的办法是另外准备一块磁盘或磁盘分区,重新格式化为支持d_type的xfs格式,将该分区重新挂载到/var/lib/docker目录。
编辑/etc/docker/daemon.json文件,添加以下内容:"storage-driver": "overlay2"
重启Docker。
使用docker info 命令验证Docker守护进程是否正在使用overlay2存储驱动。
(三)、overlay2存储驱动的工作机制
1.overlayFS的镜像分层与共享
OverlayFS在单个Linux主机上分为两个代表不同层次的目录,并且对外统一呈现为单个目录
overlay2存储驱动与overlay存储驱动最本质的区别是镜像层之间共享数据的方法不同,overlay2存储驱动通过每层的lower文件,而overlay存储驱动通过硬链接
验证分析overlay2存储驱动所实现的磁盘上的镜像层
(四)、容器使用overlay2存储驱动的读写机制
1.读取文件
文件同时存在于容器层和镜像层:将读取镜像层中的文件版本。
文件已存在于容器层:如果该文件已存在于容器层中,而不在镜像层中,则直接从容器中读取。
文件不存在于容器层:如果该文件并不在容器层中,则从镜像层中读取。
三、迁移docker根目录
- Docker根目录就是Docker中存放镜像和容器的目录,默认是/var/lib/docker。
- 解决Docker根目录所在的磁盘空间饱和问题通常采用Docker根目录迁移,这适合不同的Docker存储驱动。
- 停止Docker。
- 在一个可用空间足够大的磁盘或逻辑卷中创建新的Docker存储目录。
- 迁移/var/lib/docker目录下面的文件到 /home/docker/lib目录。
- 编辑Docker服务单元文件/usr/lib/systemd/system/docker.service,在[Service]节中的ExecStart定义语句末尾增加选项--graph=/home/docker/lib。
- 重新加载systemd单元文件。
- 重新启动Docker。
- 执行docker info命令查看当前Docker的信息。
四、docker存储的挂载类型
1.docker卷与存储驱动
2.选择合适的挂载类型
- docker run命令的存储配置基本用法
- 通常使用docker run或docker create命令的相关选项来设置容器的卷或绑定挂载。
- -v(--volume)选项用于独立容器,而--mount选项用于集群服务。
- 对于tmpfs挂载,可以使用--tmpfs选项。
- 在Docker 17.06或更高版本中,建议对于所有的容器或服务,绑定挂载、卷或tmpfs挂载都使用--mount选项。
- --mount与-v两者最大的不同在于-v的用法是将所有选项组合在一个字段中,而--mount的用法是将它们分开。
五、开发docker镜像
一、了解dockerfile
1.Dockerfile是由一系列指令和参数构成的脚本文件,每一条指令构建一层。
2.镜像的定制实际上就是定制每一层所要添加的配置和文件。
3.Dockerfile的格式:
# Comment
INSTRUCTION arguments
4.INSTRUCTION表示指令,不区分大小写,建议大写。arguments表示指令的参数。
5.Dockerfile文件必须以FROM指令开头,定义构建镜像的基础镜像。
6.以“#”符号开头的行都将被视为注释。
7.Docker可使用解析器指令escape设置转义字符。
二、dockerfile常用指令
1.FROM——设置基础镜像
FROM指令的用法有以下3种格式:
FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]
2.RUN指令——运行命令
RUN指令的用法有以下两种格式:
RUN <command>
RUN ["executable", "param1", "param2"]
3.CMD指令——指定容器启动时默认执行的命令
CMD指令的用法有以下3种格式:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
4.LABEL指令——向镜像添加标记(元数据)
LABEL指令的语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
5.EXPOSE指令——声明容器运行时侦听的网络端口
EXPOSE指令的语法格式如下:
EXPOSE <port> [<port>...]
6.ENV指令——指定环境变量
ENV指令的用法有以下两种格式:
ENV <key> <value>
ENV <key>=<value> ...
7.COPY指令——将源文件复制到容器
COPY指令的用法有以下两种格式:
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
8.ADD指令——将源文件复制到容器
ADD指令的用法有以下两种格式:
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
9.ENTRYPOINT指令——配置容器的默认入口
ENTRYPOINT指令的用法有以下两种格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
10.VOLUME指令——创建挂载点
VOLUME指令的语法格式如下:
VOLUME ["/data"]
11.WORKDIR指令——配置工作目录
WORKDIR指令的语法格式如下:
WORKDIR /path/to/workdir
12.USER指令——设置运行镜像时使用的用户名
USER指令的用法有以下两种格式:
USER <user>[:<group>] or
USER <UID>[:<GID>]
13.ARG指令——定义变量
ARG指令的语法格式如下:
ARG <name>[=<default value>]
14.SHELL指令——指定命令的shell格式
SHELL指令的语法格式如下:
SHELL ["executable", "parameters"]
三、dockerflie示例
示例一:基本的nginx镜像
示例二:基于VNC的Firefox镜像
示例三:一个Dockerfile定义多个镜像
示例四:参考docker官方镜像