Docker镜像
博客专区 > Anoxia_W 的博客 > 博客详情
Docker镜像
Anoxia_W 发表于3年前
Docker镜像
  • 发表于 3年前
  • 阅读 188
  • 收藏 4
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 本文主要介绍docekr镜像相关的操作,包括从镜像注册服务器下载镜像,管理本地镜像,手动创建镜像,导出导入镜像,移除镜像。

生活在云时代的程序员真是很幸福,各种各样丰富的开发工具可选。既然生活在云时代,那么,程序员就应该用云思维来进行开发,本系列文章就是基于Docker开发学习和总结笔记。

系列文章将会按照docker使用的进度作为主线,分为:

docker基础知识 -> Docker构建个人开发环境 -> Docker使用进阶 -> Docker集群

由简单到复杂。

##系列文章目录

  • Docker简介
  • Docker安装
  • Docker基本概念
  • Docker镜像
  • Docker容器
  • Docker仓库
  • Docker数据管理及网络使用
  • 使用Docker构建开发环境

##关于作者

Anoxia程序员,PHP,Shell,UI设计,Linuxer
weibo@鸡蛋鸭蛋狗蛋鹅蛋
bloghttp://anoxia.coloroud.com
emailwindorman@gmail.com

转载请注明出处:http://anoxia.coloroud.com


本文主要介绍docekr镜像相关的操作,包括从镜像注册服务器下载镜像,管理本地镜像,手动创建镜像,导出导入镜像,移除镜像。

##本文内容:

  • 获取镜像
    • Docker官方仓库
    • 第三方Docker仓库
    • 私有仓库
  • 管理镜像
    • 初次使用镜像
    • 列出本地镜像
    • 创建镜像
    • 导出与导入镜像
    • 移除镜像
  • 镜像实现原理

##获取镜像

我们使用__docker pull__指令获取镜像。镜像的获取源有三种:Docker官方仓库第三方Docker仓库本地私有仓库

###Docker官方仓库

下面的例子将从Docker Hub下载一个Ubuntu12.04操作系统镜像

$ docker pull ubuntu:12.04
Pulling repository ubuntu
ab8e2728644c: Pulling dependent layers
511136ea3c5a: Download complete
5f0ffaa9455e: Download complete
a300658979be: Download complete
904483ae0c30: Download complete
ffdaafd1ca50: Download complete
d047ae21eeaf: 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.04
Pulling dl.dockerpool.com:5000/ubuntu
ab8e2728644c: Pulling dependent layers
511136ea3c5a: Download complete
5f0ffaa9455e: Download complete
a300658979be: Download complete
904483ae0c30: Download complete
ffdaafd1ca50: Download complete
d047ae21eeaf: 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 images
REPOSITORY       TAG      IMAGE ID      CREATED      VIRTUAL SIZE
ubuntu           12.04    74fe38d11401  4 weeks ago  209.6 MB
ubuntu           precise  74fe38d11401  4 weeks ago  209.6 MB
ubuntu           14.04    99ec81b80c55  4 weeks ago  266 MB
ubuntu           latest   99ec81b80c55  4 weeks ago  266 MB
ubuntu           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/bash
root@0b2616b0e5a8:/#

暂时记住容器的ID,即:0b2616b0e5a8,稍后会用到。

在容器中添加 json 和 gem 两个应用:

# gem install json

当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本。

$ docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,-m 指定提交的说明信息,跟我们使用的版本控制工具类似;-a 指定更新的用户信息;后面是镜像的 ID ,仓库名以及tag标签。最后创建成功后回返回这个镜像的 ID 信息。

然后,我们用 docekr images 来查看我们修改后的镜像。

$ docker images
REPOSITORY          TAG     IMAGE ID       CREATED       VIRTUAL SIZE
training/sinatra    latest  5bc342fa0b91   10 hours ago  446.7 MB
ouruser/sinatra     v2      3c59e02ddd1a   10 hours ago  446.7 MB
ouruser/sinatra     latest  5db5f8471261   10 hours ago  446.7 M

之后,就可以使用新的镜像来创建容器。

$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#

####利用Dockerfile创建镜像

使用修改现有镜像的方式创建镜像很简单快速,但是这种方式不便于在团队中分享。我们可以使用__docker build__来创建镜像,使用__docker build__创建镜像,需要首先写好__Dockerfile__配置文件。Dockerfile中正是包含了一步步创建镜像所需要的指令。

新建一个目录和dockerfile文件:

$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile

接下来,我们往Dockerfile中写内容:

#This is a comment
FROM ubuntu:12.04
MAINTAINER Docker Newbee <newbee@docker.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatr

先看看上面这些内容如何理解:

  • #用来注释
  • FROM 指令告诉 Docker 使用哪个镜像作为基础
  • 接着是维护者的信息
  • RUN开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件

Dockerfile 中每一条指令都创建镜像的一层。

编写完Dockerfile之后,我们就可以使用docker build来生成镜像。

$ docker build -t="ouruser/sinatra:v2" .
Uploading context  2.56 kB
Uploading context
Step 0 : FROM ubuntu:14.04
 ---> 99ec81b80c55
 Step 1 : MAINTAINER Newbee <newbee@docker.com>
 ---> Running in 7c5664a8a0c1
 ---> 2fa8ca4e2a13
 Removing intermediate container 7c5664a8a0c1
Step 2 : RUN apt-get -qq update
 ---> Running in b07cc3fb4256
 ---> 50d21070ec0c
 Removing intermediate container b07cc3fb4256
Step 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 a5b038dd127e
Step 4 : RUN gem install sinatra
 ---> Running in 5e9d0065c1f7
 . . .
Successfully installed rack-protection-1.5.3
Successfully installed sinatra-1.4.5
4 gems installed
 ---> 324104cde6ad
 Removing intermediate container 5e9d0065c1f7
Successfully 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 images
REPOSITORY       TAG       IMAGE ID        CREATED        VIRTUAL SIZE
ubuntu           14.04     05ac7c0b9383    17 seconds ago 215.5 MB

####上传镜像

用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。

$ sudo docker push ouruser/sinatra
The push refers to a repository [ouruser/sinatra] (len: 1)
Sending image list
Pushing repository ouruser/sinatra (3 tags)

###导出与导入镜像

####到处镜像

要想将镜像到处到本地,使用docker save命令:

docker images
$ docker images
REPOSITORY        TAG        IMAGE ID        CREATED        VIRTUAL SIZE
ubuntu            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/sinatra
Untagged: training/sinatra:latest
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0

注意:在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器。

##镜像的实现原理

Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去。

通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。 Docker 在 AUFS 上构建的容器也是利用了类似的原理。

标签: Docker镜像
共有 人打赏支持
粉丝 4
博文 6
码字总数 14445
×
Anoxia_W
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: