博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用 Dockerfile 定制镜像
阅读量:5319 次
发布时间:2019-06-14

本文共 2476 字,大约阅读时间需要 8 分钟。

镜像的定制实际上就是定制每一层所添加的配置、文件。

如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,
那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,
因此每一条指令的内容,就是描述该层应当如何构建.
Dockfile是由一行行命令语句组成,并且迟滞以#开头的注释行;
一般而言,Dockerfiel分为四部分:1.基础镜像信息 ;2.维护者信息;3.镜像操作指令;4.容器启动时指令,例如
配置第一个dockerfile文件

配置第一个dockerfile文件$ mkdir mynginx$ cd mynginx$ touch Dockerfile内容:# this is dockerfile uses the nginx images# VERSION 1 - EDITON 1# Author: docker#base image the use FROM nginx# maintainer: docker_userMAINTAINER docker_user docker_user@docker.comRUN echo '

hello,docker!

' > /usr/share/nginx/html/index.html

1.1、FROM 指定基础镜像

  所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制,基础镜像是必须指定的。而 FROM 就是指定基础镜像,
因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令
如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
  不以任何系统为基础,直接将可执行文件复制进镜像的做法并不罕见,比如swarm 、 coreos/etcd 。对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 FROM scratch 会让镜像体积更加小巧。使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go是特别适合容器微服务架构的语言的原因之一
Dockerfile 中每一个指令都会建立一层, RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后, commit 这一层的修改,构成新的镜像.
  Union FS 是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过127 层

  因此,这里没有使用很多个 RUN对应一一不同的命令,而是仅仅使用一个 RUN 指令,并使用 && 将各个所需命令串联起来, 在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建

  除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch 。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像

如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
  不以任何系统为基础,直接将可执行文件复制进镜像的做法并不罕见,比如swarm 、 coreos/etcd 。对于 Linux 下静态编译的程序来说,并不需要有操作系统提供运行时支持,所需的一切库都已经在可执行文件里了,因此直接 FROM scratch 会让镜像体积更加小巧。使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go是特别适合容器微服务架构的语言的原因之一
1.2、RUN 执行命令
  RUN 指令是用来执行命令行命令的。由于命令行的强大能力, RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:
  shell 格式: RUN ,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
  例如:RUN echo "123" > /tmp/1.txt

  exec 格式: RUN ["可执行文件", "参数1", "参数2"] ,这更像是函数调用中的格式

  Dockerfile 中每一个指令都会建立一层, RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后, commit 这一层的修改,构成新的镜像.

  Union FS 是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过127 层

  因此,这里没有使用很多个 RUN对应一一不同的命令,而是仅仅使用一个 RUN 指令,并使用 && 将各个所需命令串联起来, 在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建

Dockerfile 支持 Shell 类的行尾添加  的命令换行方式,以及行首 # 进行注释的格式。良好的格式,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯
1.3、构建镜像
  语法: docker build [选项] <上下文路径/URL/->
这里的.就是上下文路径
1037363-20190911171813127-869732272.png
1037363-20190911171908951-1984085675.png
运行 以后台方式运行 名称为test 端口映射80:80
$ docker run -dit --name test -p 80:80 nginx:v4
1037363-20190911172014567-1592620034.png
运行结果如下
1037363-20190911174025569-298043575.png
本文学习自:https://blog.51cto.com/xiong51/2093846

转载于:https://www.cnblogs.com/smart-girl/p/11507245.html

你可能感兴趣的文章
easyui-window 关闭事件,只要关闭窗口就会触发
查看>>
centso7网卡bond
查看>>
React Native之遇到的问题
查看>>
Newick format tree
查看>>
软件开发模型之瀑布模型
查看>>
Java 中 String的indexOf 的用法
查看>>
Android Studio打开出现:Default activity not found
查看>>
一次Linux系统被攻击的分析过程
查看>>
Fugl-Meyer Assessment(FMA)
查看>>
黑马程序员——c语言学习心得——位运算符
查看>>
C# Icon转Byte , Byte转Icon
查看>>
博客开篇,数据转移
查看>>
Crazyflie 2.0 System Architecture
查看>>
用react native 做的一个推酷client
查看>>
B. Ohana Cleans Up(Codeforces Round #309 (Div. 2))
查看>>
Vim 简易配置
查看>>
电梯UI部分
查看>>
2016.07.15
查看>>
Vue.js 3.0 新特性预览
查看>>
checkbox中把选项文字与小圆圈关联上
查看>>