目录
一、Docker存储
1、主流的Docker存储驱动
对于所有当前支持的Linux发行版,overlay2存储驱动是首选。 CentOS和RHEL的最新版 本现在已经支持overlay2存储驱动,并将overlay2作为推荐的存储驱动。
对于Docker 18.06或更早的版本,aufs存储驱动是首选。
devicemapper存储驱动用于生产环境时需要配置为direct-lvm模式。
btrfs和zfs存储驱动对底层文件系统(backing filesystem)有用。
vfs存储驱动用于测试,适合那些没有“写时拷贝”的文件系统。
存储驱动的选择可能受到Docker版本、操作系统内核和发行版本的限制。
2、Docker存储驱动所支持的底层文件系统
3、添加挂载卷-v或--mount选项
-v选项
-v选项的语法: -v [host-src:]container-dest[:<options>]
对于命名卷,第1个字段是卷的名称,并且在指定主机上是唯一的。对于匿名卷,第1个字段被省略。
第2个字段container-dest是容器中被挂载的文件或目录的路径,必须采用绝对路径的形式。
第3个字段是可选的,是一个逗号分隔的选项列表。
--mount选项
--mount选项的语法: --mount <key>=<value>,<key>=<value>,……
--mount选项的语法比-v的更冗长,但键的顺序并不重要,并且键值更易于理解。
type:要挂载的类型,值可以是bind、volume或tmpfs。
source(或src):要挂载的源,对于命名卷,这里是卷的名字。匿名卷忽略该字段。
destination(或dst、target):要挂载的目的地,必须采用绝对路径的形式。
readonly:只读选项,表示卷以只读方式挂载到容器中。
volume-opt:卷选项,可以被多次指定,由包含选项名和值的键值对组成。
示例:
使用--mount选项的实现:
docker run -d --name devtest --mount source=myvol2,target=/app nginx:latest
改用-v选项的实现:
docker run -d --name devtest -v myvol2:/app nginx:latest
4、创建和管理卷、及删除卷
创建卷:
docker volume create my-vol
列出当前的卷(列出卷驱动和卷名称)
docker volume ls
查看卷的详细信息
docker volume inspect my-vol
删除卷
docker volume rm my-vol
删除所有卷
docker volume prune
二、Dockerfile常用指令
1、FROM指令——设置基础镜像
FROM指令的用法有以下3种格式:
FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]
FROM指令为后续指令设置基础镜像,可以在同一个Dockerfile文件中多次出现,以创建多个镜像层。
image参数指定任何有效的镜像,特别是可以从公有仓库拉取的镜像。
FROM指令AS <name>是可选的,可以用来对此构建阶段指定一个名称。
tag或digest的值是可选的。如果省略其中任何一个,构建器将默认使用latest。
2、RUN指令——运行命令
RUN指令的用法有以下两种格式:
RUN <command>
RUN ["executable", "param1", "param2"]
第1种是shell格式,命令在shell环境中运行。
第2种是exec格式,不会启动shell环境。
RUN指令将在当前镜像顶部的新层中执行命令,并提交结果。
exec格式可以避免shell字符串转换。
shell格式中的默认shell可以使用SHELL命令来更改。
3、CMD指令——指定容器启动时默认执行的命令
CMD指令的用法有以下3种格式:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
第1种是首选的exec格式。
第2种提供给ENTRYPOINT指令的默认参数。
第3种是shell格式。
一个Dockerfile文件中若有多个CMD指令,则只有最后一个CMD有效。
CMD指令的主要目的是为运行中的容器提供默认值。
4、LABEL指令——向镜像添加标记(元数据)
LABEL指令的语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
每个标记(元数据)以键值对的形式表示。要在其中包含空格,应使用引号和反斜杠。
一个镜像可以有多个标记。可以将多个标记合并到单个LABEL指令中以减少层数。
基础镜像或父镜像中包含的标记会被镜像继承。
5、EXPOSE指令——声明容器运行时侦听的网络端口
EXPOSE指令的语法格式如下:
EXPOSE <port> [<port>...]
EXPOSE指令通知Docker容器在运行时侦听指定的网络端口。
EXPOSE指令不会发布该端口,只是起到声明作用。
6、ENV指令——指定环境变量
ENV指令的用法有以下两种格式:
ENV <key> <value>
ENV <key>=<value> ...
ENV指令以键值对的形式定义环境变量。
第1种格式将单个变量设置为一个值。
第2种格式允许一次设置多个变量,可以使用等号(=),而第1种形式不使用。
7、COPY指令——将源文件复制到容器
COPY指令的用法有以下两种格式:
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
--chown选项只能用于构建Linux容器,不能在Windows容器上工作。
COPY指令将指定的源路径(由<src>参数指定)的文件或目录复制到容器文件系统中指定的目的路径(由<dest>参数指定)。
可以指定多个源路径,但文件和目录的路径将被视为相对于构建上下文的源路径。
目的路径是绝对路径,或者是相对于工作目录(由WORKDIR指令指定)路径。
8、ADD指令——将源文件复制到容器
ADD指令的用法有以下两种格式:
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
它与COPY指令的功能基本相同,不同之处有两点:
源可以使用URL指定。
归档文件在复制过程中能够被自动解压缩。
如果源是具有可识别的压缩格式的本地Tar归档文件,则将其解包为目录。来自远程URL的资源不会被解压缩。
9、ENTRYPOINT指令——配置容器的默认入口
ENTRYPOINT指令的用法有以下两种格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
第1种是首选的exec格式。
第2种是shell格式。
ENTRYPOINT指令用于配置容器运行的可执行文件。
在Dockerfile中只有最后一个ENTRYPOINT指令会起作用。
10、VOLUME指令——创建挂载点
VOLUME指令的语法格式如下:
VOLUME ["/data"]
VOLUME指令创建具有指定名称的挂载点,并将其标记为从本机主机或其他容器保留外部挂载的卷。
11、WOKDIR指令——配置工作目录
WORKDIR指令的语法格式如下:
WORKDIR /path/to/workdir
WORKDIR指令为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。
可以在一个Dockerfile文件中多次使用该指令。
12、USER指令——设置运行镜像时使用的用户名
USER指令的用法有以下两种格式:
USER <user>[:<group>] or
USER <UID>[:<GID>]
USER指令设置运行镜像时使用的用户名(或UID)和可选的用户组(或GID)。
用户没有主要组时,镜像(或下一条指令)将以root组的身份运行。
13、ARG指令——定义变量
ARG指令的语法格式如下:
ARG <name>[=<default value>]
ARG指令定义一个变量(可称为构建时变量)。
一个Dockerfile文件可以包括一个或多个ARG指令。
14、SHELL指令——指定命令的shell格式
SHELL指令的语法格式如下:
SHELL ["executable", "parameters"]
SHELL指令用于指定命令的shell格式以覆盖默认的shell。
SHELL指令可以多次出现。每个SHELL指令覆盖所有先前的SHELL指令,并影响所有后续指令。
15、Dockerfile指令的exec和shell格式
RUN、CMD和ENTRYPOINT指令都会用到这两种格式。
exec格式的一般用法如下:
<指令> ["executable", "param1", "param2", ...]
采用exec格式要使用环境变量。
shell 格式一般用法如下:
<指令> <command>
指令执行时shell格式底层会调用/bin/sh -c 来执行命令。
CMD和ENTRYPOINT指令首选exec格式。RUN指令则选择两种格式都可以。
exec格式作为JSON数组解析,必须在单词之外使用双引号而不是单引号。
三、构建使用DockerFile实例
基于couchbase/centos7-systemd创建dockerfile,实现安装nginx并访问测试页面
1建立目录并准备所需文件:
[root@bogon ~]# mkdir dockerfile && cd dockerfile
[root@bogon dockerfile]# echo "test" > index.html
2.编写Dockerfile文件:
[root@bogon dockerfile]# vim Dockerfile
FROM couchbase/centos7-systemd
RUN yum -y install nginx
EXPOSE 80
COPY index.html /usr/share/nginx/html/
ENTRYPOINT ["nginx","-g","daemon off;"]
3.使用Docker build命令构建镜像
[root@bogon dockerfile]# docker build -t nginx:v1 .
4.启动并测试
[root@bogon dockerfile]# docker run -itd -p 80:80 nginx:v1
10d130a04cc5dd2072dbb30c82f81b4d10c716d1ca2f24a06f77159ed36e8f54
[root@bogon dockerfile]# docker ps -a
5.访问测试页面