容器是Docker第二个核心概念,简单的的说容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。 如果说虚拟机是模拟运行了一整套操作系统(提供运行态环境和其他系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个或一组应用,以及他们的必须运行环境。
新建容器
Docker的容器十分轻量,用户可以随意的创建或删除容器。 可以使用docler create创建一个容器,比如创建一个Mysql的容器:
docker create -it mysql:latest
然后使用ps命令就可以查看所有的容器,不过要加上-a参数,因为create后的容器默认是不开启的。
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f660cfdf9b1 mysql:latest "/entrypoint.sh --na About a minute ago goofy_newton
d8990fec2141 ubuntu:latest "/bin/bash" 3 hours ago Exited (0) 3 hours ago serene_payne
如果要开启这个容器,就需要docker start
docker start 5f660cfdf9b1
在start可以加ID,也可以加容器的名字,可以用--name在创建的时候为容器起名字,如果不起名的话,docker会自动为它分配一个。
新建并启动容器
启动容器的方式有两种,一是创建一个容器并启动这个容器,另一种就是一个将一个处于中止状态的容器重新启动。 如果是创建一个容器并立即启动,就是使用的docker run命令,这个命令等价与docker create 加 docker start。 当用docker run来创建一个容器时,操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂在一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟借口到容器中去
- 从地址池配置一个IP地址给容器
- 执行用户制定的应用程序
- 执行完毕后容器被终止
比如使用ubuntu镜像执行bash终端:
docker run -t -i ubuntu:14.04 /bin/bash
root@ce5e7fe50200:/#
其中-t参数是让docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。 exit或ctrl+D退出之后,容器也就处于了终止状态,因为bash程序结束了。 更多时候,需要容器在后台以守护态运行,可以通过添加-d参数来实现。 比如:
docker run -d ubuntu:14.04
终止容器
可以使用docker stop终止一个正在运行的容器,命令格式为:
docker stop [-t|--time[=10]]
它会首先想容器发送SIGTERM信号,然后等待一段时间(默认10s),再发送SIGKILL信号终止容器。 当然,可以使用docker kill命令直接发送SIGKILL信号强行终止容器。 如果想重新启动一个容器只需要docker restart
进入容器
因为在使用-d参数之后,容器启动之后便会进入后台,用户无法看到容器中的信息,某些时候需要近土容器进行操作,有多种方法进入容器,包括docker attach命令、docker exec命令,以及nsenter工具。
attach命令
docker attach是docker自带的命令,使用简单docker attach 后面跟ID或容器名就可以,不过attach命令有时候并不方便,当多个窗口同时attach到同一个容器的时候,所有的窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也就没法进行别的操作了。
exec命令
这也是昨天看直播的时候讲到的命令,目测很好用,exec是docker 1.3版本提供的工具,可以直接在容器内运行命令,例如进入一个容器并启动一个bash:
docker exec -ti [ID|NAME] /bin/bash
nsenter工具
nsenter是util-linux包2.23版本后包含的工具,并不是docker的自带工具,需要安装util-linux包,使用起来稍麻烦,不打算尝试。
删除容器
使用docker rm指令便可以删除指定容器,语法格式:
docker rm [OPTIONS] CONTAINER[CONTAINER..]
支持的选项包括:
- -f,--force=false 强行终止并删除一个运行中的容器
- -l,--link=false 删除容器链接,但保留容器
- -v,--columes=false删除容器挂载的数据卷
导出容器
导出容器是指导出一个已经创建好的容器到一个文件,不管这个容器是否处于运行状态都可以导出。 使用导出命令docker export命令,该命令使用格式为:
docker export CONTAINER
比如:
docker export boring_galileo > dbserver.tar
可以将这些文件传输到其他机器上,在其他机器通过导入命令实现容器的迁移。
导入容器
导出的文件又可以使用docker import命令导入,成为镜像,例如: 把刚才导出的文件再导入:
cat dbserver.tar | docker import - dbserver:lastest
这个效果和Docker镜像的创建、存出、载入中的基于本地模板导入非常一致。 实际上,既可以通过docker load导出镜像存储文件到本地镜像库,又可以使用docker import命令导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢失所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。