docker摘记-docker相关知识点总结摘要

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 intCFS 调度都总份额
-c, cpu-shares intCPU权重
-cpuset-cpus string多CPU 允许使用的CPU
-cpuset-mems string多CPU允许使用的内存
-disable-content-trust不进行镜像校验,默认为真
-f, -file stringDockerfile 名称
-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 风格的路径正则格式:
“*”表示任意多个字符;
“?”代表单个字符;
“!”表示不匹配(即不忽略指定的路径或文件)

个人blog地址:http://www.bestarnold.com/2020/01/12/book/2020-01-12-16/#more

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值