docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker 镜像结构

Docker 镜像结构详解

作者:维尔切(wiltjer)

Docker镜像是由一系列层(layers)组成的,理解Docker镜像的结构对于有效地构建、共享和管理Docker镜像至关重要,本文给大家介绍Docker镜像结构的相关知识,感兴趣的朋友一起看看吧

Docker 镜像结构

一、镜像与容器之间的关系

二、镜像结构

1、基础镜像(base 镜像)

2、镜像分层

| touch /galaxy/cy | Image |
| mkdir /galaxy    | Image |
| CentOS:7         | Base Image |
| Docker Host      | Kernel |

3、容器层

三、Docker 镜像构建

1、三种构建方式对比

方式说明优点缺点
docker commit基于运行中的容器创建镜像简单快捷容易出错,效率低且可重复性弱,不安全
基于本地模板导入从模板文件导入镜像快速导入已有系统不灵活、不易定制
dockerfile通过脚本定义镜像层次透明、可重复、易于维护推荐方式

2、docker commit

通过在运行的容器内安装软件、配置环境,再将容器的“当前状态”打包为新镜像,本质是“快照式构建”

centos:7中安装vim-common

先基于centos7运行容器,容器名为cy,并使用-it生成终端进入容器

[root@docker ~]# docker run --name dc -it centos:7 /bin/bash

在容器中安装vim-common

[root@8f3a60b20edb /]# yum -y install vim-common

退出容器后,使用docker commit将v1容器打包为镜像

[root@docker ~]# docker commit dc centosdc:7
[root@docker ~]# docker images | grep centosdc

3、基于本地模板导入

直接从操作系统模板文件(如OpenVZ模板)导入镜像,模板文件通常为压缩包(如tar.gz),包含完整的rootfs和基础配置

导入ubuntu:12.04模板

下载模板

从OpenVZ官方地址(http://openvz.org/Download/templates/precreated)下载ubuntu-12.04-x86-minimal.tar.gz

导入为镜像

[root@docker ~]# cat ubuntu-12.04-x86-minimal.tar.gz | docker import - ubuntu:12.04

验证镜像

[root@docker ~]# docker images

4、Dockerfile构建

Dockerfile是一个文本文件,包含一系列“指令(Instruction)”,每一条指令对应镜像的一层——指令描述了该层的构建操作(如安装软件、复制文件、配置环境)。通过docker build命令执行Dockerfile,可自动化、可重复地构建镜像,解决了docker commit的“不透明、不可追溯”问题

编写 Dockerfile

[root@docker ~]# vim Dockerfile

Dockerfile 内容

# 第一行必须指定,基础镜像信息
FROM centos:7
# 维护者信息
MAINTAINER docker@example.com
# 镜像操作指令
RUN yum install -y httpd
EXPOSE 80
# 容器启动执行指令
CMD ["/usr/sbin/httpd"]

执行构建命令

[root@docker ~]# docker build -t httpd:wil /root/

构建过程:

  1. 下载centos7镜像
  2. 添加镜像构建者信息
  3. 基于centos7镜像启动容器,安装httpd软件,安装完毕后将容器打包为镜像
  4. 基于上一步生成的镜像启动容器,将80端口打开,打开后将容器打包为镜像
  5. 基于上一步生成的镜像启动容器,添加容器启动后需要执行的指令,再打包为镜像

查看构建历史

[root@docker ~]# docker history httpd:wil

使用DockerFile文件构建完镜像以后,Docker会把构建过程中的每一层临时镜像进行缓存。在构建新镜像时,可以直接使用之前缓存的镜像层,这样能加速镜像的构建

四、Dockerfile 语法详解

指令说明示例
FROM指定基础镜像FROM centos:7
MAINTAINER维护者信息(已逐渐被 LABEL 替代)MAINTAINER cy@example.com
LABEL元数据键值对LABEL version="1.0"
RUN构建过程中执行命令RUN yum install -y httpd
COPY复制宿主机文件到镜像COPY app.py /app/
ADD类似 COPY,支持 URL 和自动解压ADD app.tar.gz /app/
WORKDIR设置工作目录WORKDIR /app
VOLUME创建挂载点VOLUME /data
EXPOSE声明容器端口EXPOSE 80
ENV设置环境变量ENV APP_HOME /app
CMD容器启动命令(可被覆盖)CMD ["/bin/bash"]
ENTRYPOINT容器启动命令(不可被覆盖)ENTRYPOINT ["/app/start.sh"]
USER指定运行用户USER nobody

五、总结

要点说明
镜像与容器镜像是静态的模板,容器是运行实例
分层结构镜像由多个只读层组成,容器层可写
基础镜像从 scratch 构建,提供 rootfs
构建方式推荐使用 Dockerfile,透明、可重复
Dockerfile 指令每条指令对应一层,支持缓存
缓存机制加速构建,可通过 --no-cache 禁用

到此这篇关于Docker 镜像结构的文章就介绍到这了,更多相关Docker 镜像结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文