容器是由镜像创建的运行实例,可以看成是一个简易版的Linux环境,其本质是宿主机上的进程。每个容器是相互隔离的,用户可以启动、停止、创建、删除容器。
Docker通过namespace实现资源隔离,同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知,这样一来就实现了独立和隔离的目的。
1.启动容器
1、 利用镜像新建并启动一个容器
$ docker run –i –t ubuntu:12.04 /bin/bash
对比可以发现,其中-i是打开容器的标准输入,-t是分配一个伪终端并绑定到容器的标准输入上。
2、 守护态运行容器,即在后台以守护态形式运行。
$ docker run –d ubuntu:12.04 /bin/sh –c “while true; do echo hello fc;sleep 1;done”
创建、启动容器后执行命令,循环打印“hello fc”,可以使用“docker logs [容器名称]”来查看容器输出的信息。
更多的参数介绍可以通过docker run –help查询。
使用docker run创建容器时,后台会进行如下操作:
- 检查指定的镜像是否存在,不存在就从公有仓库下载
- 利用镜像创建并启动一个容器
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中
- 从地址池配置一个ip给容器
- 执行用户指定的应用程序
- 执行完毕后终止容器
虽然后台会进行这一系列的操作,但容器的速度依旧很快,是当之无愧的轻量级,使用docker创建容器并执行/bin/echo ‘hello’与直接在本地执行命令的速度几乎差不多。
3、 启动一个处于停止状态的容器
$ docker start [容器id]
注:使用docker run命令创建并启动一个容器,如果命令出错只创建容器但没有运行,再次用docker start启动时,会报出同样的错误。
2.进入容器
1、 使用attach命令
$ docker attach [容器名称]
使用attach命令也有不足之处,多个终端同时登录一个容器时,所有窗口会同步显示。
2、 使用nsenter
3.导入导出容器
1、 从本地导出一个容器
$ docker export [容器id] > [文件名]
2、 将导出的文件再导入为镜像
$ cat [文件名] | docker import [repository:tag]
4.export-import和save-load
export用于存入存出容器,而save用于导出镜像。镜像类似于安装配置好的虚拟机镜像,利用这个镜像可以启动多个镜像实例,而这样的镜像实例就是容器。容器和镜像可以相互转换,镜像可以创建容器,容器修改后也可以生成新的镜像。
save-load过程中容器id保持不变,也就是镜像存出、存入,依旧是同一个镜像。
1、利用某个镜像创建一个容器
$ docker run -t -i ubuntu:12.04 /bin/bash
2、利用commit命令将修改后的容器变成一个新镜像
$ docker commit 3aa901b9b85b ubuntu-1
3、将容器导出为文件
$ docker export 3aa901b9b85b > ./ubuntu00.tar
4、将该容器生成的新镜像存为文件
$ docker save ubuntu-1 > ./ubuntu01.tar
5、查看这两个文件的大小,发现由镜像save的文件稍微大一点
6、重新将这两个文件导入为镜像
$ cat ./ubuntu00.tar |docker import - ubuntu00:v1
$ docker load < ./ubuntu01.tar
7、查看这两个镜像的层级关系
可以看出save保存的文件导入为镜像后可以查看历史,而export保存的文件导入为镜像后不可以回滚之前的层。简而言之,save保存所有数据,export导出当前状态。