1、简介
容器是镜像的一个运行实例但它带有额外的可写文件层。容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。 容器 = 镜像 + 可读层。
2、创建容器
docker容器十分轻量级,可以随时创建和删除容器
2.1、新建容器
sudo docker create
-i是为了让容器能接受用户的输入,-t是指定docker为容器创建一个伪终端tty,因为ubuntu这个镜像默认启动的进程是bash,而bash需要tty,否则会异常退出。
此时新建的容器处于停止状态,要用docker start命令来启动它
2.2、新建并启动容器
启动容器有两种方式:基于镜像新建一个容器并启动,另外一个是将在终止状态的容器重新启动。主要命令是
sudo docker run
等价于先执行docker create命令,再执行docker start命令。 此时,docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载。
- 利用镜像创建并启动一个容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟借口到容器中去;
- 从地址池配置一个IP地址给容器;
- 执行用户指定的应用程序;
- 执行完毕后容器被终止
在容器内用ps命令查看进程
2.3、守护态运行
更多的时候,会让docker容器在后台以守护态(Daemonaized)形式运行,用户可以添加-d参数实现。
容器启动后会返回一个唯一的ID,也可以通过docker ps 来查看容器信息
获取容器的输出信息,用docker logs: 显示容器的日志
命令格式:
docker logs CONTAINER
命令参数:
- -f, --follow=false 等待容器后续的输出(类似 tail -f)
- -t, --timestamps=false 显示时间戳
- --tail="all"
例子:
- sudo docker logs 7bb0e258aefe
- sudo docker logs --timestamps=true 7bb0e258aefe
- sudo docker logs --timestamps=true 7bb0e258aefe > 7bb0e258aefe.log
终端A:
- sudo docker logs --follow 7bb0e258aefe
终端B:
- sudo docker attach 708cc7ec0f23 (随便执行一些命令可以看到终端A会有实时输出)
3、终止容器
sudo docker stop [-t|--time[=10]]
首先向容器发送SIGTERM信号,等待一段时间后(默认为10秒),再发送SIGKILL信号终止容器。
docker kill会直接发送SIGKILL信号来强行终止容器
可以查看处于终止状态容器的ID信息
也能让处于终止状态的容器,通过docker start命令重新启动
docker restart命令会将一个运行态的容器终止,然后重新启动;
4、进入容器
用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息。有以下几种方法:
4.1、attach命令
使用attach命令有时候不方便。当多个窗口同时attach到同一个容器的时候,所有窗口会同步显示。当某个窗口因命令阻塞时候,其他窗口也不能操作了。
4.2、exec命令
直接在容器内运行命令,例如进入到刚创建的容器中,并启动一个bash
4.3、nsenter工具
5、删除容器
使用docker rm命令删除处于终止状态的容器
docker rm 【OPTIONS】 CONTAINER 【CONTAINER...】
支持的选项包括:
- -f,--force=false 强行终止并删除一个运行中的容器。
- -l,--link=false 删除容器的连接,但保留容器
- -v, --volumes=false删除容器挂在的数据卷
6、导入和导出容器
6.1、导出容器
导出一个已经创建的容器到一个文件,不管此时之隔容器是否处于运行状态。
sudo docker export CONTAINER > FILE
6.2、导入容器
导出的文件又可以使用docker import命令导入。成为镜像。
docker load和import的区别:
load导入镜像存储文件到本地的镜像库,又可以用import命令来导入一个容器快照到本地镜像库。区别在于容器快照文件仅保存容器当时的快照状态,丢弃所有的历史记录和元数据信息;而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可用重新指定标签等元数据信息