Docker镜像管理

1. 简介

Docker 镜像是构建 Docker 容器的基础,它是容器的模板或者蓝图,包含了运行容器所需要的所有信息和文件。通过 Docker 镜像,我们可以在不同的主机上启动并运行容器,从而保证容器在任何地方的一致性和可移植性。

2. 基本概念

以下是对Docker镜像的详细介绍,包括其结构、创建、使用及相关概念。

2-1 镜像中的资源概念

概念

作用

Image镜像

只读模版,用于启动容器

ID镜像ID

每个镜像都有唯一的标识符ID

Tag(标签)

用于区分不同版本的镜像

  • Image是一个只读的模板,用于创建 Docker 容器。它包含操作系统、应用程序、库、依赖项以及容器启动时需要执行的命令。每个 Docker 镜像都由一系列的层(Layer)组成,这些层是镜像的构建过程中的增量变化。

  • ID每个镜像都有一个唯一的标识符(ID)。它是镜像的 SHA256 哈希值,可以通过 docker images 命令查看。

  • Tag镜像的标签用于区分镜像的不同版本。标签通常以 repository:tag 的形式存在,tag 默认为 latest,如果没有指定标签,则默认使用 latest 标签。例如,ubuntu:18.04 ubuntu:20.04 是两个不同版本的镜像。

3. 镜像的结构

Docker 镜像是由多个只读层(Layer)构成的,每个层代表一个增量变化。镜像的最底层通常是操作系统(例如 Ubuntu CentOS),上面可以叠加安装应用程序和依赖项。每次镜像构建时,都会创建一个新的层,Docker 会在此基础上进行操作。需要注意的是镜像最大支持127层。

3.1. 镜像

  • 基础镜像层:最底层通常是一个操作系统的镜像,如 ubuntu alpine

  • 应用层:在操作系统之上,可能会安装应用程序及其依赖项,例如 NginxMySQL 等。

  • 修改层:每次对镜像进行修改时,都会创建一个新的层,这个层记录了增量变化(例如安装了新的软件包或修改了配置文件)。

3.2. 元数据

除了数据层外,Docker 镜像还包含一些元数据,例如:

  • 镜像的命令:镜像执行时需要运行的命令(如 ENTRYPOINT CMD)。

  • 镜像的配置:镜像的环境变量、端口映射、挂载点等。

3.3. 镜像存储

Docker 镜像存储在 Docker 守护进程的本地存储中,默认位于 /var/lib/docker 路径下。您可以通过修改配置来调整存储位置。

4. 镜像制作

通常我们在公共仓库中使用的镜像无法满足全部使用需求,若需要运行特殊的应用程序则需要制作新镜像,通常制作镜像的方式分为以下两种:

1)明盒制作:

通过基础镜像(包含操作系统的镜像)启动,在容器中安装需要的应用程序并进行配置,完成后通过工具将容器导出为镜像。

2)暗盒制作:

通过使用文件来规定Docker引擎执行对应的操作如:下载文件、运行命令等。制作过程和我们传统的执行命令不同,不会有较多反馈。

常用的镜像制作方式为使用Dockerfile制作镜像,下面是一个简单的Dockerfile

FROM alpine

MAINTANER zcloud

WORKDIR /app

ENV VERSION V1

COPY file_src /app/file_dest

RUN yum install -y nginx

EXPOSE 80

CMD ["nginx","-g","daemon off"]

  • FROM:通过该镜像来制作新镜像,一般选择带有基础操作系统的小型镜像,以免后续制作镜像过大。

  • MAINTAINER:设置制作者的信息。

  • WORKDIR:创建(如果不存在)并进入到一个目录,设置后续通过镜像启动容器时默认工作目录。

  • ENV:设置环境变量。

  • COPY:将本机对应的文件拷贝到镜像中。

  • RUN:执行命令

  • EXPOSE:配置镜像暴露的端口,方便后续使用镜像时对镜像使用的端口判断。

  • CMD:通过镜像启动容器时执行的启动命令。

  • ENTRYPOINT不可覆盖的命令,如果有CMD则将CMD作为其参数。

5. 常用操作

镜像在日常运维使用过程中主要操作为:拉取镜像、保存镜像、导入镜像、制作新镜像等。下表是一些常用操作:

5.1. 镜像管理

下表为镜像相关管理操作,其中“[]”中的为可选参数,“<>”中的为必选参数。

5-1 Image管理操作

操作

命令

备注

列举

docker images

查询所有镜像

查询

docker inspect <image>

查询镜像详细信息

拉取镜像

docker pull <image>

拉取一个仓库中的镜像

推送镜像

docker push <image>

将镜像推送至仓库

加载镜像

docker load -i <image_file>

通过文件加载镜像

导出镜像

docker save <image> [<image>] -o <filename>

导出一个或多个本机镜像

添加标签

docker tag <image> <new_image>

为镜像添加一个标签或改名

制作镜像

docker build -t <image_name> -f <dockerfile> <dir>

通过dockerfile制作新的镜像

来源:Zcloud laboratory

更多推荐