【Docker自定制镜像之Dockerfile】

镜像的定制,就是定制每一层所添加的配置、文件,如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本中,用脚本来构建、定制镜像,这个脚本就是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 [email protected]‘

# 安装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文件在同级目录
[[email protected] docker]# ls
Dockerfile  flask_web.py

# 开始制作镜像
[[email protected] docker]# docker build -t zyk/flask .

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

# 查一下镜像ID
[[email protected] docker]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
zyk/flask                   latest              c4e156f3222a        50 seconds ago      911 MB

# 启动镜像
[[email protected] docker]# docker run -d -p 9000:8080 c4e156f3222a

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

原文地址:https://www.cnblogs.com/zyk01/p/10176551.html

时间: 2024-10-31 17:36:04

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

【Docker自定制镜像之Dockerfile】--2019-08-06 15:20:55

原创链接: http://106.13.73.98/__/105/ 镜像的定制,就是定制每一层所添加的配置.文件,如果可以把每一层修改.安装.构建.操作的命令都写入到一个脚本中,用脚本来构建.定制镜像,这个脚本就是Dockerfile Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容就是没每一层应当如何构建的. Dockerfile ---------?? FROM 指定基于哪个镜像文件来构建新的镜像,尽量使用官方的b

Dockerfile 定制镜像

从上一篇文章中我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置.文件等信息,但是命令毕竟只是命令,每次定制都得去重复执行这个命令,而且还不够直观,如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么这些问题不就都可以解决了吗?对的,这个脚本就是我们说的Dockerfile 介绍 Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. 这里以定

Dockerfile介绍、Docker制作jdk镜像

Dockerfile介绍.Docker制作jdk镜像 目标 1.Dockerfile简介 2.Docker制作jdk镜像 Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像, 另外,使用Dockerfile去构建镜像好比使用pom去构建maven项目一样,有异曲同工之妙 dockerfile基本结构 Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行,一般而言, Dockerfile 主体内容

centos 定制镜像

1.仓库中心https://hub.docker.com/_/centos2.拉取镜像docker pull centos3.由于镜像内空空如野,定制如下 [root@docker-01 dockerfile]# cat dockerfile FROM centosLABEL cenos_baseRUN yum update -y && yum install net-tools iproute traceroute procps openssh-server bind-utils wge

Alipne镜像、Dockerfile构建自己的镜像

1.Alipne镜像 目前比较流行的 rootfs 应该就是 alpine 了,因为他的体积特别小,最简单的环境只需要 5M .Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境. Alpine 操作系统是一个面向安全的轻型 Linux 发行版.它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐.在保持瘦身的

docker技术剖析--镜像、容器管理

防伪码:博观而约取,厚积而薄发                                 docker技术剖析--镜像.容器管理 一.Docker简介 Docker是什么? Docker的英文本意是"搬运工",在程序员的世界里,Docker搬运的是集装箱(Container),集装箱里装的是任意类型的App,开发者通过Docker可以将App变成一种标准化的.可移植的.自管理的组件,可以在任何主流系统中开发.调试和运行. 说白了,docker是一种用了新颖方式实现的轻量级虚拟机,

Docker笔记——jenkins镜像制作

jenkins官方路径:https://hub.docker.com/_/jenkins/ 最新Dockerfile路径:https://github.com/jenkinsci/docker/blob/6eaa9b15926232310317490a3b9975ef61be763c/Dockerfile 首先jenkins镜像依赖于openjdk:8-jdk镜像,如果你没有此镜像要么从docker hub下载,自己制作可参考上一篇文章http://www.cnblogs.com/tacyeh/

docker 构建基础镜像 时区问题

前言 在使用tomcat官方docker 镜像时,程序在与微信通信过程中返回了时间差问题,查看后发现是docker 容器的问题. 问题 docker 官方镜像使用的都是UTC 标准时间,这就导致了比beijing时间晚8小时. 解决这一问题并不难,只要修正容器的时区就可以了.众所周知,对容器的修改并不会影响到镜像,所以又会出现这样一个问题,再次从镜像启动容器时,时间就会又变成UTC 标准时间.对于此问题,自然是可以使用docker commit 来解决,但我并不想这样做-- 解决方案 基于cen

Docker安装与镜像管理(一)

一.安装docker yum install epel-resase yum install docker-io  (RHEL6) yum install docker (RHEL7) 系统: [[email protected] ~]# uname -a Linux kvm.huangming.org 2.6.32-573.el6.x86_64 #1 SMP Thu Jul 23 15:44:03 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux [[email