Linux 平台是 Docker 原生支持的平台,在 Linux 上使用 Docker 可以得到最佳的用户体验。

Docker 安装

Docker 是一个轻量级虚拟化技术,它具备传统虚拟机无可比拟的优势。它更简易的安装和使用方式、更快的速度、服务集成与开发流程自动化,都使Docker 被广大技术爱好者青睐。

安装 Docker 的基本要求

  • Docker 只支持 64 位 CPU 架构的计算机,目前不支持 32 位 CPU
  • 建议系统的 Linux 内核版本为 3.10 及以上
  • Linux 需开启 cgroups 和 namespace 功能

Docker 操作参数解读

Docker 的命令行工具是我们日常使用的重点,本节将有选择的介绍其部分功能。为了了解命令行工具的概括,我们可以使用 docker 命令或docker help命令来获取 Docker 的命令清单。

1
2
3
4
5
6
7
8
9
10
➜  ~ docker

Usage: docker [OPTIONS] COMMAND
......
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.

随着 Docker 的不断发展,docker 的子命令已经达到 41 个,其中核心子命令还有复杂的可选执行参数。对于每一个特定的子命令,用户可以使用 docker COMMNAD —help命令来查看该子命令的详细信息,包括子命令的使用方法及可用的操作参数。以下这个例子使用docker start --help命令获取子命令 start 的详细信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
➜  ~ docker start --help

Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]

Start one or more stopped containers

Options:
-a, --attach Attach STDOUT/STDERR and forward signals
--checkpoint string Restore from this checkpoint
--checkpoint-dir string Use a custom checkpoint storage directory
--detach-keys string Override the key sequence for detaching a
container
-i, --interactive Attach container's STDIN

下面是根据命令的用途对其进行分类:

子命令分类 子命令
Docker 环境信息 info、version
容器生命周期管理 create、exec、kill、pause、restart、rm、run、start、stop、unpause
镜像仓库命令 login、logout、pull、push、search
镜像管理 build、images、import、load、rmi、save、tag、commit
容器运维操作 attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff、update
容器资源管理 volume、network
系统日志信息 events、history、logs

从 Docker 命令使用出发,梳理出如下的命令结构图,以更进一步了解 Docker 命令行工具[1]

Docker命令结构图

根据子命令分类清单,选取每个功能分类中常用的子命令进行用法和操作参数的解读。

Docker 环境信息

docker info命令用于检测 Docker 是否正确安装。如果安装正确,该命令会输出 Docker 的配置信息。docker info命令一般结合docker version命令使用,这样能够提取到足够详细的 Docker 环境信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  ~ docker info
Containers: 14
Running: 0
Paused: 0
Stopped: 14
Images: 11
Server Version: 18.09.1
Storage Driver: overlay2
Backing Filesystem: extfs
...
Kernel Version: 4.9.125-linuxkit
Operating System: Docker for Mac
OSType: linux
...
1
2
3
4
5
6
7
8
9
10
11
12
13
➜  ~ docker version
Client: Docker Engine - Community
Version: 18.09.1
API version: 1.39
Go version: go1.10.6
...

Server: Docker Engine - Community
Engine:
Version: 18.09.1
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
...

容器生命周期管理

容器生命周期管理涉及容器启动、停止等功能,下面选取最常用的 docker run命令和负责启动停止的docker start/stop/restart命令举例。

docker run 命令

docker run 命令使用方法如下:

1
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run 命令是 Docker 的核心命令之一,用户可以选用的选项近100 个(目前 92 个),所有选项的说明可以通过 docker run —help命令查看。

docker run命令用来基于特定的镜像创建一个容器,并依据选项来控制该容器。具体使用示例如下:

1
2
➜  ~ docker run ubuntu echo "hello word"
hello word

这是docker run命令最基本的使用方法,改名了从 Ubuntu 镜像启动一个容器,并执行 echo 命令打印出 hello word。执行完 echo 命令后,容器将停止运行。docker run命令启动的容器会随记分配一个容器 ID(container id),用以标识该容器。

