Docker系列(三):容器管理

简介

之前已经介绍了镜像管理,有了镜像,就可以使用镜像来启动容器(应用环境)。

容器管理

Docker容器基于已有的镜像启动,下面介绍对于容器的管理。

1. 容器启动

选择好镜像后就可以启动容器,启动容器时可以选择多种参数,也可以将需要的参数(部分)定义到Dockerfile,直接打入镜像(但启动时使用的参数会覆盖镜像中已定义好的参数。)。

  • 使用参数启动容器

使用docker run [Options] image_name[:image_tag] [CMD]基于选定镜像启动容器:

$ docker images #Display images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos-sshd         latest              b8c73db541e7        6 months ago        280MB

$ docker run -d centos-sshd /sbin/init #Start container
c7dc163219834374a02e4ee7c91da202a12c847dc3e51a741762af12c7fca919

这样就使用centos-sshd镜像启动了一个容器。

  • 常用参数说明

以下是启动容器时经常使用的一些参数:

-p 端口映射,<local_ip>:<local_port>:<container_port>
-v 挂载本地目录, <local_path>:<container_path>
-d 以分离模式(detached mode)启动(简单理解为后台运行)
-t 分配一个伪终端(pseudo-tty)
-i 打开STDIN(没用-a指定的话)
-e 在container中增加一个环境变量(ENV)
--privileged 允许container访问所有device(例如 cgruop)
--rm 退出容器时自动删除(销毁)容器
--name 指定容器的名称(如不指定,系统会随机分配名称)
[CMD] 启动时运行的命令,如果在启动容器是使用CMD,在创建镜像时Dockerfile中的CMD会被覆盖,另外,注意,这个CMD必须是一直运行的一个命令,不然命令结束,container会自动退出
  • Dockerfile

使用Dockerfile将部分启动参数打入镜像:

EXPOSE <port> [<port>/<protocol>...] #使Container监听指定端口。
VOLUME <local_path> #将本地目录映射到容器中(不等同于-v参数)。
CMD ["CMD1", "CMD2", ...] #启动容器时运行的命令。
ENV <key> <value> (or ENV <key>=<value> ...) #指定Container启动后的环境变量。

2. 查看容器状态

启动容器后可以查看所有容器的状态,通过docker ps [-a]:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c7dc16321983        centos-sshd         "/sbin/init"        5 hours ago         Up 5 hours                              nervous_poitras

可以看到正在运行中的容器,之前启动容器时没有指定名字,由系统分配了一个名字。 -a参数可以看到所有容器(包括已经停止的容器):

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
c7dc16321983        centos-sshd         "/sbin/init"        5 hours ago         Up 5 hours                                     nervous_poitras
db8415d50a86        centos-sshd         "/sbin/init"        5 hours ago         Exited (137) 5 hours ago                       gallant_kilby

可以看到第二个容器是已经停止的容器。

3. 停止运行的容器

使用docker stop <container_id>来停止正在运行的容器:

$ docker stop c7dc16321983
c7dc16321983

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

使用docker ps可以看到没有在运行的容器了,再使用docker ps -a来看看所有容器:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
c7dc16321983        centos-sshd         "/sbin/init"        5 hours ago         Exited (137) 5 seconds ago                       nervous_poitras
db8415d50a86        centos-sshd         "/sbin/init"        5 hours ago         Exited (137) 5 hours ago                         gallant_kilby

可以看到有两个已经停止的容器了,如果想把容器再次启动,使用docker start <container_id>即可。 如果启动是使用了--rm参数的话,停止容器后,容器立即被销毁,通过docker ps -a也不会再看到此容器了。

4. 销毁(删除)容器

将已经停止的容器销毁(删除), 有时需要将不再使用的容器销毁,以免占用系统资源, 使用docker rm <container_id>:

$ docker rm db8415d50a86
db8415d50a86

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
c7dc16321983        centos-sshd         "/sbin/init"        5 hours ago         Exited (137) 5 minutes ago                       nervous_poitras

执行命令后,将已经停止的一个容器销毁了。

5. 进入已启动容器的系统

有时需要进入已经启动容器的系统进行一下操作,使用docker exec [option] container_id [CMD]:

$ docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
c7dc16321983        centos-sshd         "/sbin/init"        5 hours ago         Up 9 seconds                            nervous_poitras

$ docker exec -ti c7dc16321983 /bin/bash
[root@c7dc16321983 /]#