Docker常用操作指令
在使用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操作镜像与容器的一些常用指令,并分别对其作用进行了简要说明。为了帮助读者更好的掌握这些指令的使用,接下来将对这些常用指令的使用进行详细讲解。
1. 列出镜像
通过docker images指令可以查看本地镜像列表中已有的镜像,具体使用方式如下。
$ docker images
执行上述指令后,系统会将所有本地镜像都展示出来,如图1所示。
图1 列举镜像
从图1中可以看出,系统终端将本地镜像列表中的3个镜像分5列进行了展示,每一列的具体含义如下。
● REPOSITORY:镜像名称。
● TAG:镜像的参数,类似于版本号,默认是latest。
● IMAGE ID:镜像ID,是唯一值。此处看到的是一个长度为12的字符串,实际上它是64位完整镜像ID的缩写形式。
● CREATED:距今创建镜像的时间。
● SIZE:镜像大小。
2. 搜索镜像
想知道在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上,当代码提交更新后,可以自动构建镜像。
3. 拉取镜像
通过docker pull指令可以拉取仓库镜像到本地(默认都是拉取Docker Hub仓库镜像,也可以指定“IP+端口”拉取某个Docker机器上的私有仓库镜像),具体使用方式如下。
$ docker pull ubuntu
执行上述指令后,Docker会自动从Docker Hub上下载最新版本的Ubuntu到本地,当然也可以使用以下指令拉取指定版本的镜像到本地,具体指令如下。
$ docker pull ubuntu:14.04
4. 构建镜像
除了可以通过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文件创建的,只不过取了不同的名称而已。
5. 删除镜像
当本地存放过多不需要的镜像时,可以通过docker rmi指令将其删除。在删除镜像时,需要指定镜像名称或镜像ID。删除镜像的使用方式如下。
$ docker rmi -f hellodocker2 hellodocker3
上述指令中,docker rmi表示删除镜像,-f表示进行强制删除,而hellodocker2和hellodocker3分别表示需要删除的镜像名称,这里同时删除两个镜像。除了根据名称删除镜像外,还也可以根据镜像ID来删除镜像,只是这里如果指定了删除ID为23c617a866d4的镜像后,会同时删除hellodocker、hellodocker2和hellodocker3三个镜像。
需要特别强调的是,在进行镜像删除操作时,如果是通过镜像ID进行镜像删除,那么由该镜像创建的容器必须提前删除或停止。另外,在通过镜像名称操作镜像时,如果出现镜像重名的情况,必须在镜像名称后面指定镜像标签tag参数来确保唯一性。
6. 创建并启动容器
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文件中预先声明。
小提示:
由于容器名称具有唯一性,因此在创建容器时若指定了容器名称,则后续创建的容器名称不得与此容器名称相同,否则就需要重新命名或者将之前的容器删除。
7. 列出容器
生成容器后,可以通过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指令的其他信息进行查看。
8. 执行命令
当生成容器后,客户端可以通过docker exec指令与运行的容器进行通信,在通信时需要指定容器ID或名称,具体使用方式如下。
$ docker exec f0c9a8b6e8c5 ls -l
执行上述指令后,就会将该容器中的所有文件都展示出来,如图5所示。
图5 执行命令
9. 停止容器
当不需要容器运行时,可以使用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指令进行查看。