在选取启动容器的镜像时,可以在镜像名后添加 tag 来区分同名的镜像,如 ubuntu:latest、ubuntu:13.04、ubunt:14.04。如在选取镜像启动容器时,用户未指定具体 tag,Docker 将默认选取 tag 为 latest 的镜像。

掌握了基本用法后,结合 docker run命令丰富的选项,能够实现更加复杂的功能。来看示例:

1
2
➜  ~ docker run -i -t --name mytest ubuntu:latest /bin/bash
root@e471b4225043:/#

上例中,docker run命令启动一个容器,并为它分配一个伪终端执行 /bin/bash 命令,用户可以在该伪终端与容器进行交互。其中:

-i 选项

表示使用交互模式,始终保持输入流开放

-t 选项

表示分配一个伪终端,一般两个参数结合时使用 -it,即可在容器中利用打开的伪终端进行交互操作

-- name 选项

可以指定 docker run命令启动的容器的名字,若无此选项,Docker 将为容器随机分配一个名字

除了上面示例中使用到的这些,docker run命令还有其他常用的选项:

-c 选项

用于给运行在容器中的所有进程分配 CPU 的 shares 值,这是一个相对权重,实际的处理速度还与宿主机的 CPU 有关

-m 选项

用于限制为容器中所有进程分配的内存总量,以 B、K、M、G 为单位

-v 选项

用于挂载一个 volume,可以用多个-v 参数同时挂载多个 volume。volume 的格式为[host-dir]:[container-dir]:[rw|ro]

-p 选项

用于将容器的端口暴露给宿主机的端口,其常用格式为 hostport:container-port。通过端口的暴露,可以让外部主机通过宿主机暴露的端口来访问容器内的应用。

其中,前三个选项对于 Docker 的资源管理的作用非常显著,在后面有更详细的解释。

docker start/stop/restart 命令

docker run命令可以新建一个容器来运行,而对于已经存在的容器,可以通过 docker start/stop/restart/ 命令来启动、停止和重启。利用docker run命令新建一个容器时,Docker 将自动为每个新容器分配唯一的 ID 作为标识。docker start/stop/restart 命令一般利用容器 ID 标识确定具体容器,在一写情况下,也使用容器名来确定容器。

docker start 命令使用 -i 选项来开启交互模式,始终保持输入流开发。使用 -a 选项来附加标准输入、输出或错误输出。此外,docker stopdocker restart 命令使用 -t 选项来设定容器停止前的等待时间。

Docker registry

Docker registry 是存储容器镜像的仓库,用户可以通过 Docker client 与 Docker registry 进行通信,以此来完成镜像的搜索、下载和上传等相关操作。Docker Hub 是由 Docker 公司在互联网上提供的一个镜像仓库,提供镜像的共有与私有存储服务,它是用户最主要的镜像来源。除了 Docker Hub 以外,用户还可以自行搭建私有服务器来实现镜像仓库的功能。

下面选取最常用的 docker pullpush 命令举例。

docker pull 命令

docker pull 命令是 Docker 中的常用命令,主要用于从 Docker registry 中拉取 image 或 repository。在 Docker 官方仓库 Docker Hub 中有许多即拿即用的镜像资源,通过docker pull 命令可以有效的利用他们,这也体现了 Docker「一次编译,到处运行」的特性。同时,当镜像被拉取到本地后,用户可以在其现有的基础上做出自身的更改操作,这也大大加快了应用的开发进程。

该命令的使用方法如下:

1
docker pull [OPTIONS] NAME[:TAG @DIGEST]

示例:

1
2
3
4
5
6
7
8
# 从官方 Hub 拉取 ubuntu:latest 镜像
docker pull ubuntu
# 从官方 Hub 拉取指明 "ubuntu 12.04" tag 的镜像
docker pull ubuntu:ubuntu12.04
# 从特定的仓库拉取 ubuntu 镜像
docker pull SEL/ubuntu
# 从其他服务器拉取镜像
docker pull 192.168.100.1:5000/sshd

docker push 命令

docker pull 命令向对应的 docker push 命令,可以将本地的 image 或repository 推送到 Docker Hub 的公共或私有镜像库,以及私有服务器。

使用方法如下:

1
docker push [OPTIONS] NAME[:TAG]

示例:

1
docker push SEL/ubuntu

镜像管理

docker images 命令

通过 docker images 命令可以列出主机上的镜像,默认只列出最顶层的镜像,可以使用 -a 选项显示所有镜像。

使用方法:

1
docker images [OPTIONS] [REPOSITORY[:TAG]]

示例:

1
2
3
4
5
➜  ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 4c108a37151f 2 days ago 64.2MB
zendesk/maxwell latest 4e899bf758ed 2 months ago 1.05GB
canal/canal-server latest b9c3d95520a5 2 months ago 831MB

上例中,从 REPOSITORY 属性可以判断出是来自于官方镜像、私人仓库还是私有服务器。

docker rmi 和 docker rm 命令

这两个子命令的功能都是删除,其中 docker rmi 命令用于删除镜像, docker rm 命令用于删除容器。他们可同时删除多个镜像或容器,也可按条件来删除。

使用方法:

1
2
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rmi [OPTIONS] IMAGE [IMAGE...]

需要注意的是,使用 rmi 命令删除镜像时,如果已有基于该镜像启动的容器存在,则无法直接删除,需要首先删除容器。当然,这两个子命令读提供了 -f 选项,可强制删除存在容器的镜像或启动中的容器。

容器运维操作

作为 Docker 的核心,容器的操作是重中之重,Docker 为用户提供了丰富的容器运维操作命令,以常用的 attach、inspect 及 ps 子命令举例。

docker attach 命令

docker attach 命令对于开发者来说十分有用,它可以连接到正在运行的容器,观察该容器的运行情况,或与容器的主进程进行交互。

使用方法:

1
docker attach [OPTIONS] CONTAINER

docker inspect 命令

docker inspect 命令可以查看镜像和容器的详细信息,默认会列出全部信息,可以通过 --format 参数来指定输出的模板格式,以便输出特定信息。

使用方法:

1
docker inspect [OPTINOS] CONTAINER|IMAGE [CONTAINER|IMAGE...]

示例:

1
2
3
# 查看容器内部 IP
➜ ~ docker inspect --format='{{.NetworkSettings.IPAddress}}' c5b3f7901fdf
172.17.0.3

docker ps 命令

docker ps 命令可以查看容器的相关信息,默认只显示正在运行的容器的信息。可以查看到的信息包括 CONTAINER ID、NAMES、IMAGE、STATUS、容器启动后执行的 COMMAND、创建时间 CREATED 和绑定开启的端口 PORTS。docker ps 命令最常用的功能就是查看容器的 CONTAINER ID,以便对特定容器进行操作。

使用方法:

1
docker ps [OPTIONS]

docker ps 命令常用的选项有 -a-l-a 参数可以查看所有容器,包括停止的容器;-l 参数则只查看最新创建的容器,包括停止的容器。

其他子命令

除了上述命令外,Docker 还有一系列非常有用的子命令,如固话容器为镜像的 commit 命令等。下面以一些较为常用的子命令举例。

docker commit 命令

commit 命令可以将一个容器固化为一个新的镜像。当需要制作特定的镜像时,会进行修改容器的配置,如在容器中安装特定工具等,通过 commit 命令可以讲这些修改保存起来,使其不会因为容器的停止而丢失。

使用方法:

1
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

提交保存时,只能选用正在运行的容器(即可以通过 docker ps 命令看到的容器)来制作新的镜像。但在制作镜像时, commit 命令只是一个临时性的辅助命令,不推荐使用。官方建议通过 docker build 命令集合 Dockerfile 创建和管理镜像。

events、history 和 logs 命令

这三个命令用于查看 Docker 的系统日志信息。events 命令会打印出实时的系统事件;history 命令会打印出指定镜像的历史版本信息,即构建该镜像的每一层镜像的命令记录;logs 命令会打印出容器中进程的运行日志。

使用方法:

1
2
3
docker events [OPTIONS]
docker history [OPTIONS] IMAGE
docker tags [OPTIONS] CONTAINER

参考资料


  1. 1.https://blog.octo.com/en/docker-registry-first-steps/

Comments