第4章 使用Docker镜像和仓库

回顾:

回顾如何使用 docker run 创建最基本的容器

$sudo docker run -i -t --name another_container_mum ubuntu /bin/bash

root@3d49f5830c81:/#

这条命令会启动一个新的名为 another_container_mum 的容器,这个容器基于ubuntu镜

像并且会启动Bash Shell

---------------------------------------------------------------------------------------------

4.1 什么是 Docker 镜像

4.2 列出镜像


可以看出我这里有三个镜像。

其中 ubuntu 是我上午下载的 ubuntu 基础镜像,paulcos11/docker-tutorial 是下载的另外

一个用户上传的镜像。但是不知道 CREATED 这一栏的时间怎么不准。

镜像从仓库下载下来。镜像保存在仓库中。而仓库存在于Registry中。默认的Registry是由Do

cker公司运营的公共 Registry 服务,即是 Dcoker Hub。

每个镜像库都可以存放很多镜像,例如我们查看一下ubuntu仓库中的其他镜像,

可是使用 docker images 查看所有的 ubuntu docker 镜像

sudo docker images

可以使用docker pull下载某个基础镜像

[#12#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker pull ubuntu

Docker Hun 中有两种类型仓库:用户仓库和顶层仓库。用户仓库的镜像都是有Docker用户

创建的,而顶层仓库则是由Docker内部的人来管理的。用户仓库的命名由用户名和仓库名两

部分组成,如:paulcos11/docker-tutorial,用户名:paulcos11,仓库名:docker-tutor

ial,与其相对的顶层仓库只包含仓库名部分,例如 ubuntu,fedora。顶层仓库由Docker公

司和由选定的能提供优质基础镜像的厂商管理。

4.3 拉取镜像

使用docker images可以查看本地Docker宿主机上面的镜像。如果希望能在镜像列表中只看

到某个镜像的内容,例如 fedora,可以通过在 docker images 命令后面跟指定的镜像名来实

现,例如:

使用 docker pull 拉取镜像

[#15#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker pull fedora

Using default tag: latest

latest: Pulling from library/fedora

6888fc827a3f: Pull complete

9bdb5101e5fc: Downloading [===================>                               ] 28.63 MB/74.33 MB

4.4 查找镜像

我本地的镜镜像有:

[#1#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker images

[sudo] password for cloudsoar:

REPOSITORY                         TAG                 IMAGE ID               CREATED             VIRTUAL SIZE

paulcos11/docker-tutorial   latest              e37931352714        8 days ago          587.8 MB

ubuntu                                  latest              8ed581e3fa7a        11 days ago         188 MB

此时 fedora 镜像还是没有下载完毕的。不着急。我们先练习其他的操作,在 paulcos11/do

cker-tutorial 镜像中使用 docker run 命令来从 docker-tutorial 创建一个容器。

[#2#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t paulcos11/docker-tutorial /bin/bash

root@869a3b2049ad:/#

可以看到,已经从 paulcos11/docker-tutorial 镜像启动了一个新的容器。

4.5 构建镜像

构建 Docker 镜像有以下两种方法:

使用 docker commit 命令。

使用 docker build 命令和 Dockerfile 文件。

4.5.1 创建 Docker Hub 账号

在 hub.docker.com 创建一个自己的账号,注册之后通过收到的确认邮件激活,下面就可以测

试刚才注册的账号是否可以工作了。要登录到 docker hub,可以使用 docker login 命令。如

这里看到我是注册成功了,用户名只能是字母或者数组的组合。下面使用 docker login 来验证

我的账号:

[#4#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker login

Username: zhiyewang

Password:

Email: zhiye_wang@yeah.net

WARNING: login credentials saved in /home/cloudsoar/.docker/config.json

Login Succeeded

可以看到我的账号登录成功了。

4.5.2 使用 Docker 的 commit 命令创建镜像

这里我基于前面下载的 ubuntu 镜像来创建一个新镜像。

首先我在这个基础镜像中启动一个容器

[#5#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t ubuntu /bin/bash

root@460f5a1ac42a:/#

在容器中安装个 Apache 作为一个 web 服务器来运行。这样每次使用 Apache 的时候不用再

重新安装 Apache 了。

root@460f5a1ac42a:/# apt-get -y install apache2

Reading package lists... Done

Building dependency tree

root@460f5a1ac42a:/# apt-get -y install vim

我喜欢用vim,同时又安装了一个 vim,哇咔咔。

为了完成此项工作,需要先退出 exit ,然后执行 docker commit 命令。

这里需要注意的是, docker commit 提交的是创建容器的镜像与容器的当前状态之间有差异

的部分,这使得该更新非常轻量。这里可以看到我创建的结果。


如果像从刚才创建的镜像运行一个容器,可以使用 docker run 命令

[#16#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -t -i zhiyewang/apache2 /bin/bash

root@bb634a313bf2:/#

4.5.3 使用 Dockerfile 构建镜像

事实上所有资料都不推介使用 docker commit 的方法构建镜像,而是使用 Dockerfile 的定义

文件和 docker build 命令来构建镜像。

我们的第一个 Dockerfile

现在我们创建一个目录,并在里面创建初始的 Dockerfile,我们将创建一个包含简单 Web 服

服务器的 Docker 镜像。


这里我们创建了一个名为 static_web 的目录用来保存 Dockerfile,这个目录就是我们的构建环

境(build environment),Docker 则称此环境为上下文(context)或者构建上下文(build

context)。Docker 会在构建镜像时候,将构建上下文和该上下文中的文件和目录上传到 doc

ker 守护进程。这样 Docker 守护进程就能直接访问你想在镜像中存储的任何代码。

下面是一个 Dockerfile 的例子,用 Dockerfile 构建一个能作为 Web 服务器的 Docker 镜像。

1 # version: 0.0.1

2 FROM ubuntu:14.04

3 MAINTAINER zhiyewang "zhiye_wang@yeah.net"

4 RUN apt-get update

5 RUN apt-get install -y nginx

6 RUN echo 'Hi, I am in your container' \

7     >/usr/share/nginx/html/index.html

8 EXPOSE 80

命令解释:

Dockerfile 由一系列指令和参数组成。每条指令都是大写,而且后面需要跟一个参数。Docker

file 会按照顺序从上往下执行。

Dockerfile 支持注释,所有以井号开头的都是注释。

FROM ubuntu:14.04 指定了 ubuntu 14.04 作为基础镜像,每

执行一条指令,对容器做出修改。自动会再指定类似 docker commit 的操作,提交一个新镜像

层,继续执行下一条指令。

MAINTAINER 指令会告诉 Docker 该镜像的作者是谁,以及作者的电子邮件地址。

接下来我们执行了三条 RUN 指令,RUN 指令会在当前镜像中运行指定的命令。我们通过RUN明

令更新了 APT 仓库,安装了 nginx 包,之后创建了  /usr/share/nginx/html/index.html 文件,

默认情况,RUN执行会在 shell 里使用 /bin/sh -c 来执行。如果再不支持 shell 或者不想再 shell

中运行,可以使用 exec 格式的 RUN

RUN [ "apt-get", "install", "-y", "nginx" ]

接下来的 EXPOSE 指令,告诉 Docker 该容器内的应用程序将会使用 Docker 的指定端口。但是

Docker 并不会自动打开此端口,而是需要再使用 docker run 运行容器时候指定需要打开那些端

口。

4.5.4 基于 Dockerfile 构建新镜像

运行 Dockerfile

[#34#cloudsoar@cloudsoar-virtual-machine ~]$cd static_web/

[#35#cloudsoar@cloudsoar-virtual-machine ~/static_web]$sudo docker build -t="zhiyewang/static_web" .

Sending build context to Docker daemon 2.048 kB

Step 1 : FROM ubuntu:14.04

14.04: Pulling from library/ubuntu

Digest: sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

Status: Downloaded newer image for ubuntu:14.04

---> 8ed581e3fa7a

Step 2 : MAINTAINER zhiyewang "zhiye_wang@yeah.net"

---> Running in 7806118624b7

---> c5aed3a8ff95

Removing intermediate container 7806118624b7

...

Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...

---> ddc8935b098a

Removing intermediate container c81405d28e41

Step 5 : RUN echo 'Hi, I am in your container'  >/usr/share/nginx/html/index.html

---> Running in f0049e284208

---> 6a7a53f6e78a

Removing intermediate container f0049e284208

Step 6 : EXPOSE 80

---> Running in 2a0714253002

---> e97eb7ef0136

Removing intermediate container 2a0714253002

Successfully built e97eb7ef0136

这里使用 -t 参数为新镜像设置了仓库和名称。仓库为 zhiyewang,名称为 static_web,也可

以构建过程中为镜像添加一个标签,方法为“镜像名:标签”
sudo docker build -t="zhiyewang/static_web:v1" .

如果没有定制任何标签,Docker 会自动为镜像设置一个 latest 标签。

上面命令最后的 . 告诉我们去当前路径去找 Dockerfile 文件。也可以指定一个 Git 仓库的源地

址来指定 Dockerfile 的位置。例如

sudo docker build -t="zhiyewang/static_web:v1" \

git@github.com:zhiyewang/docker-static_web

这里假设的在 Git 仓库的目录下存在 Dockerfile 文件。我也没有注册 Git 账号去执行过。

查看 docker build 过程发现,构建上下文已经上传到了 Docker 守护进程:

Sending build context to Docker daemon 2.048 kB

之后,可以看到 Dockerfile 中的每条明令都被顺序执行,而且构建过程的最终结果返回了新的

镜像的 ID,即 e97eb7ef0136 ,并且 Docker 会提交每一步的执行结果。

4.5.4 指令失败时候会怎样

例如我们将上面的第 4 步的包名 nginx 写成 ngin

[#41#cloudsoar@cloudsoar-virtual-machine ~/static_web]$sudo docker build -t="zhiyewang/static_web" .

[sudo] password for cloudsoar:

Sending build context to Docker daemon 2.048 kB

Step 1 : FROM ubuntu:14.04

---> 8ed581e3fa7a

Step 2 : MAINTAINER zhiyewang "zhiye_wang@yeah.net"

---> Using cache

---> c5aed3a8ff95

Step 3 : RUN apt-get update

---> Using cache

---> 40fa5cd1c3d2

Step 4 : RUN apt-get install -y ngin

---> Running in 86e3dbaadf20

Reading package lists...

Building dependency tree...

Reading state information...

E: Unable to locate package ngin

The command '/bin/sh -c apt-get install -y ngin' returned a non-zero code: 100

发现会出错。我们来调试一下失败原因。用 docker run 明令来基于这次构建到目前为止已经

成功的最后一步创建一个容器,它的 ID 是 40fa5cd1c3d2 ,如下代码:

[#42#cloudsoar@cloudsoar-virtual-machine ~/static_web]$sudo docker run -t -i 40fa5cd1c3d2 /bin/bash

root@b978996f25f3:/#

这时我们在此容器中运行第 4 步:

root@b978996f25f3:/# apt-get install -y ngin

Reading package lists... Done

Building dependency tree

Reading state information... Done

E: Unable to locate package ngin

发现包名错误。

我们可以在这个容器中再次运行 apt-get install -y nginx,这次输入正确的包名,来定位问题

,如果一旦解决了这个问题,就可以退出容器,用正确的包名修改 Dockerfile 文件,之后再次

构建即可。

这一篇到这里。下一篇继续学习Dockerfile 和构建缓存。

第四章 使用Docker镜像和仓库的更多相关文章

  1. 第四章 使用Docker镜像和仓库(二)

    第四章 使用Docker镜像和仓库(二) 回顾: 开始学习之前,我先pull下来ubuntu和fedora镜像 [#9#cloudsoar@cloudsoar-virtual-machine ~]$s ...

  2. 《第一本docker书》第4章 使用docker镜像和仓库 读书笔记

    docker最底端是一个引导文件系统,即bootfs. 第二层是root文件系统rootfs,位于引导文件系统之上. 在传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并 ...

  3. 《第一本Docker书》学习笔记——第4章 使用Docker镜像和仓库

    4.2 列出镜像 使用docker images命令: sudo docker images 本地镜像都保存在Docker宿主机的/var/lib/docker目录下. 也可以在/var/lib/do ...

  4. Docker之- 使用Docker 镜像和仓库

    目录 使用Docker 镜像和仓库 什么是 Docker 镜像 列出 Docker 镜像 tag 标签 Docker Hub 拉取镜像 查找镜像 构建镜像 创建Docker Hub 账号 使用 Doc ...

  5. Docker镜像的仓库及底层依赖的核心技术(3)

    一.docker镜像的仓库 仓库分为公共仓库和私有仓库 DockerHub的官方仓库:https://hub.docker.com DockerPool社区仓库:https://dl.dockerpo ...

  6. Docker镜像与仓库(一)

    Docker镜像与仓库(一) Docker镜像与仓库(一) 如何查找镜像? Docker Hub https://registry.hub.docker.com docker search [OPTI ...

  7. 04_Docker入门(下)之docker镜像和仓库的使用

    docker镜像和仓库 镜像介绍 docker镜像是由文件系统叠加而成的.最低端是一个引导文件系统,即bootfs.当一个容器启动后,它会将被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存以 ...

  8. docker镜像的仓库

    一.docker镜像的仓库 --- repos-registry的创建: 仓库分为公共仓库和私有仓库 DockerHub的官方仓库 https://hub.docker.com DockerPool社 ...

  9. Docker笔记(四):Docker镜像管理

    原文地址:http://blog.jboost.cn/2019/07/16/docker-4.html 在Docker中,应用是通过容器来运行的,而容器的运行是基于镜像的,类似面向对象设计中类与对象的 ...

随机推荐

  1. Jenkins 插件开发笔记

    笔记云盘下载链接: https://pan.baidu.com/s/1gfohF1p 密码: v759

  2. java 中 ArrayList LinkedList Vector 三者的异同点

    1.ArrayList和Vector都是基于数组实现的,所以查询速度很快,增加和删除(非最后一个节点)速度慢: Vector是线程安全的,ArrayList不是. 2.LinkedList 是一个双向 ...

  3. TSP问题——动态规划

    Traveling Salesman Problem Description: Time Limit: 4sec    Memory Limit:256MB 有编号1到N的N个城市,问从1号城市出发, ...

  4. ubuntu 14.04 重复登录问题解决方法

    为了远程登录,装了xubunt后出现重复登录的问题,尝试了多种方法,后来用下面的命令解决了 chown username:username .Xauthority 参考资料:http://askubu ...

  5. Mysql Innodb 间隙锁浅析

    间隙锁说明 innodb引擎自动使用间隙锁来避免幻读(原因是因为innodb采用单行锁+间隙锁组合而成的行锁,会锁定一个范围和记录本身的行),参数默认innodb_locaks_unsafe_for_ ...

  6. Chrome浏览器Network面板http请求时间分析

    Chrome浏览器开发者工具Network窗口下,可以查看下载各组件所需的具体时间 根据上表进行简要分析-- Stalled(阻塞) 浏览器对同一个主机域名的并发连接数有限制,因此如果当前的连接数已经 ...

  7. C#多线程的异步委托/调用

    C#异步调用(Asynchronou Delegate) C#异步调用获取结果方法:主要有三种,也可以说是四种(官方说四种,电子书说三种),官方在MSDN上已经有详细的说明:链接 需要了解到获取异步执 ...

  8. spark 特殊函数

    private var seed: Long = System.nanoTime()//返回最准确的可用系统计时器的当前值,以毫微秒为单位 require(storageLevel != Storag ...

  9. Win7与Mint双系统安装体验

    双系统安装前的准备 1.安装前的准备 安装双系统可能会对磁盘文件带来一些影响,为了避免在安装过程中由于系统瘫痪造成不必要的损失,所以我们在准备安装双系统之前,要对PC机中的重要文件进行备份,对资料要做 ...

  10. Java for循环的几种用法

    J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象.本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类 ...