小议 Docker:Docker 基础
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 | ➜ ~ docker |
随着 Docker 的不断发展,docker 的子命令已经达到 41 个,其中核心子命令还有复杂的可选执行参数。对于每一个特定的子命令,用户可以使用 docker COMMNAD —help
命令来查看该子命令的详细信息,包括子命令的使用方法及可用的操作参数。以下这个例子使用docker start --help
命令获取子命令 start 的详细信息。
1 | ➜ ~ docker start --help |
下面是根据命令的用途对其进行分类:
子命令分类 | 子命令 |
---|---|
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 info
命令用于检测 Docker 是否正确安装。如果安装正确,该命令会输出 Docker 的配置信息。docker info
命令一般结合docker version
命令使用,这样能够提取到足够详细的 Docker 环境信息。
1 | ➜ ~ docker info |
1 | ➜ ~ docker version |
容器生命周期管理
容器生命周期管理涉及容器启动、停止等功能,下面选取最常用的 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 | ➜ ~ docker run ubuntu echo "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 | ➜ ~ docker run -i -t --name mytest ubuntu:latest /bin/bash |
上例中,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 stop
和 docker restart
命令使用 -t
选项来设定容器停止前的等待时间。
Docker registry
Docker registry 是存储容器镜像的仓库,用户可以通过 Docker client 与 Docker registry 进行通信,以此来完成镜像的搜索、下载和上传等相关操作。Docker Hub 是由 Docker 公司在互联网上提供的一个镜像仓库,提供镜像的共有与私有存储服务,它是用户最主要的镜像来源。除了 Docker Hub 以外,用户还可以自行搭建私有服务器来实现镜像仓库的功能。
下面选取最常用的 docker pull
和 push
命令举例。
docker pull 命令
docker pull
命令是 Docker 中的常用命令,主要用于从 Docker registry 中拉取 image 或 repository。在 Docker 官方仓库 Docker Hub 中有许多即拿即用的镜像资源,通过docker pull
命令可以有效的利用他们,这也体现了 Docker「一次编译,到处运行」的特性。同时,当镜像被拉取到本地后,用户可以在其现有的基础上做出自身的更改操作,这也大大加快了应用的开发进程。
该命令的使用方法如下:
1 | docker pull [OPTIONS] NAME[:TAG @DIGEST] |
示例:
1 | 从官方 Hub 拉取 ubuntu:latest 镜像 |
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 | ➜ ~ docker images |
上例中,从 REPOSITORY 属性可以判断出是来自于官方镜像、私人仓库还是私有服务器。
docker rmi 和 docker rm 命令
这两个子命令的功能都是删除,其中 docker rmi
命令用于删除镜像, docker rm
命令用于删除容器。他们可同时删除多个镜像或容器,也可按条件来删除。
使用方法:
1 | docker rm [OPTIONS] CONTAINER [CONTAINER...] |
需要注意的是,使用 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 | 查看容器内部 IP |
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 | docker events [OPTIONS] |
参考资料
- 1.https://blog.octo.com/en/docker-registry-first-steps/ ↩