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 /]#