6

本系列教程翻译自 Flux7 Docker Tutorial Series,系列共有九篇,本文译自第二篇 Part 2: The 15 Commands
该系列所有文章将参考其他学习资料翻译,也会加入自己的学习作为部分注解。如有错误,欢迎指正。

the-15-commands.png

第一篇文章《Docker 简介》 介绍了 Docker 的基本概念,也介绍了 Docker 的安装、检查了 Docker 是否能够运行。本篇文章介绍实践中常用的 15 个 Docker 命令,以及它们具体在后台做了什么工作。(原文虽然标题说有 15 条命令,实际上只有 14 条)

0. 技巧

这里是一个操作 Docker 镜像的小技巧,写在最前面,请牢记。后面会多次利用到这个技巧。

不冲突的情况下, Docker 可以使用 ID 的前面几个字符进行快速操作,例如:

命令 # docker ps -a

CONTAINER ID        IMAGE                 COMMAND                CREATED             STATUS                      PORTS               NAMES
920c0f3c240a        89dc7e6d0ac1:latest   "ls /etc/"             15 minutes ago      Exited (0) 15 minutes ago                       ecstatic_perlman
3f2a0b440abc        89dc7e6d0ac1:latest   "ls /etc/fstab"        15 minutes ago      Exited (0) 15 minutes ago                       tender_curie
64c55acd970e        89dc7e6d0ac1:latest   "ls -l"                15 minutes ago      Exited (0) 15 minutes ago                       sharp_lumiere
c34716ad8f72        busybox:latest        "/bin/sh -c 'while t   19 hours ago        Exited (0) 12 hours ago                         trusting_kowalevski
977be396faf6        busybox:latest        "/bin/sh -c 'while t   19 hours ago        Exited (137) 19 hours ago                       ecstatic_lovelace
9e553497cbed        busybox:latest        "/bin/sh -c 'while t   19 hours ago        Exited (137) 19 hours ago                       lonely_fermi
c9093d4c7637        busybox:latest        "/bin/sh -c 'while t   19 hours ago        Exited (137) 19 hours ago                       gloomy_pike
3f81114c48c2        busybox:latest        "/bin/echo Hello Doc   19 hours ago        Exited (0) 19 hours ago                         determined_swartz
26c98d7a589d        hello-world:latest    "/hello"               20 hours ago        Exited (0) 20 hours ago                         distracted_babbage
36c0b05dc414        hello-world:latest    "/hello"               20 hours ago        Exited (0) 20 hours ago                         admiring_carson

可以使用 docker rm 92 命令快速删除容器 920c0f3c240a,但是无法使用 docker rm 3f 命令进行快速删除某个容器,因为有两个以 3f 开头的容器,你必须用 docker rm 3f2 或者 docker rm 3f8 指定删除其中一个。

1. 检查安装

检查 Docker 是否安装:

docker info

如果 Docker 没有安装,会提示 command not found,如果 Docker 已经成功安装,则会有类似如下的提示:

命令 # docker info

Containers: 2
Images: 2
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 6
 Dirperm1 Supported: false
Execution Driver: native-0.2
Kernel Version: 3.13.0-24-generic
Operating System: Ubuntu 14.04 LTS
CPUs: 1
Total Memory: 979.6 MiB
Name: ubuntu
ID: PRLX:CY3O:TZ6P:4UAS:VDWM:MHWB:FB3V:TJBJ:GQ4J:Q453:GPOY:WZSI
WARNING: No swap limit support

2. 检查镜像

那么我们检查一下本机有多少 Docker 镜像:

docker images

输出:

命令 # docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-world         latest              91c95931e552        5 days ago          910 B

本机只有 Docker 教程一 中的一个 hello-world 镜像。

我们可以使用如下命令去下载一个 busybox 的镜像文件:

3. 下载镜像

docker pull <image name>

输出:

命令 # docker pull busybox

latest: Pulling from busybox
cf2616975b4a: Pull complete
6ce2e90b0bc7: Pull complete
8c2e06607696: Already exists
busybox:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:38a203e1986cf79639cfb9b2e1d6e773de84002feea2d4eb006b52004ee8502d
Status: Downloaded newer image for busybox:latest

busybox 是一个 Linux 工具集,包括各种常用命令,例如 catecho ,也有各种高级命令,例如 grepmount 等。执行完 docker pull busybox 之后,Docker 会自动从 Docker 官方下载 busybox 的镜像文件。

这个过程中可以执行 Ctrl+Cdocker pull 不会因为 Ctrl+C 打断,而回转为后台执行。

4. 运行镜像

有了镜像当然要对镜像做点事情,例如:

docker run busybox /bin/echo Hello Docker

这条命令是运行 busybox 镜像中的 /bin/echo 命令,参数是 Hello Docker

命令 # docker run busybox /bin/echo Hello Docker

Hello Docker

5. 运行守护进程

当然有人会感到疑惑:难道不能在 Docker 容器内运行一个守护进程之类的东西?

当然可以,例如:

sample_job=$(docker run -d busybox /bin/sh -c "while true; do echo Docker; sleep 1; done")

在后台,以 busybox 镜像为基础创建的一个容器,每一秒运行一次 echo Docker 命令;然后该容器的 ID 保存在变量 sample_job 中。

