Docker之容器的使用(四)

容器

容器是Docker的另一个核心概念。
简单来说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。
如果认为虚拟机是模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个或一组应用,以及他们的必需运行环境。

创建容器

Docker的容器十分轻量级,用户可以随时创建或删除容器。

新建容器
可以使用docker create 命令新建一个容器,例如:

$ sudo docker create -it ubuntu:latest
adf5fad79da96843938ecc53d81135e01dd9c8c6950f60923d78877a58be696c
$ sudo docker ps -a

使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。

新建并启动容器
启动容器有两种方式,一种是基于镜像新建一个容器一个容器并启动,另外一个是将终止状态的容器重新启动。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。
例如,下面的命令输出一个“Hello World”,之后容器自动终止:

$ sudo docker run ubuntu /bin/echo ‘Hello World’
Hello World

这跟在本地直接执行 /bin/echo 'Hello World’几乎感觉不出任何区别。
当利用docker run 来创建并启动容器时,Docker在后台运行的标准操作包括:

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

下面的命令则启动一个bash终端,允许用户进行交互:

$ sudo docker run -t -i ubuntu:latest /bin/bash

其中,-t选项让Docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。

在交互模式下,用户可以通过所创建的终端来输入命令,例如:

$ root@0a6118d46284:/# pwd
/
$ root@0a6118d46284:/# ls

使用exit退出容器,当退出后,该容器就自动处于终止状态。

守护态运行
更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。用户可以通过添加-d参数来实现。
例如下面的命令会在后台运行容器:

$ sudo docker run -d ubuntu /bin/sh -c ‘while true;do echo hello world;sleep 1;done’
b52f377ff72f357cbbcacb91caf5f6791e58ae60ae4df81d1da770d3e11f2fc3

容器启动后会返回一个唯一的ID,也可以通过docker ps命令来查看容器信息:

$ sudo docker ps

要获取容器的输出信息,可以通过docker logs命令:

$ sudo docker logs b52
hello world
hello world
hello world

终止容器

可以使用docker stop来终止一个运行中的容器。它会首先向容器发送SIGTERM信号,等待一段时间后(默认为10秒),再发送SIGKILL信号来终止容器。
此外,当Docker容器中指定的应用终结时,容器也自动终止。

$ sudo docker stop b52

注意:docker kill 命令会直接发送SIGKILL信号来强行终止容器。

可以使用docker ps -a -q命令看到处于终止状态的容器的id信息。例如:

$sudo docker ps -a -q
b52f377ff72f
0a6118d46284
9056ee6ffb79
adf5fad79da9

处于终止状态的容器,可以通过docker start命令来重新启动
此外,docker restart命令会将一个运行状态的容器终止,然后在重新启动它:
$ sudo docker restart b52

进入容器

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

$ sudo docker run -idt ubuntu
02a7e98974a2f7786bdde6875287920243e7e7cfd2e088cf67962bd8bc87eadb
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
02a7e98974a2 ubuntu “/bin/bash” 17 seconds ago Up 15 seconds hopeful_shockley
$ sudo docker attach hopeful_shockley

但是使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

exec命令
Docker自1.3版本起,提供了一个更加方便的工具exec,可以直接在容器内运行命令。例如进入到刚创建的容器中,并启动一个bash:

$ sudo docker exec -ti 02a7e98974a2 /bin/bash

删除容器

可以使用docker rm命令删除处于终止状态的容器。
例如,查看处于终止状态的容器并删除:

$ sudo docker ps -a
$ sudo docker rm 02a7e98974a2

如果要删除一个运行中的容器,可以添加-f参数。Docker会发送SIGKILL信号给容器,终止其中的应用:

$ sudo docker rm -f 02a7e98974a2

导入和导出容器

导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令。

$ sudo docker export 02a >test_first.tar
$ls
test_first.tar

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

导入容器
导出的文件又可以使用docker import命令导入,成为镜像,例如:

$ cat test_first.tar | sudo docker import - test/ubuntu:v1.0

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

生产环境中,因为容器自身的轻量级特性,我们可以在使用容器时在容器前段引入HA(高可靠性)机制,例如使用HAProxy工具来代理容器访问,这样在容器出现故障时候,可以快速切换到其他容器,还可以自动重启故障容器。

猜你喜欢

转载自blog.csdn.net/huang_yong_peng/article/details/82929426
今日推荐