容器是docker的另一个核心概念。简单的说,容器是镜像的一个运行实例。所不同的
是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,容器就是独立运行的一
个或一组应用以及它们所必需的运行环境,包括文件系统、系统类库、shell环境等。本节
将具体介绍围绕容器的重要操作,包括创建一个容器、启动容器、终止一个容器、进入容器
内执行操作、删除容器和通过导入导出容器来实现容器迁移等。
1、创建容器
1)新建容器
可以使用docker create命令新建一个容器,例如:
-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上-i
让容器的标准输入保持打开(即交互式)还可以使用--name给容器起个形象的名称
2)启动容器
使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。
3)新建并启动容器
可以直接新建并启动容器,所需命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。下面的命令输出一个“Hello World”,之后终止容器。
这跟在本地直接执行 /bin/echo 'hello world' 几乎感觉不出任何区别.当利用docker run 来创建容器时,Docker 在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从网桥的地址池配置一个IP地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
下面的命令则启动一个 bash 终端,允许用户进行交互。
在交互模式下,用户可以通过所创建的终端来输入命令,例如
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用ps或 top 来查看进程信息。
可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。
如果这个时候我们正常退出,输入exit 或者Ctrl+d命令后,容器就自动处于退出(Exited)状态了。docker ps –a 查看容器处于Exit 状态。
也可以退出容器而不结束容器进程,输入 Ctrl-q + Ctrl-p , 就像先按 CTRL -p 然后CTRL –q 退出伪终端,而不结束容器。
发现退出容器了,但是容器依然在运行,可以随时进入容器:
4)守护态运行
更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,
可以通过添加 -d 参数来实现。例如下面的命令会在后台运行容器。
此时,如果要获取容器的输出信息,可以使用docker logs命令
容器启动后会返回一个唯一的 id,也可以通过docker ps命令来查看容器信息。
docker run -d
运行一个新的容器,我们通过-d命令让他作为一个后台运行centos:centos6
是一个我们想要在内部运行命令的镜像/bin/sh -c
是我们想要在容器内部运行的命令while true; do echo hello world; sleep 1; done
这是一个简单的脚本,我们仅仅只是每秒打印一次 hello word 一直到我们结束它.或者:
然后使用docker ps命令查看启动的容器:
常用容器操作命令:
docker stop d17f8988a49e
停止一个容器
docker start d17f8988a49e
启动一个容器
docker restart d17f8988a49e
重启一个容器
docker inspect d17f8988a49e
查看容器详细信息
可以使用inspect查看容器IP地址:
docker inspect -f '{{.NetworkSettings.IPAddress}}'
d17f8988a49e
还可以查看主机名
进入容器
在使用 -d 参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,有很多种方法,包括使用docker attach 命令或nsenter命令。
使用docker attach进入容器
1.docker attach 允许我们进入后台进程.
2.--sig-proxy=false
不使用容器转发信号,允许我们使用 ctrl -c
来退出,执行docker
ps
查看在后台运行
但是使用 attach命令有时候并不方便。当多个窗口同时attach 到同一个容器的时候,所
有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
也可以执行docker exec
进入运行的容器
docker exec -it
容器ID/名称 /bin/bash
以上命令返回一个命令界面,exec代表直接在容器中运行命令
使用nsenter进入容器
安装
nsenter工具在util-linux包2.23版本后包含。如果系统中util-linux包没有该命令,可以按照
下面的方法从源码安装
wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
tar util-linux-2.24.tar.gz
cd util-linux-2.24
./configure --without-ncurses && make nsenter
cp nsenter /usr/local/bin
nsenter可以访问另一个进程的名字空间。nsenter要正常工作需要有 root 权限
centos7使用的是util-linux-2.23,所以就直接使用系统提供的util-linux包了。