容器(Container)是Docker的另一个核心的概念。
简单的来说,容器是镜像的一个运行实例,不同的是,Docker带有额外的可写文件层。
创建容器
Docker的容器十分轻量级,用户可以随时创建或者删除容器。
新建容器
可以使用docker create
的命令新建一个容器,例如:
$ sudo docker create -it ubuntu:latest
7a0c2696889sfe2323f2f2v2rcr2c00r3oe2fadc166698475a32
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a0c2696889 unbuntu/latest "/bin/bash" 6 seconds ago stoic_albattani
使用docker create
命令新建的容器会处于一个停止的状态,可以使用docker start
来启动它。
新建并启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stoped)的容器重新启动。对于第一种,所需要的命令是docker run
,等价于先执行docker create
,再执行dcoker start
命令。
$ sudo docker run ubuntu /bin/echo 'Hello world'
当利用docker run
来创建并启动容器时,Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
- 利用镜像创建并启动一个容器。
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层。
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中。
- 从地址池配置一个IP地址给容器。
- 执行用户指定的应用程序。
- 执行完毕以后容器被终止。
下面的命令则启动一个bash终端,允许用户进行交互。
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
其中, -t
选项让Docker分配一个伪终端并绑定到容器的标准输入上,-i
则让容器的标准输入保持打开。
在交互模式下,可以通过创建的终端来输入命令,就像在一个linux系统中执行shell命令那样。
在容器中可以使用ps
来查看进程。
如果要退出容器,可以输入exit
。对于创建的容器,当我们退出以后,该容器就自动处于终止状态了,这是因为对于Docker容器来说,当运行的应用退出后,容器也就没有运行必要了。
守护态运行
有的时候,我们需要让Docker容器在后台以守护态(Daemonized)形式运行。用户可以通过添加-d
参数来实现。
$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
容器会返回一个ID,可以通过docker ps
来查看容器信息,
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce554267d7a4 ubuntu:latest "/bin/sh -c 'while tr...' About a minute ago Up about a minute
如果要获取容器的输出信息,可以通过docker logs
命令来查看。
$ sudo docker logs ce5
hello world
hello world
hello world
...
终止容器
可以使用docker stop
来终止一个运行中的容器,命令格式为docker stop [-t | --time[=10]]
。它会向容器发送一个SIGTERM信号,等待一段时间后(默认10s)再发送SIGKILL信号终止容器。
此外,当Docker容器中指定的应用终结时,容器也自动终止。例如上一节提到的,用户通过exit
命令或者Ctrl+d
退出终端,所建的容器也会立刻停止。
进入容器
如果需要进入容器进行操作,有多个方法,包括docker exec
,docker attach
命令,以及nsenter工具等。
dp_user@rqalnxg***:/usr/sap/wwpTools> sudo docker attach c5c3544df6e6
需要注意的是使用attach
命令有时候不方便,当多个窗口attach
到同一个容器里的时候,所有的窗口会同步显示。当某个窗口因为命令被阻塞,其他的窗口也将会没有办法执行操作。
在Docker 1.3以后,提供了一个更加方便的工具exec
,可以直接在容器内运行命令。
dp_user@rqalnxgrid4:/usr/sap/wwpTools> sudo docker exec -it c5c3544df6e6 /bin/bash
删除容器
可以使用docker rm
命令来删除处于终止状态的容器,命令格式是docker rm [OPTIONS] CONTAINER [CONTAINER...]
。支持的选项有:
-
-f
, -- force = false 强行终止并删除一个运行中的容器 -
-l
,-- link = false 删除容器的链接,但是保留容器。 -
-v
, --volumes = false 删除容器挂载的数据卷。
导入和导出容器
导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管该容器是否是处于运行状态,都可以执行docker export
命令,该命令的具体格式是docker export CONTAINER
例如,我们想要导出一个container ID是ceaeacfed873的容器,可以使用如下命令:
dp_user@rqalnx***:/usr/sap/wwpTools> sudo docker export ceaeacfed873 >test_run_container.tar
dp_user@rqalnx***:/usr/sap/wwpTools> ls
test_run_container.tar
导入容器
导出的文件同样也可以使用导入的命令docker import
进行导入,称为镜像,例如:
dp_user@rqalnx***:/usr/sap/wwpTools> cat test_run_container.tar | sudo docker import - test/ubuntu:v1.0
dp_user@rqalnx***:/usr/sap/wwpTools> sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 ceeficcfed654 About a minutes ago 171.3MB
docker load
命令也可以导入一个镜像文件,使用该命令可以将一个镜像存储文件导入到本地的镜像库。
docker import
命令可以导入一个容器快照到本地的镜像库, 其区别在于容器快照(也就是docker import
)将会丢弃所有的历史记录和元数据信息(仅仅保存容器当时的快照状态),而镜像存储文件(即docker load
)将保存完整的的记录,体积也会更大。
网友评论