docekr镜像相关的操作有哪些
这篇文章将为大家详细讲解有关docekr镜像相关的操作有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
##获取镜像
我们使用__docker pull__指令获取镜像。镜像的获取源有三种:Docker官方仓库,第三方Docker仓库,本地私有仓库。
###Docker官方仓库
下面的例子将从Docker Hub下载一个Ubuntu12.04操作系统镜像
$ docker pull ubuntu:12.04Pulling repository ubuntuab8e2728644c: Pulling dependent layers511136ea3c5a: Download complete5f0ffaa9455e: Download completea300658979be: Download complete904483ae0c30: Download completeffdaafd1ca50: Download completed047ae21eeaf: Download complete
Docker pull工具会输出每一层的获取信息,包括当前获取内容的大小,传输的速度,传输状态。
上面的__docker pull ubuntu:12.04__实际上执行了
$ sudo docker pull registry.hub.docker.com/ubuntu:12.04
其中__registry.hub.docker.com__是仓库注册服务器,ubuntu是指仓库,12.04是指tag。即从注册服务器 registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。
有时候从官方仓库下载比较慢,这是我们可以使用第三方仓库加快我们的下载速度。
###第三方Docker仓库
明白了上面pull完整选项含义之后我们就非常容易理解下面这条从第三方仓库下载镜像的指令
docker pull dl.dockerpool.com:5000/ubuntu:12.04Pulling dl.dockerpool.com:5000/ubuntuab8e2728644c: Pulling dependent layers511136ea3c5a: Download complete5f0ffaa9455e: Download completea300658979be: Download complete904483ae0c30: Download completeffdaafd1ca50: Download completed047ae21eeaf: Download complete
从注册服务器 dl.dockerpool.com:5000 中的 ubuntu 仓库来下载标记为 12.04 的镜像。
###私有仓库
好吧,这块我自己还不太懂,有机会搭建一个私有仓库,再来补充
##管理本地镜像
###初次使用镜像
镜像下载完成之后,就可以使用该镜像了,使用__docker run__启动一个容器来使用镜像。
docker run -t -i ubuntu:12.04 /bin/bash
如果成功启动了,接着会进入bash
root@fe7fc4bd8fc9:/#
###列出本地镜像
要想查看本地镜像,使用__docker images__
docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 12.04 74fe38d11401 4 weeks ago 209.6 MBubuntu precise 74fe38d11401 4 weeks ago 209.6 MBubuntu 14.04 99ec81b80c55 4 weeks ago 266 MBubuntu latest 99ec81b80c55 4 weeks ago 266 MBubuntu trusty 99ec81b80c55 4 weeks ago 266 MB...
让我们来看看列出的字段各自的含义:
REPOSITORY: 仓库名称
TAG: 镜像的标记
IMAGE ID: 镜像ID号(唯一)
CREATED: 创建时间
VIRTUAL SIZE: 镜像大小
注:镜像的ID是镜像的唯一标示,上面出现了ubuntu:14.0与ubuntu:trusty ID号相同的情况,这说明,他们是同一个镜像。
###创建镜像
创建镜像的方式有很多种:
修改已有的镜像
利用Dockerfile创建镜像
从本地文件系统导入
上传镜像
####修改已有的镜像
通过修改已有镜像的方式创建镜像我们首先需要在已有镜像中做修改,然后提交修改(更新)后的镜像。
启动需要修改的镜像:
$ sudo docker run -t -i ubuntu:12.04 /bin/bashroot@0b2616b0e5a8:/#
暂时记住容器的ID,即:0b2616b0e5a8,稍后会用到。
在容器中添加 json 和 gem 两个应用:
# gem install json
当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本。
$ docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v24f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
其中,-m 指定提交的说明信息,跟我们使用的版本控制工具类似;-a 指定更新的用户信息;后面是镜像的 ID ,仓库名以及tag标签。最后创建成功后回返回这个镜像的 ID 信息。
然后,我们用 docekr images 来查看我们修改后的镜像。
$ docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEtraining/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MBouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MBouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 M
之后,就可以使用新的镜像来创建容器。
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bashroot@78e82f680994:/#
####利用Dockerfile创建镜像
使用修改现有镜像的方式创建镜像很简单快速,但是这种方式不便于在团队中分享。我们可以使用__docker build__来创建镜像,使用__docker build__创建镜像,需要首先写好__Dockerfile__配置文件。Dockerfile中正是包含了一步步创建镜像所需要的指令。
新建一个目录和dockerfile文件:
$ mkdir sinatra$ cd sinatra$ touch Dockerfile
接下来,我们往Dockerfile中写内容:
#This is a commentFROM ubuntu:12.04MAINTAINER Docker NewbeeRUN apt-get -qq updateRUN apt-get -qqy install ruby ruby-devRUN gem install sinatr
先看看上面这些内容如何理解:
#用来注释
FROM 指令告诉 Docker 使用哪个镜像作为基础
接着是维护者的信息
RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件
Dockerfile 中每一条指令都创建镜像的一层。
编写完Dockerfile之后,我们就可以使用docker build来生成镜像。
$ docker build -t="ouruser/sinatra:v2" .Uploading context 2.56 kBUploading contextStep 0 : FROM ubuntu:14.04 ---> 99ec81b80c55 Step 1 : MAINTAINER Newbee---> Running in 7c5664a8a0c1 ---> 2fa8ca4e2a13 Removing intermediate container 7c5664a8a0c1Step 2 : RUN apt-get -qq update ---> Running in b07cc3fb4256 ---> 50d21070ec0c Removing intermediate container b07cc3fb4256Step 3 : RUN apt-get -qqy install ruby ruby-dev ---> Running in a5b038dd127e Selecting previously unselected package libasan0:amd64.(Reading database ... 11518 files and directories currently installed.)Preparing to unpack .../libasan0_4.8.2-19ubuntu1_amd64.deb ...Setting up ruby (1:1.9.3.4) ...Setting up ruby1.9.1 (1.9.3.484-2ubuntu1) ...Processing triggers for libc-bin (2.19-0ubuntu6) ... ---> 2acb20f17878 Removing intermediate container a5b038dd127eStep 4 : RUN gem install sinatra ---> Running in 5e9d0065c1f7 . . .Successfully installed rack-protection-1.5.3Successfully installed sinatra-1.4.54 gems installed ---> 324104cde6ad Removing intermediate container 5e9d0065c1f7Successfully built 324104cde6ad
-t 是用来添加tag标记,指定新的镜像的用户信息,"."是Dockerfile所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。
可以看到 build 进程在执行操作。它要做的第一件事情就是上传这个 Dockerfile 内容,因为所有的操作都要依据 Dockerfile 来进行。 然后,Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。
注意一个镜像不能超过 127 层
关于dockerfile更详细的语法,后面会有一片博文坐专门的讲解。
####从本地文件系统导入
要从本地文件系统导入一个镜像,可以使用openvz(容器虚拟化的先锋技术)的模板来创建:openvz 的模板下载地址为 templates 。
比如,先下载了一个 ubuntu-14.04 的镜像,之后使用以下命令导入:
cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
然后查看新导入的镜像。
docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB
####上传镜像
用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。
$ sudo docker push ouruser/sinatraThe push refers to a repository [ouruser/sinatra] (len: 1)Sending image listPushing repository ouruser/sinatra (3 tags)
###导出与导入镜像
####到处镜像
要想将镜像到处到本地,使用docker save命令:
docker images$ docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEubuntu 14.04 c4ff7513909d 5 weeks ago 225.4 MB...$ docker save -o ubuntu_14.04.tar ubuntu:14.04
####导入镜像
可以使用 docker load 从导出的本地文件中再导入到本地镜像库,例如
$ docker load --input ubuntu_14.04.tar
或
$ docker load < ubuntu_14.04.tar
这将导入镜像以及其相关的元数据信息(包括标签等)。
###移除本地镜像
如果要移除本地的镜像,可以使用 docker rmi 命令。注意 docker rm 命令是移除容器。
$ docker rmi training/sinatraUntagged: training/sinatra:latestDeleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8dDeleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22fDeleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
注意:在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。
##镜像的实现原理
Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去。
通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。 Docker 在 AUFS 上构建的容器也是利用了类似的原理。
关于"docekr镜像相关的操作有哪些"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。