Docker镜像使用


title: Docker镜像使用
tags: Docker


        在传统的 Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并完成了完整性检查之后,它才会被切换为读写模式。但是在 Docker里,root文件系统永远只能是只读状态,并且 Docker利用联合加载( union mount)技术又会在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。

        Docker将这样的文件系统称为镜像。一个镜像可以放到另一个镜像的顶部。位于下面的镜像称为父镜像( parent image),可以依次类推,直到镜像栈的最底部,最底部的镜像称为基础镜像( base image)。最后,当从一个镜像启动容器时, Docker会在该镜像的最顶层加载一个读写文件系统。我们想在 Docker中运行的程序就是在这个读写层中执行的。

一.列出镜像

        首先我们先来查看下自己的主机上已有镜像

例:docker images

Docker镜像使用

标签说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

注意:本地镜像都保存在 Docker宿主机的/vax/lib/ docker目录下。每个镜像都保存在Docker所采用的存储驱动目录下面,如aufs或者 devicemapper。也可在/var/lib/ docker/ containers目录下面看到所有的容器。

二.查找镜像

        我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
        我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个Ubuntu的镜像,可以通过 docker search 命令搜索 Ubuntu 来寻找适合我们的镜像。

例:docker search ubuntu

Docker镜像使用

标签说明:

  • NAME:镜像仓库源的名称
  • DESCRIPTION:镜像的描述
  • OFFICIAL:是否docker官方发布

注意: 仓库名的命名规则一般是:用户名/仓库名

三.拉取镜像

        镜像可以从仓库下载下来。镜像保存在仓库中,而仓库存在于 Registry中。默认的 Registry由 Docker公司运营的公共 Registry服务,即 Docker hub。

        在 Docker Hub(或者用户自己运营的 Registry)中,镜像是保存在仓库中的。可以将镜像仓库想象为类似Giⅱt仓库的东西。它包括镜像、层以及关于镜像的元数据(metadata)。每个镜像仓库都可以存放很多镜像(比如, ubuntu仓库包含了 ubuntu各个版本的镜像)。

        下面我就来演示怎么拉取一个ubuntu镜像

例:docker pull ubuntu:15.10

Docker镜像使用

注意:Docker hub上的非官方镜像都是由用户提供,Docker官方没有确认和验证,使用的时候可能有一定的风险。

        为了区分同一个仓库中的不同镜像, Docker提供了一种称为标签(tag)的功能。每个镜像在列出来时都带有一个标签,如13.01、15.10、 quanta1或者 precise等。每个标签对组成特定镜像的一些镜像层进行标记(比如,标签15.10就是对所有 Ubuntu15.10镜像的层的标记)。这种机制使得在同一个仓库中可以存储多个镜像我们可以通过在仓库名后面加上一个冒号和标签名来指定该仓库中的某一镜像,如代码:

例:docker run -t -i --name newUbuntu ubuntu:15.10 /bin/bash

四.设置tag

我们可以指定tag,当然也可以设置镜像的tag,现在我们来看看怎么设置tag

例:docker tag ubuntu:15.10 ubuntu:latest

        上面的例子我们把ubuntu的tag 15.10 设置为latest。
        我再次运行 docker images 来看看我们刚刚的操作

Docker镜像使用

        我们可以看到两个镜像IMAGE ID一样,但是TAG不一样,这是因为一个镜像可以有多个标签。这使我们可以方便地对镜像进行打标签并且很容易查找镜像。

五.构建镜像

        前面我们使用的都是别人提供的镜像,那么我们怎么构建自己的镜像呢?

  • 使用docker commit 命令
  • 使用docker build 命令何Dockerfile 文件

        一般不推荐使用 docker commit命令,而应该使用更灵活、更强大的Dockerfile来构建 ocker镜像。不过,为了对 Docker有一个更全面的了解,我们还是会先介绍一下如何使用 docker commit构建 Docker镜像。之后,我们将重点介绍 Docker所推荐的镜像构建方法:编写 Dockerfi1e之后使用 docker build命令。

