Docker容器
Docker容器
容器(container)是docker另一个核心概念,容器是镜像(image)的一个运行实例,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。
创建容器
1、根据给定的镜像,可以使用docker create命令创建一个处于停止状态的容器,当然可以使用docker start命令启动一个容器。
通过docker images命令查看全部本地镜像,使用docker create -it ubuntu:14.04命令创建一个容器,使用docker ps命令查看运行状态的容器,发现并没有刚才创建的容器,说明创建的容器处于停止状态,使用docker ps -a命令查看全部容器,可以看到刚才创建的容器。
其中,-t选项表示让docker分配一个伪终端并绑定到容器的标准输入上,-i选项则让容器的标准输入保持打开。
2、可以使用docker start命令来启动一个已经创建的容器,例如:上面根据ubuntu:14.04镜像创建的容器,可以使用docker start 748ba192f3d4命令启动容器,其中748ba192f3d4为容器ID号。
3、新建并启动容器,可以使用docker run命令创建一个容器并启动该容器,该命令等同于docker create命令和docker start命令一起处理。其中,docker run命令来创建并启动容器,包括的操作如下:
- 检查本地是否存在指定的镜像,如果不存在则从公有仓库下载该镜像;
- 利用镜像创建一个容器,并启动该容器;
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
- 从网桥的地址池配置一个IP地址给容器;
- 执行用户指定的应用程序;
- 执行完毕后容器被自动终止。
例如:使用docker run -it ubuntu:14.04 /bin/bash命令启动一个bash终端。
对于创建的bash容器,当使用exit命令退出之后,容器自动处于退出(Exited)状态。这是因为对docker容器来说,当运行的应用退出后,容器也没有继续运行的必要了。此外,在执行docker run会出错,因为命令无法正常执行容器会直接退出,会返回错误代码,常见的错误代码包括:
- 125:docker daemon执行错误,一般是因为指定了docker不支持命令参数;
- 126:所指定的命令无法执行,一般是权限出错;
- 127:容器内命令无法找到。
4、我们经常可能需要docker容器在后台以守护态(Daemonized)形式运行,可以通过添加-d参数来实现。例如:使用docker run -itd ubuntu /bin/bash命令在后台运行一个容器。
在使用-d参数启动一个容器,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作;需要再次进入容器进行操作,可以使用attach命令或者exec命令(推荐)。
(1)使用docker attach 8c1dafea34c3命令,能够再次进入上面使用守护态运行的ubuntu:14.04容器。
当多个窗口同时用attach命令连到同一个容器时,所有窗口都会同步显示,那么当某个窗口因命令阻塞时,其他窗口也无法执行操作。
(2)使用docker exec -it <container id> /bin/bash命令启动一个刚创建的容器,并启动一个bash。
终止容器
可以使用docker stop命令来终止一个运行中的容器,命令格式为:docker stop [-t|--time[=10]] [container...]
首先向容器发送SIGTERM信号,等待一段超时时间(默认为10秒)后,再发送SIGKILL信号来终止容器。可以使用docker kill命令直接发送SIGKILL信号来强行终止容器。当然,关闭后的容器,可以使用docker start命令来重新启动该容器。对于运行状态的容器,可以使用docker restart命令,先关闭容器,然后启动该容器。
删除容器
可以使用docker rm命令来删除处于终止或者退出状态的容器,对于运行状态的容器,可以使用docker rm -f命令来强行删除该容器。
导入和导出容器
1、导出容器是指导出一个已经创建的容器到一个文件,无论容器是否在处于运行状态,可以使用docker export命令,命令格式为:docker export -o|--output="" container-id。
2、导入容器,可以使用docker import命令导入变成镜像。例如:cat ubuntu_1404.tar | docker import - test/ubuntu:14.04。
docker load命令导入镜像存储文件到本地镜像,docker import命令来导入一个容器快照到本地镜像库,两者之间的区别是:
- 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当前的快照状态),而镜像存储文件将保存完整记录,体积更大;
- 容器快照文件导入时可以重新指定标签等元数据信息。
docker容器先说明到此,后续说明docker另外一个核心仓库(repository)相关的知识点。
注:本文参考《Docker技术入门与实践》第二版。