简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。
容器是直接提供应用服务的组件,也是docker实现快速的启停和高效服务性能的基础。
在生产环境中,因为容器自身的轻量级特性,推荐使用容器时在容器前段引入HA(高可靠性)机制,例如HAProxy工具来代理容器访问,这样在容器出现故障时,可以快速切换到其他容器,还可以自动重启故障容器。
创建容器
新建容器
docker create 新建一个容器,使用docker create命令新建的容器处于停止状态,可以使用docker start来启动
新建并启动容器
docker run 等价于先执行docker create 再执行docker start
这个命令会输出一个Hello World之后容器自动终止。和在本地直接执行/bin/echo ‘helo world’ 几乎感觉不出区别。
docker创建并启动容器,标准操作包括:
- 检查本地是否存在指定的镜像,不存在则从公共仓库下载。
- 利用镜像创建并启动一个容器。
- 分配一个文件系统,并在只读的镜像层外面挂在一层可读写层。
- 从宿主机器的网桥接口中桥接一个虚拟接口到容器中去。
- 从地址池分配一个IP地址给容器。
- 执行用户指定的应用程序。
- 执行完毕后容器被终止。
下面的命令则启动一个bash终端,允许用户交互。
其中,-t选项让docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。![$~J54UO01[H9GK{]NU27RDV.png](/uploads/projects/jiarunishiyitoulv@ohsdsy/515801c71b072731773b57e37ee4dd43.png)
在容器中用ps命令查看进程,可以看到只允许了bash应用。
用户可以ctrl+d或输入exit退出容器。退出后,该容器就自动处于终止状态。因为对于docker容器来说,运行的应用退出后,容器也就没有存在的必要了。
守护态运行
更多的时候,需要让容器以守护态运行。 可以通过-d实现。
容器启动后会返回一个唯一的iD,也可以通过docker ps命令查看容器信息
要获取容器的输出信息,可以通过docker logs ID 命令。

此外,当docker容器中指定的应用终结后,容器会自动终止。
docker kill命令会直接发送sigkill信号来强行终止容器。
可以使用docker ps -a -q查看处于终止状态的容器的ID信息。
处于终止状态的容器可以通过docker start 重新启动。
docker restart重启。
进入容器
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息。某些时候如果需要进入容器进行操作,有多种方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等。
attach命令
docker attach是docker自带的命令。
但是并不方便,当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示,当某个窗口因命令阻塞,其它窗口也无法执行操作了。
exec命令
docker 1.3后提供了方便的exec,可以直接在容器内运行命令。
例如进入刚创建的容器,并启动一个bash:

实际上,既可以使用docker load命令来导入镜像存储文件到本地的镜像库,又可以使用docker import命令来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
