简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。
容器是直接提供应用服务的组件,也是docker实现快速的启停和高效服务性能的基础。
在生产环境中,因为容器自身的轻量级特性,推荐使用容器时在容器前段引入HA(高可靠性)机制,例如HAProxy工具来代理容器访问,这样在容器出现故障时,可以快速切换到其他容器,还可以自动重启故障容器。

创建容器

docker的容器十分轻量级,可以随时创建删除。

新建容器

docker create 新建一个容器,使用docker create命令新建的容器处于停止状态,可以使用docker start来启动
U0D4Z1{))}JL%`B794%_JGJ.png

新建并启动容器

docker run 等价于先执行docker create 再执行docker start
%)9R1_3XG4(3CPZF73E_XUE.png
这个命令会输出一个Hello World之后容器自动终止。和在本地直接执行/bin/echo ‘helo world’ 几乎感觉不出区别。
docker创建并启动容器,标准操作包括:

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

下面的命令则启动一个bash终端,允许用户交互。
其中,-t选项让docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。
$~J54UO01[H9GK{]NU27RDV.png
在容器中用ps命令查看进程,可以看到只允许了bash应用。
QHX~T$Q4CR5B)S_Q0I8JXK9.png
用户可以ctrl+d或输入exit退出容器。退出后,该容器就自动处于终止状态。因为对于docker容器来说,运行的应用退出后,容器也就没有存在的必要了。

守护态运行

更多的时候,需要让容器以守护态运行。 可以通过-d实现。
B{)W6(O2WCV)6UNER_ORIB1.png
容器启动后会返回一个唯一的iD,也可以通过docker ps命令查看容器信息
6QR8Q09XXPA{(I%GM(7AOPL.png
要获取容器的输出信息,可以通过docker logs ID 命令。
![$T%RSOD8R)AZ~L{O_Z`122.png

终止容器

docker stop ,格式:docker stop【-t | —time【=10】】他会先向容器发送sigterm信号,等待一段时间后,默认十秒,再发送sigkill信号终止容器。
LB_MFMXBY$%O(@6(VFA8_R2.png
此外,当docker容器中指定的应用终结后,容器会自动终止。
docker kill命令会直接发送sigkill信号来强行终止容器。

可以使用docker ps -a -q查看处于终止状态的容器的ID信息。
A@VN}76@J(YEDUG(5Y_6`Y8.png
处于终止状态的容器可以通过docker start 重新启动。
9P_XT)701(7TO1JBQ4R7CBE.png
docker restart重启。
S`4GH0H3A_6G8B(~8@5{4PU.png

进入容器

在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息。某些时候如果需要进入容器进行操作,有多种方法,包括使用docker attach命令、docker exec命令,以及nsenter工具等。

attach命令

docker attach是docker自带的命令。
但是并不方便,当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示,当某个窗口因命令阻塞,其它窗口也无法执行操作了。
2L%WET~UTW}MS)U20I0ZIZF.png

exec命令

docker 1.3后提供了方便的exec,可以直接在容器内运行命令。
例如进入刚创建的容器,并启动一个bash:
![2U)F}XK%9F((IEKWGBU}(5.png

nsenter工具

nsenter工具在util-linux包2.23版本后包含。如果系统中util-linux包没有该命令,可以按照下面的方法从源码安装:

  1. $ cd /tmp; curl https : / / www .kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz l tar -zxf-; cd util-linux-2.24;
  2. $ ./configure --without-ncurses
  3. $make nsenter && sudo cp nsenter /usr/local/bin

为了使用nsenter连接到容器,还需要找到容器的进程的PID,可以通过下面的命令获取:

  1. PID=$ (docker inspect --format "i{.state.Pid }}"<container>)

通过这个PID,就可以连接到这个容器:

  1. $ nsenter --target $PID --mount --uts --ipc --net --pid

下面给出一个完整的例子:
H15NK_6DVNZ3%$VC4S}H4$R.png

删除容器

docker rm删除处于终止状态的容器。命令格式:docker rm 【options】 container 【container…】

  • -f , —force=false 强行终止并删除一个运行中的容器。
  • -l, —link=false删除容器的连接,但保留容器。
  • -v, —volumes=false 删除容器挂载的数据卷

![1WA}C}W~MF3_EPV)(%3(~K.png

导入导出容器

导出容器

导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。
命令格式:docker export container
分别导出ce554267d7a4容器和e812617b41f6容器到test_for_run.tar文件和test_for_stop.tar文件:

  1. $ sudo docker export ce5 >test_for_run.tar
  2. $ ls
  3. test_for_run.tar
  4. $ sudo docker export e81 >test_for_stop.tar
  5. $ ls
  6. test for run.tar test_for_stop.tar

可将这些文件传输到其他机器上,在其他机器上通过导入命令实现容器的迁移。

导入容器

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