在一个月之前,恕我孤陋寡闻,我对docker的理解停留于一个英文词汇,dock:船坞,码头;docker:码头工人。等我走上工作岗位一个月之后,我对docker有了更深的理解,当然,还远远不够。
我们先来看一下百度百科的介绍:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。emmm,很抽象对不对,我首先想到的是虚拟机,很显然,docker的机制和虚拟机很像,虚拟机我们知道,你需要安装臃肿的操作系统、虚拟机管理系统、各种依赖和各种应用等,需要更多的硬件资源,而docker的守护进程可以直接与主操作系统通信,为各个docker容器分配资源,还可以将容器与主操作系统隔离,并将各个容器隔离。虚拟机启动需要数分钟,而docker容器在数毫秒内启动,同时大大节省计算机资源。下面盗图一张,直观明了
可能还不够简单明了,举个例子,你需要运输一批各种各样的货物,这批货物堆积在码头(dock)上,这些货物可能易碎不可积压,或者易燃易爆,你需要运输这批货物,在没有其他条件的情况下,你可能需要一趟趟地运输或者一次调动多艘运输船,耗时耗力,一艘艘船就好比是计算机资源,这些货物就是你需要执行的应用程序,它们会互斥,相互影响,你只能按部就班,兴师动众。可是现在情况不同了,这时候你进来了一批集装箱,你可以把这些货物分别装在不同的集装箱里,层层堆积,易碎也好,易燃易爆也好,统统塞进集装箱,一趟一艘运输船搞定。这样是不是很高效,对,这一个个集装箱就是docker容器,它们之间相互隔离,也与船体(计算机资源如操作系统)隔离。什么?不知道哪个箱子装的是啥?没关系,每个集装箱打个编号,这不就是PID或者端口号吗。。。
相信看完上面,你对docker有了一个既专业又通俗的理解了。我们正式开始docker的学习。首先我们需要理解docker仓库、镜像与容器三个概念。还是用上 面的例子。仓库就是堆放货物的码头或者厂房,镜像就是这一批批货物,容器就是一个个集装箱。专业一点,Docker仓库(Repository)类似与代码仓库,是Docker集中存放镜像文件的场所,Docker镜像(Image)类似于虚拟机的镜像,可以将他理解为一个面向Docker引擎的只读模板,包含了文件系统。Docker容器(Container)类似于一个轻量级的沙箱子(因为Docker是基于Linux内核的虚拟技术,所以消耗资源十分少),Docker利用容器来运行和隔离应用。简单介绍一下相关指令:
1.获取镜像
$ docker pull dl.dockerpool.com:5000/ubuntu:14.04
注:dl.dockerpool.com为注册服务器,5000为端口号,ubuntu为仓库名称,14.04是镜像也是版本号
2.查看镜像信息
列出本地主机已有的所有镜像
$ docker images
更改tag信息
$ docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest
000为镜像ID,显示这个镜像的详细信息
$ docker inspect 000
3.搜寻镜像
$ docker search xxx (输出信息包括镜像名字、描述、星级、是否为官方创建、是否自动创建)
4.删除镜像
$ docker rmi dl.dockerpool.com:5000/ubuntu:latest
注:rmi指令,remove images,当有该镜像创建的容器存在时,镜像文件默认是无法删除的,所以删除镜像前最好是删除所有依赖该镜像的容器。当然可以添加参数-f强制删除,不过一般不推荐。
5.创建镜像
有三种方法:
基于已有镜像的容器创建
$ docker commit -m “add new image”-a “” 000(容器ID) test(新建image name)
基于本地模板导入
$ cat ubuntu-14.04-x86_64-minimal.tar.gz | Docker import - ubuntu:14.04
基于dockerfile创建(需要特别注意)
6.存出镜像
$ docker save -o ubuntu_14.04.tar ubuntu:14.04
7.载入镜像
$ docker load –input ubuntu_14.04.tar
或者
docker load < ubuntu_14.04.tar
8.上传镜像
$ docker push user/test:latest
user用户需要在dockerHub网站注册
容器
容器是镜像的一个运行实例,但它带有额外的可写层
1.创建容器
$ docker create -it ubuntu:12.04
2.创建并启动容器
$ docker run -it ubuntu:12.04 /bin/bash
3.守护态运行daemon
$ docker run -d ubuntu:12.04
4.查看容器信息
$ docker ps
5.获取容器的输出信息
$ docker logs cet
cet是容器ID前三个字符
6.终止容器
$ docker stop cet
7.启动容器
$ docker start cet
8.重启容器
$ docker restart cet
9.进入容器
attach命令
$ docker attach nostalgic(nostalgic是docker的name)
缺点:所有窗口同步显示
exec命令
- docker exec -it 243… /bin/bash (243…为docker ID)
nsenter命令
1.找PID
PID=
P
I
D
=
(docker-pid 243..)
2.通过PID链接容器
nsenter−−target
n
s
e
n
t
e
r
−
−
t
a
r
g
e
t
PID –mount –uts –ipc –net –pid
10.删除容器
$ docker rm [-f -l -v] cet
-f 强行终止并删除
-l 删除容器的链接,保留容器
-v 删除挂载的数据卷
11.导出容器
$ docker export cet >test.tar
12.导入容器(将容器快照导入到本地镜像库)
$ cat test.tar | docker import - test/ubuntu:v1.0
重新指定标签为ubuntu的镜像名称,v1.0的版本号
docker load 也可以导入镜像存储文件到本地镜像库,他比import方式的好处是:import导入镜像快照文件将丢失所有的历史记录和元数据信息。
注:通过导出容器和导入容器可以实现容器迁移(拷贝文件)
仓库是集中存放镜像的地方,一个注册服务器上有很多仓库,一个仓库中有很多镜像。
- 登录
$ docker login
- 基本操作
查找、上传、下载
自动创建
查看镜像
http://www.dockerpool.com/downloads
- 更新镜像标签
$ docker tag dl.dockerpool.com:5000/ubuntu:12.04 ubuntu:12.04
1
将前面的镜像更改为ubuntu:12.04
- 创建私有仓库
$ docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registryregistry
1
自动下载并启动registry容器,创建本地的私有仓库服务,默认仓库船舰的容器在/tmp/registry,可以通过-v参数来存放到指定路径上
7.管理私有仓库镜像
假设私有仓库地址为10.0.2.2,端口为5000,
$ docker tag ubuntu:14.04 10.0.2.2:5000/test
更改标签名
$ docker push 10.0.2.2:5000/test
push镜像,会自动push到10.0.2.2地址的机器上
$ curl http://10.0.2.2:5000/v1/search
查看仓库10.0.2.2:5000中是否含有test镜像
docker pull 10.0.2.2:5000/test
指令介绍并不是很详细,很多参数都没有介绍。大家可以自行--help。通过这些指令,我最大的感受就是英语得过硬,很多指令、很多参数实际上就是英文单词或者缩写,并不是去盲目记忆,尤其是参数。不过好记性不如烂笔头,多敲多练习少不了。经过一段时间的学习,只能说对docker有了一个初步的入门,掌握了指令的基本使用,接下来需要在项目中进行实战演练,实现docker进阶。第一次写博客,不足之处还望批评指正,感谢大家!