在 docker 中,镜像的结构是以层次划分的,也就是可以在每一层上添加自己的修改,变成新的镜像。

docker 两种打包方式如下:

  • commit
  • build

docker commit

注意: docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成。

镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。比如我们所使用的都是来自于 Docker Hub 的镜像,比如不同的linux系统版本有不同的官方基础镜像,如 CentOs,Ubuntu。直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求时,我们就需要定制这些镜像。接下来看看 docker run 如何定制镜像。

以基础的 centos 镜像为例,我们想在这个镜像上安装 vim。

docker image ls -a

进入容器内安装

$ docker exec -it centos bash
root@3729b97e8226:/# yum install vim
exit
我们以交互式终端方式进入 centos 容器,并执行了 bash 命令,也就是获得一个可操作的 Shell。
然后,我们用 yum 安装 vim。
 

要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。
docker commit 的语法格式为:

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

我们可以用下面的命令来保存新修改的镜像:

$ docker commit \
--author "Nobody <nobody@gmail.com>" \
--message "安装了vim" \
centos \
centos:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214

我们可以在 docker image ls 中看到这个新定制的镜像:

$ docker image ls centos
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v2 07e334659748 9 seconds ago 272.5 MB
centos latest e43d811ce2f4 4 weeks ago 272 MB

我们还可以用 docker history 具体查看镜像内的历史记录,如果比较 nginx:latest 的历史记录

docker build

相比 docker commit,此命令就简单很多。直接新建 DockerFile 文件:

touch DockerFile

vim ./DockerFile

添加以下内容:

FROM centos
RUN yum install -y vim
意思是基于 centos 镜像基础上
然后使用 run 命令执行命令:yum install -y vim 
 
使用此文件来进行打包:
docker build -t blackbinbin/docker-centos-vim ./

打包过程也非常有意思

step1 是直接使用 centos 镜像。step2 是创建一个临时的容器来执行 yum install

这里是符合我们上面所说的 docker 镜像是层次结构的结论,在之后的文章我们会详细阐述为什么 docker 会使用这样的文件结构形式。

最后移除临时的容器

并且打包成新镜像,ID=8bf3a6c43631 
 

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。这种描述性语言,比 commit 更符合工程化的思想,因为只要确定 DockerFile 任何人都可以构建出来一样的镜像,便于迭代,这也是为什么搞 docker 和 k8s 的经常会被认为是面向 yaml 编程,描述性语言的利用,让构建和运维的流程更清晰,便于沟通和迭代。

初试Docker-打包构建镜像的更多相关文章

  1. IDEA使用Docker插件构建镜像

    IDEA使用Docker插件构建镜像 记一次坑  第一次插件docker-maven-plugin的 配置文件中没写远程主机的地址 <dockerHost>http://192.168.1 ...

  2. docker入门——构建镜像

    前面我们已经介绍了如何拉取已经构建好的带有定制内容的Docker镜像,那么如何构建自己的镜像呢? 构建Docker镜像有以下两种方法: 使用docker commit命令. 使用docker buil ...

  3. docker之构建镜像

    构建Docker镜像有以下两种方法: 使用docker commit命令. 使用docker build命令和 Dockerfile 文件. 在这里并不推荐使用docker commit来构建镜像,而 ...

  4. windows环境下,spring boot服务使用docker打包成镜像并推送到云服务器私有仓库

    最近在淘宝上学习springcloud教程,其中有几节课是讲解讲本地springboot服务打包成镜像并推送到云服务器私有仓库,但是教程里面用的事Mac环境,我的是Windows环境,而且课程里面没有 ...

  5. docker学习构建镜像---第三章节

    一.docker镜像使用 运行docker容器时,使用的镜像如果在本地不存在,docker会自动从docker镜像仓库中下载,默认是从docker hub公共镜像源下载 在这里,我们需要了解:管理和使 ...

  6. springboot 通过docker 打包编译镜像

    添加plugin <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...

  7. docker(四) 使用Dockerfile构建镜像

    下面以一个例子来演示构建镜像的过程. #在/tmp目录下演示 cd tmp mkdir build-redis-image 1.创建Dockerfile文件 vim Dockerfile 并写入如下内 ...

  8. Docker:dockerfile自动构建镜像 [六]

    一.手动docker镜像的缺点 相对于手动制作的docker镜像,使用dockerfile构建的镜像有以下优点: 1.dockerfile只有几kb,便于传输 2.使用dockerfile构建出来的镜 ...

  9. docker 构建镜像 centos7 nginx php

    #docker 构建镜像(Dockerfile) centos 7.4.1078镜像制作 nginx镜像制作(以前面centos7镜像为基础) Nginx+php镜像制作 更多操作实例,查看git里的 ...

随机推荐

  1. 安装配置环境 CUDA以及CUDNN tensorflow pytorch pip安装 虚拟环境

    1.  在win10中利用Anaconda直接安装tensorflow-gpu 不需要另行安装cuda cudnn 但是不知道电脑会自动适配所需的版本吗,不过把电脑显卡驱动更新一下,就都也可以了吧. ...

  2. python读取文件编码转换问题

    encode(编码)   decode(解码)   encoding(编码格式) #-*- coding:utf-8 -*- import chardet #用于查看编码 with open(&quo ...

  3. sunny 内网穿透使用。

    启动方法:

  4. 分组密码(四)AES算法① — 密码学复习(七)

    介绍完S-PN型结构之后,下面介绍AES算法.由于内容比较多所以将其分为两篇来介绍,本篇主要讲AES的历史时间节点.产生背景.与DES的对比.算法框图(粗略)以及一些数学基础. 7.1 AES的历史时 ...

  5. WPF进阶技巧和实战08-依赖属性与绑定01

    依赖项属性 定义依赖项属性 注意:只能为依赖对象(继承自DependencyObject的类)添加依赖项属性.WPF中的元素基本上都继承自DependencyObject类. 静态字段 名称约定(属性 ...

  6. IdentityServer4系列[6]授权码模式

    授权码模式是一种混合模式,是目前功能最完整.流程最严密的授权模式.它主要分为两大步骤:认证和授权.其流程为: 用户访问客户端,客户端将用户导向Identity Server. 用户填写凭证信息向客户端 ...

  7. 实时渲染基础(4)纹理(Texture)

    目录 纹理映射(Texture Mapping) 球形贴图(Spherical Map) 立方体贴图(Cube Map) 纹理走样问题 Mipmap 各向异性过滤(Ripmap) 纹理应用技术(Tex ...

  8. 智汀家庭云-开发指南Golang:设备模块

    1.品牌 品牌指的是智能设备的品牌,SA通过插件的形式对该品牌下的设备进行发现控制.理论上来说一个品牌对应一个插件服务.您可以通过项目 根目录下的品牌查看SA支持的品牌.关于插件服务的详细信息可以参考 ...

  9. C# 显示、隐藏窗口对应的任务栏

    WPF中全屏窗口,会自动隐藏任务栏. 那非全屏窗口如何隐藏任务栏?甚至有没有一种场景,隐藏任务后自定义一套系统任务栏来显示? 以下会分阶段讲述一些概念 1. 主屏任务栏 任务栏,其实也是一个窗口,主屏 ...

  10. Python 面向对象笔记

    Python 面向对象课程笔记 前言 Python 面向对象 正文 基本概念 什么是对象: 万物皆对象 对象是具体物体: 拥有属性 拥有行为 封装零散为整体 OOP(Object Oriented P ...