容器
容器是一个大包了应用和服务的环境,是一个轻量级的虚拟机。每一个容器都由一组特定的应用和必要的依赖库组成。
创建容器
docker create
命令docker run
命令
docker create
创建的容器处于停止状态,docker run
不仅创建了容器而且启动了容器(相当于docker create
& docker run
)。
代码示例:
docker ps -a
docker run hello-world
docker ps -a
以上代码中的docker ps -a
表示查看所有的容器。
容器的类型:
- 交互型容器:运行在前台,通常会指定有交互的控制台,可以给容器输入,也可以得到容器的输出。创建该容器的终端被关闭,在容器内部使用exit命令或者调用了
docker stop
、docker kill
命令后,容器会变成停止状态。 - 后台型容器:运行在后台,创建启动之后就与终端无关。即便终端关闭了,该后台也依然存在,只有调用了docker stop或者docker kill命令才能使容器编程停止状态。
创建交互型容器命令:docker run -i -t --name=XXX image名称
-i表示用于打开容器的标准输入,-t告诉Docker为容器建立一个命令行终端
创建后台型容器命令:docker run --name=XXX -d image名称
-d参数用于创建后台型容器
查看容器
docker ps -a命令可以查看当前的所有的容器。
该命令运行后出现了以下各列:
- CONTAINER ID:唯一标识容器的ID
- IMAGE:创建容器时所使用的的镜像
- COMMAND:容器最后运行的命令
- CREATED:创建容器的时间
- STATUS:容器的状态
- PORTS:对外开放的端口
- NAMES:容器名
启动容器
使用docker start
来启动之前已经停止了的容器。
–restart会让容器在退出后能够自动重启。–restart=always表示不管容器返回的是什么,都会重启容器;–restart=on-failure:5表示当容器返回非0时,Docker重启容器,最多尝试重启5次。
终止容器
交互型容器可以输入exit或者ctrl+d组合键来使其退出。
docker stop
命令的默认行为会导致容器退出。docker kill可以强制退出容器。
删除容器
使用命令docker rm
删除容器。
在删除容器的时候,必须先停止然后才能删除
其他常用命令
docker attach
依附命令,通常用在start或restart启动的交互型容器中。docker logs
命令,查看容器日志docker top
命令,查看容器进程docker inspect
命令,用于查看容器的配置docker exec
命令,用于在容器中运行新的任务(后台型任务和交互型任务)docker export
命令,导出容器docker import
命令,导入容器
镜像
镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上。
镜像是容器的运行基础,容器是镜像运行后的形态。
镜像的系统结构
镜像的本质是磁盘上一系列文件的集合。创建新的镜像其实也就是对已有镜像文件进行增、删、改操作。
镜像的写时复制机制
通过docker run
命令运行镜像创建一个容器时,实际上是在该镜像之上创建一个空的可读写文件系统层级。可以将这个文件系统当成一个新的临时镜像,而命令里所指定的镜像称为父镜像。父镜像的内容都是以只读方式挂载进来的,容器会读取共享父镜像的内容。不过一旦需要修改父镜像文件,便会触发Docker从父镜像中复制这个文件到临时镜像中来,所有的修改均发生在你的文件系统中,而不会对父镜像造成任何影响,这就是Docker镜像的写时复制机制。
管理本地镜像
查看
列出本机上的所有镜像: docker images
查看镜像的详细信息:docker inspect 镜像名
下载
可以使用docker run
命令,安装的时候下载,也可以使用docker pull
命令预先下载镜像。
删除
使用命令docker rmi
。
有的时候出现镜像删除不掉的情况,遇到这种情况的很大一部分原因是由于这个镜像被容器所依赖。可以使用-f
参数进行强制删除;或者先将依赖它的镜像和容器移除,然后再删除。
创建本地镜像
第一种方式:使用导入tar包的方式
要求是该tar包是由镜像导出的。
第二种方式:使用commit命令创建本地镜像
通过实例来说明怎么操作的:
docker run -t -i ubuntu
apt-get update
apt-get install sqlite3
echo “test docker commit” >> hellodocker
exit
docker commit -m=”Message” –author=”HingKwan” xxxxxxxx(容器的ID) hingkwan/sqlite3:v1
docker images
docker run -t -i hingkwan/sqlite3:v1
第三种方式:使用Dockerfile创建镜像
这种方法是将需要对镜像进行的操作全部写到一个文件中,然后使用docker build
命令从这个文件中创建镜像。
首先创建如下文件:
|
|
执行命令:docker build -t hingkwan/test:v1 .
或者把Dockerfile保存到git上,然后执行:docker build -t hingkwan/test:v1 git的地址
数据卷
创建数据卷
可以通过两种方法创建数据卷:
- 在Dockerfile中,使用VOLUME指令。
- 在命令行中使用docker run时,使用-v参数来创建数据卷并将其挂载到容器中。
挂载主机目录和文件作为数据卷
我们可以指定宿主主机上的某个目录或者文件作为数据卷。
使用命令示例如:
docker run -d -P –name webapp -v pwd
:/webapp training/webapp python app.py
Dockerfile并不支持挂载本地目录到数据卷,这主要是因为不同操作系统的目录格式不尽系统。为了保证Dockerfile的移植性,所以不支持挂载本地目录到数据卷。
数据卷容器
数据卷容器是指一个专门用于挂载数据卷的容器,以供其他容器引用和使用。它主要用在多个容器需要从一处获得数据时。
使用示例:
docker run -d -v /dbdata –name dbdata training/postgres # 这行代码的意思是建立一个数据容器,名为dbdata;并为该容器新建数据卷/dbdata
docker run -d –volumns-from=dbdata –name db1 training/postgres # 创建容器db1,它引用dbdata的数据卷
数据卷一旦声明,它的生命周期和声明它的那个容器就没有关系了。声明它的容器停止了,数据卷依然存在。一个容器引用一个数据卷容器时,并不要求数据卷容器是运行的。
数据的北方与恢复
利用数据卷容器,还可以进行数据的备份和恢复等。
备份
利用数据卷容器,我们可以备份一个数据卷容器的数据。
docker run -d -v /dbdata –name dbdata training/postgres # 创建一个数据卷容器
docker run –volumns-from dbdata -v $(pwd):/backup ubuntu tar cvf # 将/dbdata中的数据备份到本地,备份后的数据为backup.tar
恢复
docker run -v /dbdata –name dbdata2 ubuntu /bin/bash # 声明一个需要恢复的数据容器。创建了数据卷/dbdata & 名为dbdata2的容器
docker run –volumns-from dbdata2 -v $(pwd):/backup busybox tar xvf # 利用另一个引用它的容器来关联到本地目录,并将本地的数据解压进数据卷中
容器连接
容器连接包括源容器和目标容器:源容器是提供服务的一方,对外提供指定服务;目标容器连接到源容器后,就可以使用其所提供的服务。
连接的格式为--link name:alias
。
docker run -d –name dbdata training/postgres
docker run -d -P –name web –link dbdata:db training/webapp python app.py
使用代理连接,可以解耦两个原本直接相连的容器的耦合性。