最近在学习Docker,用commit去生成一个镜像,但是生成后的镜像非常臃肿,所以去学习了一下DockerFile。

前提条件:

  已在虚拟机中成功安装Docker

简单的理解可以如下图所示:

  DockerFile文件:类似原材料

  Docker镜像:组装原材料后,形成交付品

  Docker容器:运行状态

1、什么叫DockerFile

  DockerFile:就是一系列脚本,用命令和参数构成的,主要作用就是用来构建Docker镜像的文件。

2、怎么去写DockerFile(DockerFile文件编写的步骤)

  怎么去写DockerFile,也就是DockerFile文件形成的步骤,主要有3个步骤:编写DockerFile文件、Docker build执行获取镜像、Docker run运行生成容器,最后可以通过Docker history去查看历史执行镜像。

Dockerfile的大致执行流程:

  2.1 docker从基础镜像运行一个容器(在虚拟机中,在hub官网上拉一个centos)

  2.2 执行指令并对容器做出修改

  2.3 执行类似docker commit的操作提交一个新的镜像层

  2.4 Docker在基于刚提交的镜像运行一个新容器

  2.5 执行dockerfile中的下一条指令直到所有指令都执行完成

DockerFile文件执行步骤命令:

1 编写Dockerfile文件
2 构建docker image:Docker build -t 新镜像名:TAG . //注意最后一个点与TAG之间有个空格
3 运行docker 生成容器:docker run -it 新镜像ID //通过docker images找到镜像ID
4 列出镜像的变更历史:docker history 新镜像ID

DockerFile文件执行步骤命令

3、DockerFile的文件解析

打开官网 https://hub.docker.com/  ,在官网上搜索centos,随意点开一个,查看DockFile。

如下图,Dockerfile文件解析:

  3.1 保留字全部大写+参数 //保留字有FROM、MAINTAINER、COPY、ADD、RUN、ONBUILD、WORKDIR、USER、CMD、ENV、EXPOSE、VOLUME、ENTRYPOINT等待。

  3.2 从上到下,顺序执行

  3.3 #表注释

  3.4 每条指令都会创建一个 新的镜像层,并对镜像进行提交

4、实战-定制需求生成一个自定义镜像

Base镜像(scratch):docker hub中的镜像都是通过在base镜像中安装;自定义镜像中安装和配置需要的软件构建出来的。

4.1 自定义镜像需求为:目前从官网上pull下来的centos都是精简版,不支持vim,不支持ifconfig,所以自定义的镜像mycentos满足如下3个条件

  a 登陆后默认路径修改为:/usr/local (未修改前在根目录下/)

  b 可以使用vim 编辑器

  c 可以查看网络配置ifconfig支持

4.2 打开虚拟机centos7终端,执行docker images出现错误:【Failed to restart dock.service: Unit not found.】,执行如下代码:

1 systemctl unmask docker.service
2 systemctl unmask docker.socket
3 systemctl start docker.service

开始Docker服务

4.3 在虚拟机centos中,打开终端,首先创建目录文件Dockerfile/DockerFile文件并且配置Dockerfile文件,代码如下:

1 cd /
2 mkdir /mydocker/
3 touch Dockerfile.txt
4 vi Dockerfile.txt

根目录下创建Dockerfile.txt,且进入到当前文件

打开对应的Dockerfile.txt文件后,编写定义需求,代码如下:

1 From centos
2 ENV mypath /usr/local //配置环境变量,默认路径变更为:/usr/local,以前是根目录
3 WORKDIR $mypath
4 RUN yum -y install vim //安装vim
5 RUN yum -y install net-tools //安装net-tools
6 EXPOSE 80
7 CMD /bin/bash

自定义Dockerfile配置文件

4.4 构建dockerfile文件生成镜像,代码如下:

docker build -f /mydocker/Dockerfile.txt -t mycentos:1.3 .

构建dockerfile文件生成镜像

4.5 生成镜像后,运行生成容器,代码如下:

docker run -it mycentos:1.3

生成镜像后,运行生成容器

4.6 查看镜像的历史记录,代码如下:

1 docker images   //找到对应的image id(镜像ID)
2 docker history a5688da747d7 //查看docker历史记录

