「这是我参与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 指令在定制镜像时是最常用的指令之一。
其格式有两种:
- 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