原文出自:http://blog.csdn.net/anxpp/article/details/52476339
容器是Docker的另一个核心概念。
一般来说,镜像的一个运行实例就是容器,容器提供了一个可写的文件层。
本文同上一篇介绍镜像一样的结构,逐步介绍容器。
1、创建容器
Docker的容器非常轻量级,创建和删除都很容易。
1.1、新建容器
新建容器使用docker create命令:
docker create -it ubuntu:latest
此时创建好的容器处于停止状态,使用docker pa -a可以查看容器列表。
停止的容器可以使用docker start命令启动。
1.2、启动容器
启动容器有两种方式:
1、基于镜像新建容器并启动
2、启动终止状态的容器
主要涉及的命令为docker run,等价于先执行docker create,然后执行docker start命令。
比如:
docker run ubuntu /bin/bash 'hello word'
会启动容器并输出hello word然后自动终止。
利用docker run创建并启动容器时,docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去。
- 从地址池中分配一个IP给容器
- 执行用户指定的应用程序
- 执行完毕后容器被终止
docker run -t -i ubuntu /bin/bash
-t:让docker分配一个伪终端并绑定到容器的标准输入上。
-i:让容器的标准输入保持打开。
交互模式下用户可以通过所创建的中断来输入命令,这和一般linux的中断使用起来是一样的。
输入exit或者按ctrl+d可以退出容器。
对于所创建的bash容器,当使用exit命令退出后,docker容器也会自动终止,因为对于docker来说,没有运行中的应用后,容器也没有必要继续运行了。
1.3、守护态运行
可以通过-d参数让docker容器在后台以守护态(Daemonized)形式运行。比如:
docker run -d ubuntu /bin/bash -c "while true;do each hello word; sleep 1 done"
使用docker ps命令查看容器信息。
使用docker logs获取容器的输出信息。
2、终止容器
终止一个运行中的命令是docker stop,格式:
docker stop [-t|--time[=10]]
这时会首先向容器发送SIGTERM信号,等待一段时间后(默认为10s),再次发送SIGNKILL信号终止容器。
同样的,像刚刚前面说的一样,当Docker容器中指定的应用终结时,容器页自动终止。
可以通过docker ps命令查看:
docker ps -a -q
这里参数表示查看所有退出的容器。
容器(被)终止后,可以通过docker start重新启动。
而docker restart命令,页如我们所料,会首先终止一个运行态的容器,然后再重新启动它。
3、进入容器
启动容器时若加上参数-d会进入后台,无法直接看到容器中的内容。如果想进入容器,有多种方法:docker attach命令、docker exec命令以及nsenter工具等。
3.1、attach命令
这是Docker自带的命令。
如果我们有如下运行的容器:
docker run -idt ubuntu
可以这样进入:
docker attach 容器Name
但是,当多个窗口(终端)同时attach到一个容器时,所有窗口都会同步显示,当某个窗口因为命令等阻塞后,其他窗口也会被阻塞而不能执行操作。
3.2、exec命令
exec是docker中1.3版本开始提供的工具,可以直接在容器中运行命令。还是刚刚那个运行的容器的例子,如果想要进入并启动一个bash:
docker exec -ti 容器ID /bin/bash
3.3、nsenter工具
nsenter工具包含在util-linux 2.23版本及以后,如果系统中的对应包版本较低,可以如下安装新版:。。。。。。
4、删除容器
删除容器使用docker rm命令,格式为:docker rm [OPTIONS] CONTAINER [CONTAINER...]
支持的选项:
- -f、--force=false:因为运行中的容器默认是不能被删除的,这个参数就是强行终止并删除一个运行中的容器。
- -l、--link=false:删除容器的连接,但保留容器。
- -v、--volumes=false:删除容器挂在的数据卷。
docker rm 容器ID
删除运行中的容器:
docker rm -f 容器ID
5、导入导出容器
跟镜像一样,容器也可以导出为一个文件和从文件中导入容器。5.1、导出容器到文件
导出容器是将一个以及从镜像创建为容器的实例导出到一个文件,而不管此时这个容器是否处于运行状态。命令为dicker export,格式:
docker export CONTAINER
一个导出的示例:
docker export 容器ID >导出后的文件名.tar
然后可以将文件发送到其他地方以实现容器的迁移。
5.2、从文件导入容器
对于刚刚导出的容器,对应使用docker import命令导入,然后成为 镜像:cat 文件名.tar | docker import - 镜像名字:TAG
比如:
cat test.tar | docker import - test/ubuntu:v0.0.1
镜像的导入使用的是docker load,下面是两者的区别:
- 容器快照文件将丢失所有的历史记录和元数据信息(仅保存容器的快照状态),所以从容器快照导入时一般会重新指定标签等元数据信息。
- 镜像文件保存完整记录,所以体积页更大。