docker 基本操作

概述

在介绍 Docker 的基本操作之前,我们先行简单介绍一下 Docker Engine

Docker Engine 是一个 客户端/服务器 应用,具有如下重要组件:

  • 一个服务器,它是一种长期运行的程序,也称为守护进程 (daemon process)。
  • 一套 REST API,实现与守护进程的通信。
  • 一套命令行接口 (Command Line Interface),可实现客户端与服务器的通信。

借助于脚本或 CLI 命令,CLI 间接使用 REST API 以实现与服务器的交互 (这种间接关系也可从上图直观看到)。

日常应用之中,我们主要使用 CLI 命令。因此,在本文之中,我们简单介绍 imagecontainerregistry (Docker 的三大组成部分) 的相关操作。

两种方式可查看具体 CLI 命令:其一,网站 https://docs.docker.com/reference/ ;其二,bash 窗口下使用命令 docker xxx --help

image (镜像)

image 是一个只读文件,基于此可创建 container。为方便理解,可将其视为程序代码;同样地,container 可视为程序代码运行后对应的进程。

image 对应的 CLI 命令可使用 docker image --help 进行查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Usage:  docker image COMMAND

Manage images

Commands:
build Build an image from a Dockerfile
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Display detailed information on one or more images
load Load an image from a tar archive or STDIN
ls List images
prune Remove unused images
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

根据命令功能将它们分门别类,并简要介绍如下:

  • 构建相关

    build –> 根据 Dockerfile 配置文件,构建一个 image

    import –> 根据归档文件内容,创建一个 image (export 后续会介绍)。

    load –> 根据归档文件或标准输入流内容,创建一个 image

    save –> 保存一个或多个 image 至标准输出流或归档文件。

    pull –> 从 registry 处拉取一个 image (registry 后续会介绍)。

    push –> 上传一个 imageregistry

    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
    3
    REPOSITORY   TAG        IMAGE ID      ...
    image 0.0.3 e5d7b72aad05 ...
    <none> <none> 8e2b049f9783 ...

    对于 prune 命令而言,如果指定 -a 参数,同样会删除未被任何容器引用的 image

container (容器)

containerimage 的运行实例。它对应的 CLI 命令可使用 docker container --help 进行查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Usage:  docker container COMMAND

Manage containers

Commands:
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
exec Run a command in a running container
export Export a container's filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers
logs Fetch the logs of a container
ls List containers
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
run Run a command in a new container
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes

根据命令功能将它们分门别类,并简要介绍如下:

  • 构建相关

    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 用于集中存放同类型不同版本的镜像。

registryrepository 的关系可类比于 githubrepository 的关系。

registry 相关的 CLI 命令具体如下:

  • docker search

    在默认 registry 中搜索指定内容。

  • docker pull/docker image pull

    从默认 registry 处拉取一个 image

  • docker push/docker image push

    上传一个 image 至默认 registry

数据卷 + 网络 + Dockerfile + 容器管理/编排 + 底层原理 (涉及Linux东西,比较难)

底层原理 镜像组织、容器具体是什么、存储驱动