关于 sample_job :其实 Docker 给每个运行中的容器也随机会起一个名字的,而不仅仅是一串长长的 ID ,例如我这个容器的就被起名叫 trusting_kowalevski,可以通过 docker ps 获取这个名字,当然本篇文章中所有的 $sample_job 也可以用 trusting_kowalevski 这个名字替代。

6. 查询输出

查询容器的输出内容:

docker logs <ID>/<name>

例如:通过 docker logs 命令查询 sample_job 对应的容器的输出内容。

命令 # sample_job=$(docker run -d busybox /bin/sh -c "while true; do echo Docker; sleep 1; done")
命令 # docker logs $sample_job
Docker
Docker
Docker
Docker
Docker
Docker
Docker

只要这个容器运行的时间足够长,就会输出足够多行的 Docker

7. help 选项

和通用的 unix 命令一样,Docker 也有 help 选项:

docker help

docker <command> --help

8. 停止容器

那么还是刚刚那个容器:

这个容器已经输出了足够多的 Docker,该让他停下了:

docker stop $sample_job

9. 重启容器

或者重启刚刚那个容器:

docker restart $sample_job

10. 删除容器

当然也可以完全删除这个容器:

docker stop $sample_job
docker rm $sample_job

注:Docker 的文件是放在 /var/lib/docker/containers/ 中的。

11. 保存容器

将当前的 Docker 容器状态保存为镜像:

docker commit $sample_job job1

这里保存成一个名叫 job1 的镜像。

注意:镜像名称中只允许出现小写字母和数字。

12. 检查容器

如果不太确信刚刚已经把容器保存成镜像了,可以使用下面的命令查看刚刚 commit 的到底是什么:

docker images

可以看到,多出了一个 job1 的镜像:

命令 # docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
job1                latest              9b748dc45fd1        50 seconds ago      2.433 MB
hello-world         latest              91c95931e552        5 days ago          910 B
busybox             latest              8c2e06607696        5 days ago          2.433 MB

13. 搜索仓库

在前面文章提到了 Docker Index 和 Docker registry,这两个就是 Docker 官方存储公有和私有镜像的地方,可以使用这个命令搜索被上传到 Docker registry 的镜像:

docker search <image-name>

例如:

命令 # docker search dockerui

NAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
crosbymichael/dockerui   docker run -d crosbymichael/dockerui /dock...   23
abh1nav/dockerui         An updated version of crosbymichael/docker...   16                   [OK]
dockerui/dockerui        A web interface to interact with the Docke...   13                   [OK]
madhavkobal/dockerui     Docker Updated Version having Search, Pull...   7
fardok/dockerui          docker web ui  from crosbymichael               1
rpidockers/dockerui                                                      1
microbox/dockerui        Trusted Automated dockerui image (16MB size)    1
sigmonsays/dockerui                                                      1                    [OK]
sidd/dockerui            DockerUI                                        0
pemcconnell/dockerui                                                     0
devalih/dockerui         To run :  docker pull devalih/dockerui  do...   0
jonny64/dockerui                                                         0
eternitech/dockerui                                                      0
akranga/dockerui                                                         0
netz98/dockerui          PHP based Docker UI                             0
jonbaer/dockerui                                                         0
rogaha/dockerui                                                          0
bettse/dockerui          Fork of crosbymichael/dockerui                  0
wansc/dockerui                                                           0                    [OK]
c0710204/dockerui                                                        0                    [OK]
zaraki673/dockerui                                                       0                    [OK]
allincloud/dockerui                                                      0                    [OK]
atandock/dockerui                                                        0                    [OK]
cloudaku/dockerui                                                        0                    [OK]
yungsang/dockerui        Docker API Version: v1.8 UI Version: v0.4 ...   0

当然 DockerUI 官方的指出官方维护镜像是 dockerui/dockerui,因此只需 docker pull dockerui/dockerui 即可得到 DockerUI。

DockerUI:一个网页版本的 Docker 管理工具。

Docker 的仓库也有个被人诟病的地方:你没有办法弄清 Docker 镜像的来源。DockerUI 官方文档指出了 DockerUI 官方镜像的名称 dockerui/dockerui,Docker 官方维护的发行版也都有 official 标签;除了这两种情况之外,所有的镜像都没有安全标签,你完全无法判断镜像的安全性。

14. 获取镜像历史

获取 Docker 镜像的更改历史:

docker history <image-name>

例如:

docker history busybox

注:只能对本地存在的 Docker 镜像执行这个命令。

15. 推送镜像

将一个镜像推送到 Docker registry:

docker push <user>/<repo_name>

注:不能直接使用 docker push job1,所有推送命令的格式必须是 docker push <user>/<repo_name>,不加 <user> 无法推送到 Docker registry。

总结

本章知识介绍了最基本的十五个 Docker 命令,接下来的教程将会陆续介绍如何在 Docker 中运行一个 Python Web 应用以及其他的 Docker 命令。

译者注:本文到此结束,但是直到本系列教程的结束,Flux7 都没有提供一个 Docker 中运行 Python Web 应用的实例。接下来会在本系列教程结束后补充几篇 Docker 应用的实例。


大舒
7k 声望815 粉丝

define TRUE FALSE