Docker是啥?
Docker 是基于 Go 语言实现的开源容器项目,Docker 的构想是要实现“ Build Ship and Run Any App, Anywhere ”,即通过对应用的封装( Packaging )、分发( Distribution )、部署( Deployment )、运行( Runtime )生命周期进行管理达到应用组件级别的“一次封装 ,到处运行”,Docker 也并非“从石头缝里蹦出来的”而是站在巨人的肩膀上,其中最重要的就是 Linux 容器(Linux Containers, LXC)技术.
Docker优点
更快速的交付和部署
更高效的资源利用;
更轻松地迁移和拓展;
更简单的更新管理
Docker与虚拟机的比较
Docker 容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式(数分钟)要快得多;
Docker 容器对系统资源需求很少,一台主机上可以同时运行数千个 Docker 容器(在
IBM 服务器上已经实现了同时运行! OK 量级的容器实例);
Docker 通过类似 Git 设计理念的操作来方便用户获取、分发和更新应用镜像,存储复
用,增量更新;
Docker 通过 Dockerfile 支持灵活的自动化创建和部署机制,以提高工作效率,并标准
化流程
Docker 三大核心观念
镜像(Image):类似于虚拟机镜像,看做一个只读模板,镜像是docker的基础
容器(Container):容器类似于一个轻级的沙箱,Docker 利用容器来运行和隔离应用,容器是从镜像创建的应用运行实例它可以启动、开始、停止 删除,而这些容器都是彼此相互隔离、互不可见的
仓库(Repository):仓库类似于代码仓库,是Docker集中存放镜像文件的场所.
Docker Centos安装
Docker 目前支持 CentOS 及以后的版本 系统的要求跟 Ubuntu 情况类似, 64 位操作
系统,内核版本至少为 3.10
首先,为了方便添加软件源,以及支持 devicemapper 存储类型,安装如下软件包:
$ sudo yum update
$ sudo yum instal l -y yum-utils \ device-mapper-persistent-data \ lvm2
添加Dokcker 稳定版本的 yum 软件源:
$ sudo yum-conf ig- manager \ --add-repo https : //download.docker.corn/linux/centos/ docker-ce.repo
之后更新 yum 软件源缓存,并安装 Docker:
$ sudo yum update
$ sudo yum install -y docker-ce
最后,确认 Docker 服务启动正常
$ sudo systernctl start docker
用户还可以使用官方提供的 shell 脚本来在 Linux 系统(目前支持山untu Debian Oracleserv edora Centos OpenSuse Gentoo 等常 发行版)上安装 Docker 最新正式版本,该脚本会自动检测系统信息并进行相应配置:
$ curl -fsSL https: //get.docker . corn/ I sh
或者
$ wget - qO- https://get . docker.corn/ I sh
如果想尝鲜最新功能,可以使用下面的脚本来安装最新的“尝鲜”版本 但要注意,非稳定版本往往意味着功能还不够稳定,不要在生产环境中使用
$ curl -fsSL https : //test.docker .corn/ I sh
另外, 也可以从 store docker.com/search?offering=community&q &type=edition 找到各个平台上的 Docker 安装包,自行下载使用
其他操作系统可根据官网进行下载安装
Docker 镜像常用命令
获取镜像
命令:docker [image] pull NAME [ :TAG]
NAME 是镜像仓库名称(用来区分镜像),TAG 是镜像的标签(往往用来表示版本信息)。 通常情况下, 描述一个镜像需要包括 “名称+标签“ 信息,如果不显式指定TAG, 则默认会选择la迳釭标签,这会下载仓库中最新版本的镜像。严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry, 注册服务器)作为前
缀 ,只是默认使用的是官方DockerHub服务 ,该前缀可以忽略
pull 子命令支持的 选项主要包括:
-a, --all tags=trueifalse: 是否获取仓库中的所有镜像,默认为否
–disable-conyent-trust:取消镜像的内容校验,默认为真
查看镜像信息
命令:docker images或docker image ls
可以列出本地主机上已有镜像的基本信息
images子命令主要支持如下选项, 用户可以自行进行尝试:
-a, --all true I false: 列出所有(包括临时文件)镜像文件,默认为否
–digestS=trueifalse: 列出镜像的数字摘要值,默认为否
-f, --filter=[] : 过滤列出的镜像, 如dangling 式rue 只显示没有被使用的镜像,也可指定带有特定标注的镜像等
–format=“TEMPLATE” : 控制输出格式,如. ID代表ID信息,.Repository代表仓库信息等
–no-trunc=true |false: 对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为是
-q, --quiet=true |false: 仅输出ID信息, 默认为否。
其中, 还支持对输出结果进行控制的选项,如 -f. --filter=[]、–no-trunc =true | false、 -q、 --quiet=true | false等。
更多子命令选项还可以通过mandocker-images来查看
命令:docker[image]inspect
获取该镜像的详细信息,包括制作者 、 适应架构、各层的数字摘要等
命令:docker history
获取该镜像的历史信息
搜索镜像
命令:docker search [option] keyword
搜索镜像
支持的命令选项主要包括:
-f, --filer filter: 过滤输出内容
–format string: 格式化输出内容
–limit int:限制输出结果个数,默认为 25 个
–no-trunc: 不截断输出结果
删除和清理镜像
命令:docker rmi 或 docker image rm
可以删除镜像
docker rmi IMAGE [IMAGE … ] 其中 IMAGE可以为标签或 ID
支持选项包括:
-f, -force: 强制删除镜像, 即使有容器依赖它
-no-prune: 不要清理未带标签的父镜像
命令:docker ps -a
看到本机上存在的所有容器
命令:docker image prune
来进行清理删除镜像
支待选项包括:
-a, -all: 删除所有无用镜像, 不光是临时镜像
-filler filler: 只清理符合给定过滤器的镜像
-f, -force: 强制删除镜像, 而不进行提示确认
创建镜像
命令:docker [container] commit [OPTIONS] CONTAINER [REPOSITORY [:TAG]]
基于已有容器创建镜像
主要选项包括:
-a, --author="": 作者信息
-c, --change=[] : 提交的时候执行Dockerfile指令, 包括 CMDIENTRYPOINT 但NVIEXPOSEILABELIONBUILDIUSERIVOLUMEIWORKDIR等
-m, --message= “”: 提交消息
-p, --pause式rue: 提交时暂停容器运行
命令: docker [image] i mport [OPTIONS] filelURLl -[REPOSITORY [:TAG] ]
基于本地模板导入镜像
基于dockerfile创建镜像,可在官网了解相关知识点
存出和载人镜像
命令:docker [image ] save docker [image ] load
来存出和载人镜像
命令:docker [image] push [:TAG] | [REGISTRY_HOST [ :REGISTRY_PORT] / ]NAME [:TAG]
上传镜像到仓库,默认上传到 Docker Hub 官方仓库(需要登录)
Docker 容器常用命令
创建容器
命令:docker [container] create
命令新建一个容器,使用 docker [container] create 命令新建的容器处于停止状态,可以使用 docker[container] start 命令来启动它,create命令较为强大,可以看相关文档地址:https://docs.docker.com/engine/reference/commandline/create/
命令: docker [container] start
来启动一个已经创建的容器
命令:docker ps
可以查看到运行中的容器
命令: docker [container ]run
新建并启动容器
等价于先执行 docker [container] create 命令,再执行 docker [container] start 命令,
Docker 在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建一个容器,并启动该容器
分配 个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从网桥的地址池配置一个 IP 地址给容器
执行用户指定的应用程序
执行完毕后容器被自动终止
命令:docker [container] logs
查看容器输出信息
该命令支持的选项包括:
-details 打印详细信息;
-f, follo :持续保持输出;
一since string :输出从某个时间开始的日志;
-tail string 输出最近的若干日志;
-t, timestamps 显示时间戳信息
-until string 输出某个时间之前的日
停止容器
命令:docker [container] pause CONTAINER [CONTAINER …]
暂停一个运行中的容器
命令:docker [contai er pause CONTAINER [CONTAINER …]
来恢复到运行状态
命令:docker [container] stop [-t I - -time [=10]] [CONTAiNER …]
来终止一个运行中的容器,该命令会首先向容器发送 SIGTERM 信号,等待一段超时时间后(默认为 10 秒),再发
SIGKLL 信号来终止容器
命令:docker container prune
会自动清除掉所有处于停止状态的容器
命令:docker [container] kill
直接发送 SIGKILL 信号来强行终止容器
命令:docker ps -qa
查看到所有容器的ID
命令:docker [container] start
重新启动容器
命令:docker [container] restart
命令会将一个运行态 的容器先终止,然后再重新启动
进入容器
命令:docker [container] attach [–detach-keys[;[]]] [–no-stdin] [–sig-proxy[;true]] CONTAINER
命令支持三个主要选项:
-- detach-keys [=[]]:指定退出 attach 模式的快捷键序列, 默认是 CTRL-p CTRL-q;
-- no-stdin=trueifalse :是否关闭标准输入,默认是保持打开
-- sig-proxy=truelfalse :是否代理收到的系统信号给应用进程,默认为 true
命令:docker [container] exec [-d|-detach] [ detach-keys[=[]]] [-i|–interactive] [ --privileged] [-t|–tty] [-u|user [=USER]] CONTAINER COMMAND [ARG . . . ]
比较重要的参数有:
- d, --detach 在容器中后台执行命令
-- detach-keys ="":指定将容器切回后台的按键
- e, - - env= []:指定环境变量列表
- i, --interactive=true | false :打开标准输入接受用户输入命令, 默认值为false
-- privileged=true|false 是否给执行命令以高权限,默认值为 false
- t, --tty=true|false 分配伪终端,默认值为 false
- u, --user ="":执行命令的用户名或 ID
删除容器
命令:docker [container) rm [-f|-- force) [-1|-link] [-v|–volumes] CONTAINER [CONTAINER …]
支持的选项包括
- f, --force=false 是否强行终止并删除一个运行中的容器
- 1, --link=false :删除容器的连接 ,但保留容器
- v, --volumes=false :删除容器挂载的数据卷
导人和导出容器
命令:docker [container) export [-o|–output [=””] ] CONTAINER
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态
-o 选项来指定导出的tar 文件名,也可以直接通过重定向来实现
命令:docker import [-c|–change[=[]]] [-m|–message[=MESSAGE]] file|URL|-[REPOSITORY [:TAG]]
导入容器
查看容器
命令:用 docker container inspect [OPTIONS] CONTAINER [CONTAINER . … ]
查看容器详情
命令:docker [container] top [OPTIONS] CONTAINER [CONTAINER…]
查看容器内进程
命令:docker [container] stats [OPTIONS] [CONTAINER … ]
查看统计信息,会显示 CPU 、内存、存储、网络等使用情况的统计信息
支持选项包括
- a, -all :输出所有容器统计信息,默认仅在运行中
- format string :格式化输出信息
- no-stream :不持续输出,默认会自动更新持续实时结果
- no-trunc :不截断输出信息
其他容器命令
命令格式为 docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
复制文件
支持的选项包括
- a, -ar chive :打包模式,复制文件会带有原始的 uid/gid 信息
- L, -follow-link :跟随软连接。当原路径为软连接时\默认只复制链接信息,使用该选项会复制链接的目标内容
命令: docker [container] diff CONTAINER
查看变更
命令:docker container port CONTAINER [PRIVATE_PORT[/PROTO ]]
查看端口映射
命令:docker [container] update [OPTIONS] CONTAINER [CONTAINER …]
支持的选项包括:
-blkio-weight uintl6 :更新块 IO 限制, 10 1000 ,默认值为 ,代表着无限制
- cpu-period int :限制 CPU 调度器 CFS (Completely Fair Scheduler )使用时间,单位为微秒,最小 1000
- cpu-quota int :限制 CPU 调度器 CFS 配额,单位为微秒,最小 1000
- cpu-rt period int :限制 CPU 调度器的实时周期,单位为微秒
- cpu-rt runtime int :限制 CPU 调度器的实时运行时,单位为微秒
- c, -cpu-shares in 限制 CPU 使用份额
- cpus decimal :限制 CPU 个数
- cpuset-cpus string :允许使用的 CPU 核,如 0-3, 0,1
- cpuset mems string :允许使用的内存块,如 0-3’ 0, 1
- kernel-memor bytes :限制使用的内核内存
- m, -memory bytes 限制使用的内存
-memory-reservation bytes :内存软限制
-memory-swap bytes :内存加上缓存区的限制, 表示为对缓冲区无限制
- restart stri 口g 容器退出后的重启策略
Docker仓库
**仓库(Repository)**是集中存放镜像的地方,又分公共仓库和私有仓库
Docker Hub 公共镜像市场
Docker Hub Docker 官方提供的最大的公共镜像仓库,目前包括了超过 100 000
像,地址为 https: //hub.docker.com
Docker数据管理
容器中的管理数据主要有两种方式
数据卷 Data Volumes) 容器内数据直接映射到本地主机环境;
数据卷容器(Data Volume Containers) 使用特定容器维护数据卷
数据卷
数据卷 Data Volumes 是一个可供容器使用的特殊目录,它将主机操作系统目录直接
映射进容器,类似于 Linux 中的 mout 行为
数据卷可以提供很多有用的特性
数据卷可以在容器之间共事和重用,容器间传递数据将变得高效与方便
对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
对数据卷的更新不会影响镜像,解摘开应用和数据会一直存在 ,直到没有容器使用,可以安心地卸载它
创建数据卷
命令:docker volume create
绑定数据卷
命令:docker [container] run口命令的时候,可以使用 mount 选项来使用数据卷
mount 项支持三种类型的数据卷,包括
volume 普通数据卷,映射到主机/var/ lib /docke /vo lumes 径下
bind :绑定数据卷,映射到主机指定路径下
tmpfs :临时数据卷,只存在于内存中
数据卷容器
命令:docker run -it --volumes-from dbdata --name dbl ubuntu
可以在其他容器中使用-- volumes-from 来挂载 dbdata 容器中的数据卷,例如如创建 dbl db2 两个容器,并从 dbdata 容器挂载数据卷
命令:docker rm -v
删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用此命令,指定同时删除关联的容器
利用数据卷容器来迁移数据
命令:docker run -volumes-from dbdata -v $ (pwd) : /backup - -name worker ubuntu tar
cvf /backup/backup.tar /dbdata
利用 buntu 镜像创建了 个容器 worker 使用- -volumes-from dbdata 参数
来让 worker 容器挂载 db data 容器的数据卷( dbdata 数据卷);使用- $ (pwd) : /backup
参数来挂载本地的当前目录到 worke 容器的/backup
worker 容器启动后,使用 tar cvf /backup/backup.tar /dbdata 令将/dbdata
下内容备份为容器内的/backup/backup. tar ,即宿主主机当前目录下的 backup.tar
命令:docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
docker run --volumes-from dbdata2 -v $(pwd) :/backup busybox tar xvf
/backup/backup.tar
首先创建一个带有数据卷的容器 bdata2:,然后创建另一个新的容器,挂载 dbdata2 容器,并使用 untar 解压备份文件到所挂载的容器卷中
端口映射与容器互联
命令:docker run -d -P training/webapp python app.py
当容器中运行一些网络应用, 要让外部访问这些应用时, 可以通过-P或-p参数来指定端口映射。 当使用平(大写的)标记时, Docker 会随机映射一个 49000-49900 的端口到内部容器开放的网络端口,-p (小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定 一个容器。支持的格式有IP:HostPort:ContainerPortI IP:: ContainerPort I HostPort:ContainerPort
命令;docker run -d -p 5000:5000 training/webapp python app.py
使用HostPort: ContainerPot格式本地的5000端口映射到容器的5000端口
多次使用-p标记可以绑定多个端口。例如:docker run -d -p 5000:5000 -p 3000:80 training/webapp py thon app.py
命令:docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
可以使用IP:HostPort: ContainerPort格式指定映射使用一个特定地址,比如
localhost地址127.0.0.1
命令: docker run -d -p 127.0.0.1::5000 training/webapp python app.py
使用IP::ContainerPort绑定localhost的任意端口到容器的5000端口,本地主机
会自动分配一个端口:还可以使用udp标记来指定 udp端口:
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp PY七hon app.py
命令: docker port nos talgic_rnorse 5000
使用docker port来查看当前映射的端口配置,也可以查看到绑定的地址
互联机制实现便捷互访
**容器的互联(Iinking)**是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容
器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址
命令:docker run -d -P --name web training/webapp python app.py
使用–name标记可以为容器自定义命名
命令:docker run -d -P --name web --link db:db taining/webapp python app.py
创建一个新的web容器,并将它连接到db容器,db容器和web容器建立互联关系。
–link参数的格式为–link name: alias, 其中name是要链接的容器的名称 ,alias是别名
使用Dockerfile创建镜像
Dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像
基本结构
Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行。一般而言,
Dockerfile 主体内容分为四部分:基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令
下面就是一个例子
#This dockerfile uses the ubuntu image
#VERSION 2 - EDITION 1
#Author: docker_user
#Command format: Instruction [arguments / command] ..
#1、第一行必须指定 基础镜像信息
FROM ubuntu
#2、维护者信息
MAINTAINER docker_user docker_user@email.com
#3、镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
#4、容器启动执行指令
CMD /usr/sbin/nginx
首行可以通过注释来指定解析器命令, 后续通过注释说明镜像的相关信息。 主体部分首
先使用FROM指令指明所基于的镜像名称, 接下来一般是使用LABEL指令说明维护者信息。
后面则是镜像操作指令, 例如RUN指令将对镜像执行跟随的命令。 每运行一条RUN指令,
镜像添加新的一层, 并提交。 最后是CMD指令, 来指定运行容器时的操作命令
指令说明
Dockerfile 中指令的一般格式为 INSTRUCTION arguments, 包括 “配置指令" (配置
镜像信息)和 “操作指令" (具体执行操作), 参见下表
Dockerfile中的指令及说明
分 类 指 令 说 明
分类 | 指令 | 说明 |
---|---|---|
配置指令 | ARG | 定义创建镜像过程中使用的变簸 |
配置指令 | FROM | 指定所创建镜像的基础镜像 |
配置指令 | LABEL | 为生成的镜像添加元数据标签信息 |
配置指令 | EXPOSE | 声明镜像内服务监听的端口 |
配置指令 | ENV | 指定环境变抵 |
配置指令 | ENTRYPOINT | 指定镜像的默认入口命令 |
配置指令 | VOLUME | 创建一个数据卷挂载点 |
配置指令 | USER | 指定运行容器时的用户名或UID |
配置指令 | WORKDIR | 配置工作目录 |
配置指令 | ONBUILD | 创建子镜像时指定自动执行的操作指令 |
配置指令 | STOPSIGNAL | 指定退出的信号值 |
配置指令 | HEALTH CHECK | 配置所启动容器如何进行健康检查 |
配置指令 | SHELL | 指定默认shell类型 |
操作指令 | RUN | 运行指定命令 |
操作指令 | CMD | 启动容器时刻指定默认执行程序 |
操作指令 | ADD | 添加内容到镜像 |
操作指令 | COPY | 复制内容到镜像 |
配置指令
ARG
定义创建镜像过程中使用的变量。
格式为 ARG <name>[=<default value>]
在执行 docker build 时, 可以通过 -build-arg[=] 来为变量赋值。 当镜像编译成
功后, ARG 指定的变量将不再存在 (ENV 指定的变量将在镜像中保留)
Docker 内置了一些镜像创建变量, 用户可以直接使用而无须声明, 包括(不区分大小
写) HTTP PROXY 、 HTTPS PROXY 、 FTP PROXY 、 NO PROXY
FROM
指定所创建镜像的基础镜像
格式为:FROM <image> [AS <name>]
或 FROM <image>: <tag> [AS <name>]
或FROM <image>@<digest> [AS <name>]
任何 Dockerfile 中第一条指令必须为FROM 指令。 并且, 如果在同一个Dockerfile 中创
建多个镜像时, 可以使用多个 FROM 指令(每个镜像一次)
为了保证镜像精简, 可以选用体积较小的镜像如Alpine或Debian 作为基础镜像。 例如:
ARG VERSION=9.3
FROM debian:${VERSION}
LABEL
LABEL 指令可以为生成的镜像添加元数据标签信息。 这些信息可以用来辅助过滤出特
定镜像。
格式为: LABEL <key>=<value> <key>=<value> <key>=<value> ...
例如:
LABEL version="l.0.0-rc3"
LABEL author="yeasy@github" date="2020-01-01"
LABEL description="This 七ex七 illustra七es\
that label-values can span mul七iple lines."
EXPOSE
声明镜像内服务监听的端口
格式为 EXPOSE <part> [<part/<protocol>... ]
例如:
EXPOSE 22 80 8443
注意该指令只是起到声明作用, 并不会自动完成端口映射
如果要映射端口出来, 在启动容器时可以使用 -P 参数 (Docker 主机会自动分配一个宿主
机的临时端口)或-p HOST_PORT:CONTAINER_PORT 参数(具体指定所映射的本地端口)
ENV
指定环境变量, 在镜像生成过程中会被后续RUN指令使用, 在镜像启动的容器中也会存在
格式为 ENV <key> <value>或ENV <key>=<value>
例如:
ENV APP VERSION=l.0.0
ENV APP_HOME=/usr/local/app
ENV PATH $PATH:/usr/local/bin
指令指定的环境变量在运行时可以被覆盖掉, 如
docker run --env <key>=<value> built_image
注意当一条 ENV 指令中同时为多个环境变量赋值并且值也是从环境变量读取时, 会为
变量都赋值后再更新。 如下面的指令, 最终结果为
keyl=valuel key2=value2:
ENV keyl;value2
ENV keyl;valuel key2;${keyl)
ENTRYPOINT
指定镜像的默认入口命令, 该入口命令会在启动容器时作为根命令执行, 所有传人值作
为该命令的参数
支持两种格式:
ENTRYPOINT ["executable", "paraml ", "param2"]: exec 调用执行
ENTRYPOINT command param 1 param2: shell 中执行
此时, CMD指令指定值将作为根命令的参数。
每个 Dockerfile 中只能有一个 ENTRYPOINT, 当指定多个时, 只有最后一个起效。
在运行时, 可以被 --entrypoint 参数覆盖掉, 如 docker run --entrypoint
VOLUME
创建一个数据卷挂载点。
格式为 VOLUME ["/data]
运行容器时可以从本地主机或其他容器挂载数据卷, 一般用来存放数据库和需要保持的
数据等。
USER
指定运行容器时的用户名或urn, 后续的RUN等指令也会使用指定的用户身份
格式为 USER daemon
当服务不需要管理员权限时,可以通过该命令指定运行用户, 并且可以在 Dockerfile
建所需要的用户 例如:
RUN groupadd -r postgres && useradd --no-log-init -r -g postgres postgres
要临时获取管理员权限可以使用 gosu 命令
WORKDIR
为后续的 RUN CMD ENTRYPO INT 指令配置工作目录
格式为 WORKDIR path /to/workd ir
可以使用多个 WORKDIR 令,后续命令 果参数是相对路径, 会基于之前命令指定
的路径 例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最终路径为/a/b/c
此,为了避免出错,推荐 WORKDIR 指令中只使用绝对路
ONBUILD
指定当基于所生成镜像创建子镜像时,自动执行的操作指
格式为 ONBUILD [INSTRUCTION]
例如,使用如下的 Dockerfile 创建父镜像 Parent Imag ,指定 ONBUILD
#Dockerfile for Parentimage
[...]
ONBUILD ADD . / app/src
ONBUILD RUN /usr / local/bin/python build --dir / app/src
[ ... ]
使用 docker build 命令创建子镜像 hild Image 时( FROM Parentimage ),会首
先执行 Parent mage 配置的 ONBUI LD
Dockerfile for Childimage
FROM Parenti mage
等价于在 Childimage Dockerfi 中添加了如下指令
#Automatically run the following when building Ch ldimage
. / app/src
RUN /usr/ ocal/ bin python-bu ld --dir /app/src
由于 ONBUILD 指令是隐式执行的,推荐在使用它的镜像标签中进行标注, 例如 ruby:2.lbuild
ONBUILD 指令在创建专门用于自动编译、检查等操作的基础镜像时,十分有用
STOPSIGNAL
指定所创建镜像启动的容器接收退出的信号值
STOPSIGNAL signal
HEALTHCHECK
配置所启动容器如 进行健康检查(如 判断健康与否),自 Docker 1.12 开始支持
格式有两种
HEALTH HEC [OPTI ONS] CMD comma nd :根据所执行命令返回值是否为
判断
HEALTHCHEC NONE :禁 基础镜像中的健康检查
OPTION 支持如下参数
-interva DURAT (d e fault: 30s ):过多久检查一次
-timeout=DURATION (default: 30s 每次检查等待结果的超时
-retries (de fault : 3):如果失败了,重试几次才最终确定失败
SHELL
指定其他命令使用 she ll 时的默认 she ll 类型:SHELL [” executable ”,”parameters”]
默认值为 "/ bin/sh "
操作指令
RUN
运行指定命令
格式为 RUN <co mand >或 RUN [ "executable " , ” paraml ” , param2]
意后者指令会被解析为 JSON 数组,因此必须用双引号 前者默认将在 shell 终端中运行命
令,即/ bin /sh -c 后者则使用 exec 执行,不会启动 shell 环境
指定使用其他终端类型可以通过第二种方式实现,例如 RUN [”/bin/bash" , ” - C ” echo h e llo ”]
每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像层 当命令较长时
可以使用\来换行 例如:
RUN apt-get update \
&& apt-get install -y libsnappy-dev zliblg-dev libbz2-dev \
&& rm -rf /var/cache/apt \
&& rm rf /var/lib/apt/lists/*
CMD
CMD 指令用来指定启动容器时默认执行的命令
支持三种格式:
CMD [executable ",” paraml param2 ']
:相当于执行 executable param 1 param2 ,推荐方式;
CMD command paraml param2
:在默认的 Shell 中执行,提供给需要交互的应用;
CMD [”paraml ”,” param2
:提供给 ENTRYPOINT 的默认参数
每个 Dockerfile 只能有 CMD 命令 如果指定了多条命令,只有最后一条会被执行
如果用户启动容器时候手动指定了运行的命令(作为 run命令的参数),则会覆盖掉
CMD 指定的命令
ADD
添加内容到镜像
格式为 ADD <SrC> <dest>
该命令将复制指定的< SrC >路径下内容到容器中的<dest >路径下
其中< SrC >可以是 Dockerfile 所在目录的一个相对路径(文件或目录);也可以是一个
URL ;还可以是一个 tar 文件(自动解压为目录) <dest >可以是镜像内绝对路径,或者相
对于工作目录(WORK.DIR )的相对路径
路径支持正则格式,例如:
ADD *.c /code/
COPY
复制内容到镜像
格式为 COPY <SrC> <dest>
复制本地主机的< SrC> (为 Dockerfile 所在目录的相对路径,文件或目录)下内容到镜
像中的<dest >。目标路径不存在时,会自动创建路径同样支持正则格式
COPY与ADD指令功能类似,当使用本地目录为源目录时,推荐使用 COPY
创建镜像
编写完成 Docker file 之后,可以通过 docker [image] build
命令来创建镜像
基本的格式为 docker build [OPTIONS] PATH [ URL I -
该命令将读取指定路径下(包括子目录)的 Dockrfile ,并将该路径下所有数据作为上下
文( Context )发送给 Docker 服务端 Docker 服务端在校验 Dockerfile 格式通过后,逐条执行
其中定义的指令,碰到 ADD COPY RUN 指令会生成 层新的镜像 最终如果创建镜像成功,会返回最终镜像的 ID
命令选项
选项 | 说明 |
---|---|
-add-host list | 添加自定义的主机名到IP映射 |
-build-arg list | 添加创建时的变量 |
-cache-from strings | 使用指定镜像作为缓存源 |
-cgroup-parent string | 继承的上层 cgroup |
-compress | 使用gzip来压缩创建上下文数据 |
-cpu-period int | 分配的 CFS 调度器时长 |
cpu-quota int | CFS 调度都总份额 |
-c, cpu-shares int | CPU权重 |
-cpuset-cpus string | 多CPU 允许使用的CPU |
-cpuset-mems string | 多CPU允许使用的内存 |
-disable-content-trust | 不进行镜像校验,默认为真 |
-f, -file string | Dockerfile 名称 |
-force-rm | 总是删除中间过程的容器 |
-iidfile string | 将镜像ID写入到文件 |
-isolation string | 容器的隔离机制 |
-label list | 配置镜像的元数据 |
-m,-memory bytes | 限制使用内存盘 |
memory-swap bytes | 限制内存和缓存的总盐 |
-network string | 指定RUN命令时的网络模式 |
-no-cache | 创建镜像不适用缓存 |
-platform string | 指定平台类型 |
-pull | 总是尝试获取镜像的最新版本 |
-q, -quiet | 不打印创建过程中的日志信息 |
-rm | 创建成功后自动删除中间过程容器,默认为真 |
-security-opt strings | 指定安全相关的选项 |
-shm-size bytes | /dev/shm 的大小 |
-squash | 将新创建的多层挤压放入到一层 |
-stream | 持续获取创建的上下文 |
-t, -tag list | 指定镜像的标签列表 |
target string | 指定创建的目标阶段 |
-ulimit ulmit | 指定 ulimit 的配置 |
选择父镜像
大部分情况下,生成新的镜像都需要通过 FROM 指令来指定父镜像 父镜像是生成镜像
的基础,会直接影到所生成镜像的大小和功能,用户可 选择两种镜像作为父镜像,一种是所谓的基础镜像( baseiage ),另外一种普通的镜像(往往由第三方创建,基于基础镜像)镜像较特殊,其 Dockerfile 中往往不存在指令,或者基于 scratch 镜像(FROM scratch ),这意味着其在整个镜像树中处于根的位置
下面的 Dockerfile定义了 个简单的基础镜像,将用户提前编译好的二进制 可执行文件binary到镜像中,运行容器 执行 inary 命令:
FROM scratch
ADD binary /
CMD ["binary"]
普通镜像也可以作为父镜像来使用, 括常见的 busybox debian ubuntu
使用 dockerigno 文件
通过 .dockerignore文件(每一行添 一条匹配模式)来让 Docker忽略匹配路径或或文件,在建镜像时候不将无关数据发送到服务端
dockerignore 文件中模式语法支持 Golang 风格的路径正则格式:
“*”表示任意多个字符;
“?”代表单个字符;
“!”表示不匹配(即不忽略指定的路径或文件)