在使用Docker时,经常会操作镜像与容器,这就会涉及到各种操作指令使用,如docker build、docker images、docker run等,这些常用的操作指令及其说明如表1所示。
表1 Docker常用操作指令
指令 说明
docker images 列出镜像
docker search 搜索镜像
docker pull 拉取镜像
docker build 构建镜像
docker rmi 删除镜像
docker run 创建并启动容器
docker ps 列出容器
docker exec 执行容器
docker stop 停止容器
docker start 启动容器
docker rm 删除容器
在表1中,列举了Docker操作镜像与容器的一些常用指令,并分别对其作用进行了简要说明。为了帮助读者更好的掌握这些指令的使用,接下来将对这些常用指令的使用进行详细讲解。
- 列出镜像
通过docker images指令可以查看本地镜像列表中已有的镜像,具体使用方式如下。
$ docker images
执行上述指令后,系统会将所有本地镜像都展示出来,如图1所示。
图1 列举镜像
从图1中可以看出,系统终端将本地镜像列表中的3个镜像分5列进行了展示,每一列的具体含义如下。
● REPOSITORY:镜像名称。
● TAG:镜像的参数,类似于版本号,默认是latest。
● IMAGE ID:镜像ID,是唯一值。此处看到的是一个长度为12的字符串,实际上它是64位完整镜像ID的缩写形式。
● CREATED:距今创建镜像的时间。
● SIZE:镜像大小。
- 搜索镜像
想知道在Docker Hub中包含了哪些镜像,除了可以登录Docker Hub,在官网中心进行查看外,还可以直接在Docker客户端进行查询。例如想要查询Ubuntu镜像,可以使用如下指令。
$ docker search ubuntu
执行上述指令后,系统终端就会将搜索到的有关Ubuntu的镜像展示出来,如图2所示。
图2 搜索镜像结果图
从图2所示的结果可以看出,系统终端分5列将搜索到的Ubuntu相关镜像都列举出来了,这5列的具体含义如下。
● NAME:表示镜像的名称,这里有两种格式的名称,其中不带有“/”的表示官方镜像,而带有“/”的表示其他用户的公开镜像。公开镜像“/”前面是用户在Docker Hub上的用户名(唯一),后面是对应的镜像名;官方镜像与用户镜像,除了从镜像名称上可以区分外,还可以通过第4列的OFFICIAL声明中看出(该列下内容为OK表示官方镜像)。
● DESCRIPTION:表示镜像的描述,这里只显示了一小部分。
● STARS:表示该镜像的收藏数,用户可以在Docker Hub上对镜像进行收藏,一般可以通过该数字反应出该镜像的受欢迎程度。
● OFFICIAL:表示是否为官方镜像。
● AUTOMATED:表示是否自动构建镜像。例如,用户可以将自己的Docker Hub绑定到如Github上,当代码提交更新后,可以自动构建镜像。
- 拉取镜像
通过docker pull指令可以拉取仓库镜像到本地(默认都是拉取Docker Hub仓库镜像,也可以指定“IP+端口”拉取某个Docker机器上的私有仓库镜像),具体使用方式如下。
$ docker pull ubuntu
执行上述指令后,Docker会自动从Docker Hub上下载最新版本的Ubuntu到本地,当然也可以使用以下指令拉取指定版本的镜像到本地,具体指令如下。
$ docker pull ubuntu:14.04
- 构建镜像
除了可以通过docker pull指令从仓库拉取镜像外,还可以通过docker build指令构建Docker镜像,通常情况下都是通过Dockerfile文件来构建镜像的。
下面仍以前面小节讲解的Docker入门程序中的Dockerfile为例,使用两种方式进行镜像构建。
(1)在Dockerfile文件所在目录构建镜像
进入Dockerfile文件所在目录后,可以使用docker build指令进行镜像构建,具体指令如下。
$ cd workspace/dockerspace/
$ docker build -t hellodocker2 .
上述方式是入门程序中进入Dockerfile所在位置通过点“.”读取当前应用上下文中的Dockerfile文件进行镜像构建的。
(2)在其他目录构建镜像
除了可以在Dockerfile文件所在目录构建镜像外,我们还可以在指定目录下进行镜像构建,如在home目录下读取Dockerfile文件所在目录的指令如下。
$ cd ~
$ docker build -t hellodocker3 /home/shitou/workspace/dockerspace/.
构建镜像完成后,就可以通过docker images指令查看镜像是否创建成功,具体效果如图3所示。
图3 列举镜像
从图3结果可以看出,使用上述两种方式都已成功构建出了镜像,并且新构建的两个镜像hellodocker2和hellodocker3与hellodocker镜像的ID相同。这是因为这三个镜像都是根据同一个Dockerfile文件创建的,只不过取了不同的名称而已。
- 删除镜像
当本地存放过多不需要的镜像时,可以通过docker rmi指令将其删除。在删除镜像时,需要指定镜像名称或镜像ID。删除镜像的使用方式如下。
$ docker rmi -f hellodocker2 hellodocker3
上述指令中,docker rmi表示删除镜像,-f表示进行强制删除,而hellodocker2和hellodocker3分别表示需要删除的镜像名称,这里同时删除两个镜像。除了根据名称删除镜像外,还也可以根据镜像ID来删除镜像,只是这里如果指定了删除ID为23c617a866d4的镜像后,会同时删除hellodocker、hellodocker2和hellodocker3三个镜像。
需要特别强调的是,在进行镜像删除操作时,如果是通过镜像ID进行镜像删除,那么由该镜像创建的容器必须提前删除或停止。另外,在通过镜像名称操作镜像时,如果出现镜像重名的情况,必须在镜像名称后面指定镜像标签tag参数来确保唯一性。
- 创建并启动容器
Docker镜像主要用于创建容器,可以使用docker run指令创建并启动容器,具体使用方式如下。
$ docker run -d -p 5000:80 --name test hellodocker
上述创建并启动容器的指令略微复杂,具体分析如下。
● docker run:表示创建并启动一个容器,而后面的hellodocker就表示要启动运行的镜像名称;
● -d:表示容器启动时在后台运行;
● -p 5000:80:表示将容器内暴露的80端口映射到宿主机指定的5000端口,也可以将-p 5000:80更改为-P来映射主机的随机端口(注意p字母的大小写);
● --name test:表示为创建后的容器指定名称为test,如果没有该参数配置,则生成的容器会设置一个随机名称。
docker run命令是Docker操作中较为复杂的一个,它可以携带多个参数和参数,我们可以通过docker run --help指令进行查看,其中有些参数如-e、-v和-w等都可以在Dockerfile文件中预先声明。
小提示:
由于容器名称具有唯一性,因此在创建容器时若指定了容器名称,则后续创建的容器名称不得与此容器名称相同,否则就需要重新命名或者将之前的容器删除。
- 列出容器
生成容器后,可以通过docker ps指令查看当前运行的所有容器,具体使用方式如下。
$ docker ps
执行上述命令后,会将所有当前运行的容器都展示出来,具体如图4所示。
图4 列举容器
从图7-8中可以看出,系统终端通过7列对当前的正在运行的一个容器进行了展示,图中每一列的具体含义如下。
● CONTAINER ID:表示生成的容器ID;
● IMAGE:表示生成该容器的镜像名称;
● COMMAND:表示启动容器时运行的命令,Docker要求在启动容器时必须运行一个命令;
● CREATED:表示容器创建的时间;
● STATUS:表示容器运行状态,例如Up表示运行中,Exited表示已停止;
● PORTS:表示容器内部暴露的端口映射到主机的端口;
● NAMES:表示生成容器的名称,由Docker引擎自动生成,可以像上述示例中使用–name参数指定生成容器的名称。
另外,docker ps指令运行过程中可以指定多个参数,还可以通过docker ps --help指令对ps指令的其他信息进行查看。
- 执行命令
当生成容器后,客户端可以通过docker exec指令与运行的容器进行通信,在通信时需要指定容器ID或名称,具体使用方式如下。
$ docker exec f0c9a8b6e8c5 ls -l
执行上述指令后,就会将该容器中的所有文件都展示出来,如图5所示。
图5 执行命令
- 停止容器
当不需要容器运行时,可以使用docker stop指令停止指定的容器,在停止容器时,需要指定容器ID或名称,具体使用方式如下。
$ docker stop f0c9a8b6e8c5
使用上述指令停止容器时会有略微延迟,成功后会返回该容器ID。如果想要查看该容器,则可以通过上面学习的docker ps -a进行查看。
我们也可以通过docker kill指令立即杀死运行的容器进程,使用该指令也需要指定容器ID或名称,具体使用方式如下。
$ docker kill f0c9a8b6e8c5
使用上述指令杀死运行的容器时,几乎是瞬间完成的,执行后便会返回该容器的ID。
10.启动容器
容器停止后,如果需要重新访问该容器中的程序,则需要重新启动该容器。启动容器可以通过docker start指令来完成,其具体的使用方式如下。
$ docker start f0c9a8b6e8c5
除了docker start指令可以启动已经停止的容器外,还可以使用docker restart指令重启容器。
需要注意的是,docker restart指令既可以重新启动已经停止的容器,也可以重启当前正在运行的容器,具体使用方式如下。
$ docker restart f0c9a8b6e8c5
11.删除容器
当不需要使用容器时,则可以使用docker rm指令删除已停止的容器,具体使用方式如下。
$ docker rm f0c9a8b6e8c5
需要注意的是,上述指令只能删除已经停止运行的容器,而不能删除正在运行的容器。如果想要删除正在运行的容器,则需要添加-f参数强制删除,具体使用方式如下。
$ docker rm -f f0c9a8b6e8c5
当需要删除的容器过多时,如果还一个个的删除就略显麻烦了,此时可以通过如下指令将全部容器删除。
$ docker rm -f $(docker ps -aq)
上述指令中,首先会通过$(docker ps -aq)获取所有容器的ID,然后通过docker rm -f指令进行强制删除。
如果开发者有自己特殊的删除需求,可以根据前面docker ps指令进行组装来获取需要删除的容器ID。
Docker提供的操作指令远不止这些,这里就不一一列举了,想要了解更多Docker的操作指令,可以通过docker --help指令进行查看。
Docker客户端除了提供常用的镜像、容器的操作指令外,还提供了一些管理指令,这些管理指令的名称和说明如表1所示。
表1 Docker 管理指令
管理指令 说明
docker container 用于管理容器
docker image 用来管理镜像
docker network 用来管理Docker网络
docker node 用于管理Swarm集群节点
docker plugin 用于管理插件
docker secret 用于管理Docker机密
docker service 用于管理Docker一些服务
docker stack 用于管理Docker堆栈
docker swarm 用于管理Swarm
docker system 用于管理Docker
docker volume 用于管理数据卷
在表1中,所有列出的Docker管理指令,都是用来分类管理Docker应用的,我们都可以使用类似docker container --help的指令,来查看每个管理指令的详细使用方式。
需要说明的是,管理指令中的docker container和docker image的操作指令与上一小节中讲解的常用操作指令是相同的,只是在上一小节中进行镜像和容器操作时省略了container和image关键字,因为Docker默认是对镜像和容器进行操作的。