镜像的定制,就是定制每一层所添加的配置、文件,如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本中,用脚本来构建、定制镜像,这个脚本就是Dockerfile

Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容就是没每一层应当如何构建的.

Dockerfile ---------⬇️



FROM

指定基于哪个镜像文件来构建新的镜像,尽量使用官方的bash image

示例:

FROM 镜像名/镜像ID[:tag]



LABEL

容器元消息,帮助信息,Metadata,类似于代码注释

示例:

LABEL version="1.0" 版本标示

LABEL maintainer="name @163.com" 声明制作人



RUN

创建镜像时执行的命令



WORKDIR

切换工作目录



COPY

把本机的文件添加到容器中

示例:

COPY flask_web.py /app/ 把本机的flask_web.py文件复制到容器中的/app目录下,会自动创建/app目录



ADD

除了COPY的功能外还有解压功能,应优先使用COPY命令



ENV

设置环境变量,尽可能的使用ENV来设置环境变量,以增加可维护性

示例:

ENV MYSQL_VERSION 5.6 设置一个MySQL常量

RUN yum install -y mysql-server="${MYSQL_VERSION}" 调用MySQL常量



CMD

设置容器启动后默认执行的命令和参数

⚠️如果定义多个CMD,则只有最后一个会执行

⚠️如果 docker run 时指定了其它命令(例如:/bin/bash、python flask_web.py),则CMD命令会被忽略



EXPOSE

网络设置

示例:

EXPOST 8080 暴露容器的8080端口



VOLUME

存储设置



ENTRYPOINT

设置容器启动时运行的命令

让容器以应用程序或服务的形式运行,不会被忽略,一定会执行

关于Shell格式和Exec格式


对于相对的命令,Shell格式与Exec格式的对比如下.



Shell格式

RUN yum -y install vim
CMD echo "Hello Docker"
ENTRYPOINT echo "Hello Docker"

Exec格式

RUN ["apt-get", "install", "-y", "vim"]
CMD ["/bin/echo", "Hello Docker"]
ENTRYPOINT["/bin/echo","Hello Docker"]

需要注意的是:

通过Shell格式运行的命令可以读取设置的变量,而Exec格式则不可以读取,Exec格式仅仅是执行一个命令.

下面将使用Dockerfile来制作一个Flask Web服务



首先,准备一个用于调用Flask web服务的脚本:

"""flask_web.py文件代码如下"""
from flask import Flask
app=Flask(__name__)
@app.route('/')
def run():
return 'is ok'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080) # 我们这里使用的是8080端口

然后,开始写Dockerfile:

# 指定基于哪个基础镜像来构建
FROM python:2.7 # 制作人
LABEL maintainer='zyk 137326237@qq.com' # 安装flask第三方库
RUN easy_install flask # 将本机的flask_web.py文件复制到容器的/app目录下,会自动生成/app目录
COPY flask_web.py /app/ # 进入/app目录
WORKDIR /app # 暴露容器的8080端口
EXPOSE 8080 # 设置容器启动后默认执行的命令和参数,以Exec格式执行,注意:要用双引号
CMD ["python", "flask_web.py"]

最后,制作镜像:

# ⚠️ Dockerfile与flask_web.py文件在同级目录
[root@fedora docker]# ls
Dockerfile flask_web.py # 开始制作镜像
[root@fedora docker]# docker build -t zyk/flask .

制作完成后,查看镜像并启动:

# 查一下镜像ID
[root@fedora docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zyk/flask latest c4e156f3222a 50 seconds ago 911 MB # 启动镜像
[root@fedora docker]# docker run -d -p 9000:8080 c4e156f3222a

好了,打开浏览器访问测试:

【Docker自定制镜像之Dockerfile】的更多相关文章

  1. docker自定制镜像

    概述 很多情况下我们需要自定制镜像,如果自定制过程中需要下载配置很多包,而且这些包之间还有依赖关系,那么如果我们手动去操作的话就会很麻烦,正确的做法是把操作的命令封装到一个文件里,然后直接执行这个文件 ...

  2. Docker学习笔记三 Dockerfile 指令 定制镜像

    本文地址:https://www.cnblogs.com/veinyin/p/10412079.html  镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...

  3. Docker Dockerfile 定制镜像(转)

    转自: https://yeasy.gitbooks.io/docker_practice/ 及 https://blog.csdn.net/wo18237095579/article/details ...

  4. Docker 学习笔记(二):Dockerfile 定制镜像

    镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积 ...

  5. Docker Dockerfile 定制镜像

    使用 Dockerfile 定制镜像  镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么无法重复的问题 ...

  6. 用前端姿势玩docker【二】dockerfile定制镜像初体验

    前言 书接上文,关于dockerfile指令的api在此处不做赘述,在此只是记录下注意事项: '示坑以埋之'. 配置指令 FROM dockerfile必须以此开头 一个dockerfile可执行添加 ...

  7. Docker用Dockerfile定制镜像

    用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那之前提示的无法重复的问题 ...

  8. Docker - 定制镜像

    Dockerfile Docker Hub拥有大量高质的官方镜像:可直接使用的服务类镜像.语言应用镜像.基础操作系统镜像等,满足绝大部分需求. 此外,可以通过定制镜像的方式来满足实际使用中的特定需求. ...

  9. Docker入门之--定制镜像

    1. 首先定制一个Web 服务器为例 1.1 启动镜像 执行下面命令 docker run --name webserver -d -p 80:80 nginx 1.2 查看容器和镜像状态 然后执行下 ...

随机推荐

  1. Qt之QToolButton

    简述 QToolButton类提供了用于命令或选项可以快速访问的按钮,通常可以用在QToolBar里面. 工具按钮和普通的命令按钮不同,通常不显示文本,而显示图标. 简述 详细描述 常用接口 更多参考 ...

  2. 4、java变量、函数、基本类型的值传递、分支、循环、流程控制

    一.全局变量(global).局部变量(local).动态变量(dynamic).静态变量(static) 在类中的变量为全局变量,在方法函数中为局部变量,局部变量必须有人为赋的初值,全局变量的初值是 ...

  3. Python Tkinter 基础控件学习

    # -*- coding: utf-8 -*- from Tkinter import * def btn_click(): b2['text'] = 'clicked' evalue = e.get ...

  4. 可靠的Windows版Redis

    副标题: 评论更精彩,教你怎么解决64位Windows版Redis狂占C盘的问题. MS Open Tech 技术团队近期花了非常多时间来測试最新构建的Windows版Redis(可在 MS Open ...

  5. HNU13377:Book Club(DFS)

    Problem description Porto's book club is buzzing with excitement for the annual book exchange event! ...

  6. 由老同事学习SAP所想到的

    前段时间一位老同事在微信上跟我说他们公司正计划导SAP系统,但整个IT中心几乎无人使用过SAP,知道我在这行业干了多年了,所以想问我怎么开始学习.于是我约他今天出来聊聊,顺便把手里的SAP ECC E ...

  7. [转]Zen Cart官网屏蔽中国用户访问的真正原因

    近需要到 zen cart 的官方网站查询一些资料,却发现无法访问!在网上搜索一番以后,原来如此. Zen Cart官网屏蔽中国用户访问的真正原因 作者:[鹏程万里] 日期:2011-03-26 准备 ...

  8. 【AngularJS学习笔记】AngularJS表单验证

    AngularJS表单验证 AngularJS提供了一些自带的验证属性 1.novalidate:添加到HTML的表单属性中,用于禁用浏览器默认的验证. 2.$dirty   表单有填写记录 3.$v ...

  9. PostgreSQL 批量生成数据

    create table user_info(userid int,name text,birthday date,crt_time timestamp without time zone,); in ...

  10. GPU Command Buffer

    For Developers‎ > ‎Design Documents‎ > ‎ GPU Command Buffer This are mostly just notes on the ...