小娜老师的讲义-Docker基础知识-容器(一)

来源:互联网 发布:yoga lenovo 知乎 编辑:程序博客网 时间:2024/04/29 14:07

今天我们来具体讲一下容器
容器是Docker的另一个核心概念
简单些说,容器是镜像的一个运行实例,但又带有额外的可写文件层
如果把虚拟机认为是模拟运行的一整套操作系统以及跑在上面的应用
那么Docker容器就是独立运行的一个或一组应用,当然包括他们的必须运行环境

在这个部分中,我们将具体介绍围绕容器的具体操作
包括创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导入导出来实现容器迁移等

首先我们讲一下如何创建容器
在第一节课中就已经跟大家强调过,Docker的容器十分的轻量级,在这里就表现在用户可以随时创建或删除容器

我们在新建一个容器的时候可以使用 docker create 命令来创建

docker create -it ubuntu:14.04
这里写图片描述
容器启动后会返回一个唯一的ID,也可以通过docker ps命令来查看容器信息

docker ps -a
这里写图片描述

我们注意到,使用 docker create命令创建的容器处于停止状态,可以使用docker start命令来启动它
这里写图片描述

如果你觉得心累了 手酸了 也可以使用docker run 命令,这是另一种启动容器的方式,等价于先执行docker create,再执行docker start命令
如:当我们执行

docker run ubuntu:14.04 /bin/echo ‘Hello world’
这里写图片描述
发现输出一个Hello world后容器自动终止

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

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

我们再执行

docker run -it ubuntu:14.04 /bin/bash
这里写图片描述
在这条命令中我们启动了一个bash终端,允许用户进行交互
-t选项让Docker分配一个伪终端并绑定到容器的标准输入上
-i则让容器的标准输入保持打开
在交互模式下,用户可以通过所创建的终端来输入命令
如:
这里写图片描述
在容器内用ps命令查看进程时可以看到,容器中只运行了bash应用,并没有运行其他不需要的进程
之后我们用 Crtl+d或exit命令退出容器:
这里写图片描述
对于bash容器,当使用exit命令退出之后,该容器就自动处于终止状态了
这是因为对Docker容器来说,当运行的应用退出之后,容器也就没有继续运行的必要了

不过,更多的时候我们需要Docker容器在后台以守护态运行,也就是在后台运行,我们可以通过添加-d参数来实现

即:

docker run -d ubuntu:14.04 /bin/sh -c “while true; do echo hello world; sleep 1; done”
这里写图片描述
通过docker ps命令来查看容器信息
这里写图片描述

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

docker logs ID
这里写图片描述

好了,创建容器的方法我们讲得差不多了,下面来说一说如何终止一个容器

可以用docker stop 命令来终止一个运行中的容器,
命令格式为:

docke stop [-t|–time[=10]]
执行后首先向容器发送SIGTERM信号,等待一段时间后,再发送SIGKILL信号终止容器,这段时间默认为10秒

当Docker容器中指定的应用终结时,容器也随之自动终止
如刚才我们只启动了一个终端的容器,用户通过exit或Ctrl+d退出时,所创建的容器立刻终止

可以使用docker ps -a -q命令看到处于终止状态容器的id信息
这里写图片描述
然后你又可以用docker start ID来启动它
这里写图片描述
之后又可以用docker restart ID来重启它
这里写图片描述
很虐啊 有木有
好吧 再虐也要查看验证一下
这里写图片描述

然后我们来具体讲一下如何进入容器
刚才我们使用-d参数进入容器时,容器启动后会进入后台,用户无法看到容器中的信息,某些时候如果需要进入容器进行操作的话,我们也有很多种方法,如docker attach、docker exec以及nsenter工具等等

其中docker attach是Docker自带的命令,下面演示下如何使用:

docker run -idt ubuntu:14.04
docker ps
docker attach name
这里写图片描述
不过需要注意的是,多个窗口同时attach到同一个容器的时候,所有的窗口都会同步显示,但如果此时某个窗口因命令而阻塞。那么其他窗口也不能继续执行了,所以有时候attach命令并不方便,所以我几乎就没怎么用过它

Docker自1.3版本起,就提供了一个更加方便的工具—-exec,可以直接在容器中运行命令,
如:

docker exec -it ID /bin/bash
这里写图片描述
进入到刚刚创建的容器,并启动了一个bash

然后我们再讲一下nsenter工具,此工具在util-linux包2.23版本后都有,如果你的系统里面没有这个命令,可以以源码方式安一个
具体操作:

cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
./configure –without-ncurses
make nesenter && cp nsenter /usr/local/bin

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

PID=$(docker inspect –format “{{.State.Pid}}” )

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

nsenter –target
这里写图片描述
PID –mount –uts –ipc –net –pid

下面给出一个完整的例子:

docker run -idt ubuntu:14.04
docker ps
PID=$(docker-pid )
这里写图片描述

nsenter –target PID –mount –uts –ipc –net –pid
这里写图片描述
这里解析失败了?
没关系,我们来点暴力的,直接用inspect来获取pid
这里写图片描述
再执行一次:
这里写图片描述
ok了
通过ps -ef 命令查看容器中的进程:
这里写图片描述
进入容器的三种方式就讲到这里了

2 0
原创粉丝点击