原文出自:http://blog.csdn.net/anxpp/article/details/52476339

123

    容器是Docker的另一个核心概念。

    一般来说,镜像的一个运行实例就是容器,容器提供了一个可写的文件层。

    本文同上一篇介绍镜像一样的结构,逐步介绍容器。

    1、创建容器

    Docker的容器非常轻量级,创建和删除都很容易。

    1.1、新建容器

    新建容器使用docker create命令:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker create -it ubuntu:latest  

    此时创建好的容器处于停止状态,使用docker pa -a可以查看容器列表。

 

    停止的容器可以使用docker start命令启动。

    1.2、启动容器

    启动容器有两种方式:

    1、基于镜像新建容器并启动

    2、启动终止状态的容器

    主要涉及的命令为docker run,等价于先执行docker create,然后执行docker start命令。

    比如:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run ubuntu /bin/bash 'hello word'  

    会启动容器并输出hello word然后自动终止。

 

    利用docker run创建并启动容器时,docker在后台运行的标准操作包括:

 

  • 检查本地是否存在指定的镜像,不存在就从仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去。
  • 从地址池中分配一个IP给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

    下面启动一个bash终端与用户交互:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -t -i ubuntu /bin/bash  

    -t:让docker分配一个伪终端并绑定到容器的标准输入上。

 

    -i:让容器的标准输入保持打开。

    交互模式下用户可以通过所创建的中断来输入命令,这和一般linux的中断使用起来是一样的。

    输入exit或者按ctrl+d可以退出容器。

    对于所创建的bash容器,当使用exit命令退出后,docker容器也会自动终止,因为对于docker来说,没有运行中的应用后,容器也没有必要继续运行了。

 

    1.3、守护态运行

    可以通过-d参数让docker容器在后台以守护态(Daemonized)形式运行。

 

    比如:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -d ubuntu /bin/bash -c "while true;do each hello word; sleep 1 done"  

    使用docker ps命令查看容器信息。

 

    使用docker logs获取容器的输出信息。

 

    2、终止容器

    终止一个运行中的命令是docker stop,格式:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker stop [-t|--time[=10]]  

    这时会首先向容器发送SIGTERM信号,等待一段时间后(默认为10s),再次发送SIGNKILL信号终止容器。

 

    同样的,像刚刚前面说的一样,当Docker容器中指定的应用终结时,容器页自动终止。

    可以通过docker ps命令查看:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker ps -a -q  

    这里参数表示查看所有退出的容器。

 

    容器(被)终止后,可以通过docker start重新启动。

    而docker restart命令,页如我们所料,会首先终止一个运行态的容器,然后再重新启动它。

 

    3、进入容器

    启动容器时若加上参数-d会进入后台,无法直接看到容器中的内容。

 

    如果想进入容器,有多种方法:docker attach命令、docker exec命令以及nsenter工具等。

 

    3.1、attach命令

    这是Docker自带的命令。

    如果我们有如下运行的容器:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker run -idt ubuntu  

    可以这样进入:

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker attach 容器Name  

    但是,当多个窗口(终端)同时attach到一个容器时,所有窗口都会同步显示,当某个窗口因为命令等阻塞后,其他窗口也会被阻塞而不能执行操作。

 

 

    3.2、exec命令

    exec是docker中1.3版本开始提供的工具,可以直接在容器中运行命令。

 

    还是刚刚那个运行的容器的例子,如果想要进入并启动一个bash:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker exec -ti 容器ID /bin/bash  

 

    3.3、nsenter工具

    nsenter工具包含在util-linux 2.23版本及以后,如果系统中的对应包版本较低,可以如下安装新版:

 

。。。。。。

 

    4、删除容器

    删除容器使用docker rm命令,格式为:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker rm [OPTIONS] CONTAINER [CONTAINER...]  

    支持的选项:

 

 

  • -f、--force=false:因为运行中的容器默认是不能被删除的,这个参数就是强行终止并删除一个运行中的容器。
  • -l、--link=false:删除容器的连接,但保留容器。
  • -v、--volumes=false:删除容器挂在的数据卷。

    例如,删除终止状态的容器:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker rm 容器ID  

    删除运行中的容器:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker rm -f 容器ID  

 

    5、导入导出容器

    跟镜像一样,容器也可以导出为一个文件和从文件中导入容器。

 

 

    5.1、导出容器到文件

    导出容器是将一个以及从镜像创建为容器的实例导出到一个文件,而不管此时这个容器是否处于运行状态。

 

    命令为dicker export,格式:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker export CONTAINER  

    一个导出的示例:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker export 容器ID >导出后的文件名.tar  

    然后可以将文件发送到其他地方以实现容器的迁移。

 

 

    5.2、从文件导入容器

    对于刚刚导出的容器,对应使用docker import命令导入,然后成为镜像

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. cat 文件名.tar | docker import - 镜像名字:TAG  

    比如:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. cat test.tar | docker import - test/ubuntu:v0.0.1  

    镜像的导入使用的是docker load,下面是两者的区别:

 

 

  • 容器快照文件将丢失所有的历史记录和元数据信息(仅保存容器的快照状态),所以从容器快照导入时一般会重新指定标签等元数据信息。
  •  镜像文件保存完整记录,所以体积页更大。

 

 

 

小结

    容器是直接提供应用服务的组件,操作都非常轻量级,是docker实现快速的启停和高效服务效能的基础。