docker 基本操作
概述
在介绍 Docker 的基本操作之前,我们先行简单介绍一下 Docker Engine
。
Docker Engine
是一个 客户端/服务器 应用,具有如下重要组件:
- 一个服务器,它是一种长期运行的程序,也称为守护进程 (daemon process)。
- 一套 REST API,实现与守护进程的通信。
- 一套命令行接口 (Command Line Interface),可实现客户端与服务器的通信。
借助于脚本或 CLI 命令,CLI 间接使用 REST API 以实现与服务器的交互 (这种间接关系也可从上图直观看到)。
日常应用之中,我们主要使用 CLI 命令。因此,在本文之中,我们简单介绍 image
、container
、registry
(Docker
的三大组成部分) 的相关操作。
两种方式可查看具体 CLI 命令:其一,网站 https://docs.docker.com/reference/ ;其二,bash 窗口下使用命令
docker xxx --help
。
image (镜像)
image
是一个只读文件,基于此可创建 container
。为方便理解,可将其视为程序代码;同样地,container
可视为程序代码运行后对应的进程。
image
对应的 CLI 命令可使用 docker image --help
进行查看:
1 | Usage: docker image COMMAND |
根据命令功能将它们分门别类,并简要介绍如下:
构建相关
build
–> 根据 Dockerfile 配置文件,构建一个image
。import
–> 根据归档文件内容,创建一个image
(export
后续会介绍)。load
–> 根据归档文件或标准输入流内容,创建一个image
。save
–> 保存一个或多个image
至标准输出流或归档文件。pull
–> 从registry
处拉取一个image
(registry
后续会介绍)。push
–> 上传一个image
至registry
。save/load
互为一组命令,保存image
至归档文件,然后加载归档文件为image
,其中归档文件不仅保有image
的具体内容,也保有image
的各种元数据、历史记录。import/export
互为一组命令,导出容器至归档文件,然后导入归档文件为image
,其中归档文件仅保存容器状态 (类似于虚拟机快照),而不保存任何额外信息。因此,相较于基于export
得到的归档文件,基于save
得到的归档文件所占容量往往偏大。查看相关
ls
–> 列举所有image
。inspect
–> 显示一个或多个image
的详细信息。history
–> 显示一个image
的历史操作记录。修改相关
tag
–> 为指定image
创建一个标签。删除相关
rm
–> 删除一个或多个image
。prune
–> 删除无用的image
(默认指代 dangling image)。官网解释:A dangling image is one that is not tagged and is not referenced by any container。我们在此说明使用过程中产生 dangling image 的一种情景:编写
image
构建脚本并运行它,我们将得到一个image
;假定修改脚本相关配置但是不修改镜像名和标签,此时再次运行脚本,我们将再次得到一个image
。此时第一个image
便成为 dangling image,使用docker image ls
命令,我们将会得到如下内容 (第一个image
所对应标识被清空,并被置为<none>
):1
2
3REPOSITORY TAG IMAGE ID ...
image 0.0.3 e5d7b72aad05 ...
<none> <none> 8e2b049f9783 ...对于
prune
命令而言,如果指定-a
参数,同样会删除未被任何容器引用的image
。
container (容器)
container
是 image
的运行实例。它对应的 CLI 命令可使用 docker container --help
进行查看:
1 | Usage: docker container COMMAND |
根据命令功能将它们分门别类,并简要介绍如下:
构建相关
create
–> 基于某个image
创建一个container
。export
–> 保存容器内容至一个归档文件。commit
–> 基于当前容器构建一个image
。运行相关
run
–> 基于某个image
创建container
,并运行它。attach
–> 链接本地标准输入、输出、错误流至一个运行的container
。exec
–> 在运行的container
中运行指定命令。start
–> 启动运行指定container
。pause
–> 暂停运行指定container
。unpause
–> 恢复运行指定container
。stop
–> 停止运行指定container
,其首先发送 SIGTERM 信号至容器,等待一段时间后,发送 SIGKILL 信号以终止容器。kill
–> 终止运行指定container
,其直接发送 SIGKILL 信号以终止容器。restart
–> 重启运行指定container
。wait
–> 阻塞运行指定container
,当容器停止运行时,将打印其退出码。查看相关
ls
–> 列举所有container
。inspect
–> 显示一个或多个container
的详细信息。logs
–> 获取指定container
的日志信息。diff
–> 检查指定container
文件系统哪些部分发生改动。port
–> 显示指定container
的端口映射信息。stats
–> 显示指定container
的资源统计信息。top
–> 显示指定container
中各运行进程信息。删除相关
rm
–> 删除一个或多个container
。prune
–> 删除已停止的container
。其他
cp
–> 在本机与指定container
间拷贝文件或文件夹。rename
–> 重命名指定container
。update
–> 更新一个或多个container
的配置信息。
容器属于 Docker 的核心组成部分,其运行往往存在众多参数可选。这些参数主要分为四类:与容器运行模式相关、与容器环境配置相关、与容器资源限制相关、安全保护相关。
下面简要介绍若干重要参数:
--detach
–> 是否后台运行容器。--interactive
–> 始终保持标准输入打开。--net
–> 指定容器所处网络。--publish-all
–> 将容器内所有暴露端口自动映射为本机临时端口。--publish
–> 将容器内指定端口映射为本机指定端口--tty
–> 是否分配一个伪终端。--volume
–> 挂载数据卷至容器。--ip
–> 指定容器的 IPV4 地址。--env
–> 指定容器内的环境变量。--name
–> 指定容器别名。--memory
–> 限制容器可使用的内存。
registry (注册服务器)
registry
是集中存放 repository
(仓库) 的地方,其中 repository
用于集中存放同类型不同版本的镜像。
registry
与repository
的关系可类比于github
与repository
的关系。
与 registry
相关的 CLI 命令具体如下:
docker search
在默认
registry
中搜索指定内容。docker pull/docker image pull
从默认
registry
处拉取一个image
。docker push/docker image push
上传一个
image
至默认registry
。
数据卷 + 网络 + Dockerfile + 容器管理/编排 + 底层原理 (涉及Linux东西,比较难)
底层原理 镜像组织、容器具体是什么、存储驱动