1. 使用docker commit

首先我们还是使用之前创建过的容器

docker run -i -t ubuntu /bin/bash

注意: 如果你不了解这命令,你可以查看我之前的一篇文章 https://blog.csdn.net/yang731227/article/details/83751556

(1).接下来我们为容器安装Apache

apt-get update
apt-get -y install apache2

安装完成后 我们使用exit 退出容器

(2). 提交定制容器

docker commit b2352ca7c5f4 clown/apache2

b2352ca7c5f4 可能你会问这个是什么, 这个是我们刚刚创建的容器ID, 可以通过docker ps -l -q得到刚刚创建的容器ID。

注意:再次说明,仓库名的命名规则一般是:用户名/仓库名,当然这个命名规则并不是必要的,只是建议。

1. 使用Dockerfile构建镜像

        我并不推荐使用 docker commit的方法来构建镜像。相反,推荐使用被称为Dockerfile的定义文件和 docker build命令来构建镜像。 Dockerfi1e使用基本的基于DSL( Domain Specific Language)语法的指令来构建一个 Docker镜像,我们推荐使用Dockerfile方法来代替 docker commit,因为通过前者来构建镜像更具备可重复性、透明性以及幂等性。

        一旦有了 Dockerfile,我们就可以使用 docker bui1d命令基于该 Dockerfile中的指令构建一个新的镜像。

(1).第一个Dockerfile

        首先我们创建一个目录,并在里面创建一个名为Dockerfile的文件。

#选择一个基础镜像
FROM ubuntu:latest
#安装apache
RUN apt-get update && apt-get install -y apache2
#暴露端口
EXPOSE 6688

(2).执行构建

         最后我们可以通过docker build 执行,我们也可以通过 参数 -t 设置名称 ,并且可以设置tag, 方法为: “镜像名:标签”
docker build -t ="clown/apache:v1"

        Dockerfile 由一系列指令何参数组成,每条指令,如FROM ,都必须大写字母 。Dockerfile的执行顺序是从上之下,所以应该合理安排指令顺序。

(3).执行流程

大致流程为:

  • Docker从基础镜像运行一个容器。
  • 执行一条指令,对容器做出修改。
  • 执行类似 docker commit的操作,提交一个新的镜像层。
  • Docker再基于刚提交的镜像运行一个新容器。
  • 执行 Dockerfi1e中的下一条指令,直到所有指令都执行完毕。

(4).略过Docker 缓存

        由于每一步的构建过程都会将结果提交为镜像,所以 Docker的构建镜像过程就显得非常聪明。它会将之前的镜像层看作缓存。然而,有些时候需要确保构建过程不会使用缓存。比如,前面我们使用了apt-get update ,我们希望它能继续执行获取软件新的版本,这时候我应该使用 docker build的–no- cache标志跳过缓存,如:

docker build --no-cache -t ="clown/apache:v1"

六.更新镜像

        更新镜像之前,我们需要使用镜像来创建一个容器。

[email protected]:~$ docker run -t -i ubuntu:15.10 /bin/bash

[email protected]:/# 在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit命令来退出这个容器。

此时ID为e218edb10161的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit来提交容器副本。

docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2

参数说明:

  • -m:提交的描述信息
  • -a:指定镜像作者
  • e218edb10161:容器ID
  • runoob/ubuntu:v2:指定要创建的目标镜像名

七.删除镜像

        有时候我们不需要某个镜像,需要对它进行删除。
1.停止所有的container,这样才能够删除其中的images:

docker stop $(docker ps -a -q)

如果想要删除所有container的话再加一个指令:

docker rm $(docker ps -a -q)

然后查看所有镜像,获取你需要删除的镜像NAME ID

docker imagas

最后通过ID删除镜像

docker rmi 9b9cb95443b5

注意:删除镜像时候可能会遇到 Error response from daemon: conflict: unable to delete xxxxxx cannot be forced) - image has dependent child images
这是因为,该镜像上有其他依赖镜像 ,需要先删除依赖它的镜像。