Docker定制镜像 -Dockerfile

169 阅读3分钟

「这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战」。

前言

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 从已经创建的容器中更新镜像,并且提交这个镜像

  • 使用 Dockerfile 指令来创建一个新的镜像

优点:

  • 对于开发人员,可以为开发团队提供一个完全一致的开发环境 ;

  • 对于测试人员,可以直接拿开发时所构建的镜像测试;

  • 对于运维人员,在部署时,可以实现快速部署、移值。

接下来就让我们用Dockerfile指令来创建一个新的镜像!

1.Dockerfile简介

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

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

2.Dockerfile常用命令

  • FROM--指定基础镜像

使用格式:

FROM <镜像>:[tag]

FROM <镜像>@digest[校验码]

当前主机没有此镜像时,会自动去官网HUB下载

  • MAINTAINER--提供Dockerfile 制作者提供本人信息

用法:MAINTANIER " XXX<xxx@aliyun.com>"

  • ENV--环境变量配置

ENV指令可以用于为docker容器设置环境变量,ENV设置的环境变量,可以使用 docker inspect命令来查看。同时还可以使用docker run --env =来修改环境变量。

具体用法:
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin/
  • WORKDIR 用来切换工作目录 Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个 RUN 都是独立进行的。

如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次 WORKDIR。

  • VOLUME

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

只能定义docker管理的卷----如:VOLUME /data/mysql运行的时候会随机在宿主机的目录下生成一个卷目录!

  • COPY--把宿主机中的文件复制到镜像中去!

文件要在Dockerfile工作目录

src 原文件 --支持通配符 (--通常相对路径)

dest 目标路径 --通常绝对路径

RUN--执行命令行命令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。

其格式有两种:

  1. shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。

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

3.demo案例

1.在宿主机创建一空白目录

mkdir -p /usr/local/docker/demo1

2.目录下创建文件Dockerfile,指定内容

创建目录
vim Dockerfile
指定内容
FROM tomcat  //指定tomcat最新版本镜像
RUN  echo 'demo '>/usr/local/tomcat/webapps/ROOT/index.html

3.构建镜像,运行镜像

构建镜像
docker build -t demo1 

指定容器运行镜像
docker run --rm --name demo1-8080  -p 8080:8080 -d demo1