docekr镜像相关的操作有哪些

发布时间:2021-12-13 15:15:30 作者:小新
来源:亿速云 阅读:128

这篇文章将为大家详细讲解有关docekr镜像相关的操作有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

##获取镜像

我们使用__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
...

让我们来看看列出的字段各自的含义:

注:镜像的ID是镜像的唯一标示,上面出现了ubuntu:14.0与ubuntu:trusty ID号相同的情况,这说明,他们是同一个镜像。

###创建镜像

创建镜像的方式有很多种:

####修改已有的镜像

通过修改已有镜像的方式创建镜像我们首先需要在已有镜像中做修改,然后提交修改(更新)后的镜像。

启动需要修改的镜像:

$ 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

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

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 上构建的容器也是利用了类似的原理。

关于“docekr镜像相关的操作有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

推荐阅读:
  1. Docker 镜像操作
  2. socket的相关操作

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:审计Kubernetes RBAC策略的方法是什么

下一篇:如何进行python二叉树的层次遍历

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》