查看docker image的历史记录

DokcerFile的添加及如何生成一个自定义镜像mycentos(四)的更多相关文章

  1. 自定义镜像mycentos

    1.编写 1).Hub默认CentOS镜像是什么情况 2).编写Dockerfile文件 2.构建 3.运行

  2. node-gyp 在此解决方案中一次生成一个项目。若要启用并行生成,请添加“/m”开关。

    在此解决方案中一次生成一个项目.若要启用并行生成,请添加“/m”开关. MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”.要解决此问题, ...

  3. JAVA代码:生成一个集合,自定义大小,100以内的随机整数

    JAVA代码:生成一个集合,自定义大小,100以内的随机整数 方法一:(Random类) package com.dawa.test; import java.util.ArrayList; impo ...

  4. cordova3.X 运用grunt生成plugin自定义插件骨架

    Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等.Cordova还提供了一组统一的JavaScript类库,以及为这些 ...

  5. Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 (主要是NSLayoutConstraint 的使用)

    当前位置: > Swift新手入门 > Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 时间:2014-09-10 16:49来源:未知 作者:啊成 举报 点击:5 ...

  6. 如何发布一个自定义Node.js模块到NPM(详细步骤)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  7. 如何发布一个自定义Node.js模块到NPM(详细步骤,附Git使用方法)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  8. 如何创建一个自定义的`ErrorHandlerMiddleware`方法

    在本文中,我将讲解如何通过自定义ExceptionHandlerMiddleware,以便在中间件管道中发生错误时创建自定义响应,而不是提供一个"重新执行"管道的路径. 作者:依乐 ...

  9. 怎么在java中创建一个自定义的collector

    目录 简介 Collector介绍 自定义Collector 总结 怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream的c ...

随机推荐

  1. SpringBoot进阶教程(六十四)注解大全

    在Spring1.x时代,还没出现注解,需要大量xml配置文件并在内部编写大量bean标签.Java5推出新特性annotation,为spring的更新奠定了基础.从Spring 2.X开始spri ...

  2. 3. Hive相关知识点

    以下是阅读<Hive编程指南>后整理的一些零散知识点: 1. 有时候用户需要频繁执行一些命令,例如设置系统属性,或增加对于Hadoop的分布式内存,加入自定的Hive扩展的Jave包(JA ...

  3. RPS/RFS/ GRO

    http://www.cnhalo.net/2016/09/13/linux-gro/ GRO(Generic receive offload): 在napi poll里把小包封装成大包再递交给协议栈 ...

  4. 极客mysql06

    两阶段锁:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放, 而是要等到事务结束时才释放. 建议:如果你的事务中需要锁多个行,要把最可能造成锁冲突.最可能影响并发度的锁 ...

  5. 编译的Ceph二进制文件过大问题

    前言 在ceph的研发群里看到一个cepher提出一个问题,编译的ceph的二进制文件过大,因为我一直用的打包好的rpm包,没有关注这个问题,重新编译了一遍发现确实有这个问题 本篇就是记录如何解决这个 ...

  6. Spring Boot优雅地处理404异常

    背景 在使用SpringBoot的过程中,你肯定遇到过404错误.比如下面的代码: @RestController @RequestMapping(value = "/hello" ...

  7. SQL Server DATEDIFF() 函数用法

    定义和用法 DATEDIFF() 函数返回两个日期之间的时间,例如计算年龄大小. DATEDIFF(datepart,startdate,enddate)startdate 和 enddate 参数是 ...

  8. OMV openmediavault NAS系统命令显示颜色

    闲鱼65f元买的我家云刷了OMV系统. 但ls命令查看文件不显示颜色. cd /etc/进入配置文件目录查看并没有bashrc文件,但有个bash.bashrc 在 bash.bashrc后面加入以下 ...

  9. Distributing Custom Apps

    Distributing Custom Apps 分配自定义应用程序 November 10, 2020 2020年11月10日 Custom apps let you meet the unique ...

  10. 凭借着这份Spring面试题,我拿到了阿里,字节跳动美团的offer!

      一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能?   1.2. 什么是 Spring Framework? Spring 是一个开源应用框架,旨在降低应用程序开发 ...