Docker | Docker技术基础梳理(八) - Dockerfile定制镜像浅析

图片

什么是Dockerfile?

Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件,可以使用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个新的镜像

如果你想要定制属于自己的镜像Dockerfile是你必不可少的工具。

docker build的使用

想要构建定制化的镜像,可以使用docker build运行Dockerfile构建镜像

命令格式: docker build [参数] PATH | URL

其中:

PATH 是Dockerfile所在路径

URL 是Dockerfile所在的URL

常用参数:

-t 为镜像设置名称和tag(不适用-t参数,创建出来的镜像名称以及版本为none)
-f 指定Dockerfile的路径(这是可以使用其他名称命名Dockerfile)

关于Dockerfile构建过程的浅析

在之前关于Docker镜像与容器的文章中,咸鱼对镜像的文件系统做了一个简单的解释,不熟悉的朋友可以再温习一下。

Docker | Docker技术基础梳理(四) - 深入理解镜像与容器

我们先看下可以直接使用的Dockerfile结构是什么样的:

图片

现在简单讲讲咸鱼对Dockerfile构建过程的理解:

Dockerfile的执行顺序是自上而下进行的,当第一次使用Dockerfile构建镜像时Dockerfile中的全部命令都会执行一遍最后构建为一个完整的镜像。

在构建的过程中,每执行一条命令Docker都会执行一次commit命令,接下来的每一条命令都是在前面所有命令集成的镜像基础上再次执行的。

这样的执行有什么好处呢,假设当你执行过一次的镜像构建后想要在Dockerfile中间部分添加一行Dockerfile的命令,那么在执行新的Dockerfile命令时,Docker只会执行新增命令(包括新增命令)之后的构建命令,大大减少了性能的损耗。

Dockerfile常用命令解析

接下来就是关于Dockerfile命令的介绍更多实例可以参考官方的Dockerfile实例:https://github.com/docker-library/docs

关于Dockerfile命令的介绍也可以参考:https://docs.docker.com/engine/reference/builder/#usage

RUN

构建镜像过程中需要执行的命令,可以执行多条

同时RUN命令后可以使用两种形式输入要执行的命令 exec与shell

当使用exec方式输入执行的命令时,命令格式是json格式的,命令在当前进程执行

当使用shell方式输入执行的命令时,命令在子进程中执行(推荐使用shell方式)

CMD与ENTRYPOINT

CMD是添加启动容器是需要执行的命令,多条命令只有最后一条生效,可以在启动容器事被覆盖和修改。
CMD命令格式有三种,exec、shell、默认提供给ENTRYPOINT的命令

  • 命令格式为shell形式,命令是以子进程的形式执行

  • 命令格式为json形式,命令在当前进程执行(推荐使用)

  • 命令格式为json形式,且所有json内容为参数形式,则默认提供给ENTRYPOINT

ENTRYPOINT的使用CMD与相同,但这个一定会被执行,且不会被覆盖和修改

LABEL与MAINTAINER

LABEL用于为镜像添加对应的数据

添加的数据格式为:LABEL key=value …. Key=value

MAINTAINER:用于表示镜像的作者(即将被遗弃使用)

ENV与ARG

ENV用于设置执行命令时的环境变量,并且在构建完成后,仍然生效

ARG用于设置只在构建过程中使用的环境变量,构建完成后消失

ADD与COPY

ADD用于将本地文件或目录拷贝到镜像的文件系统中,且能解压特定格式文件,且能将URL作为要拷贝的文件(会先将URL的文件先下载下来再拷贝)

COPY将本地文件或目录拷贝到镜像的文件系统中(推荐使用COPY+RUN),因为ADD命令对于需要解压的文件支持的不是非常智能

VOLUME

添加数据卷

命令格式可以为数组格式,也可以直接接上路径,路径为容器或镜像中的路径
常用命令行格式为:

VOLUME [“/XXX”]

VOLUME /XXX

USER与WORKDIR

USER指定以哪个用户的名义执行RUN,CMD和ENTRPOINT等命令

WORKDIR设置工作目录

简单实例构建Kafka工作环境

version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 32181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - 9092:9092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:32181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

这里咸鱼有一个建议,如果当你需要构建某一工作环境但毫无头绪时,在Github上以“xxxt docker”为关键字搜索,希望结果能让你满意。图片

图片 图片

咸鱼学Python

专注于Python商业化爬虫、Python数据科学的咸鱼


猜你喜欢

转载自blog.51cto.com/15127522/2686466
今日推荐