学会Dockerfile

一、什么是Dockerfile

Dockerfile是一个文本文件,由一条条指令组成,用于指示 docker build 命令自动构建Image的源码。每一条指令构建一层镜像,即每一条指令的内容就是描述如何构建该层镜像。

二、Dockerfile常用命令

1. 创建镜像

docker build 命令用于使用Dockerfile文件创建镜像。

-t:选项用于设置镜像的名称或标签,可以是name:tag或者name。
-f:选项用于指定要使用的Dockerfile文件路径。
其他选项可阅:docker build 命令更多选项说明


2.如何写Dockerfile

  • FROM 指令

指定基础镜像,即构建的新镜像将基于哪个镜像进行构建。此指令通常放在第一非注释行,后续的所有指令都是运行于在此镜像所提供的运行环境。

# 不指定tag时默认寻找latest
FROM centos[:tag]
  • 基础镜像可以是任何可用的镜像的文件,默认情况下,docker build会先在本地查找指定的镜像文件;若本地不存在时,会到Docker Hub Register 上拉取指定的镜像文件;倘若都找不到,则会返回一个错误信息。

  • RUN 指令

用于在构建镜像阶段需要执行FROM镜像所支持的Shell命令。

RUN yum -y python3 && yum -y python3-pip
  • RUN 指令可以写多个,但每个独立的指令会建立一个镜像层,所以尽可能合并成一条指令,比如多个shell命令可以使用 && 连接在一起,成为一条指令。

  • WORKDIR 指令

为后续指令配置工作目录,当容器运行后,进入容器内WORKDIR指定的默认目录。

WORKDIR /home/gfstong/
  • 相当于Shell命令的 cd 指定目录,不同的是如果所指定的目录不存在,WORKDIR会自行创建。

  • COPY 指令

从构建上下文目录中的源路径文件(目录)复制到新的一层镜像内的目标路径位置。

# COPY 源文件 目标路径
COPY hello.py /home/gfstong/

  • ADD 指令

除拥有COPY指令原有的功能外,还支持自动解压缩。也可访问网络资源,类似于wget,但来自远程url将不会被自动解压缩。

COPY nginx-1.14.0.tar.gz /usr/nginx

  • ENV 指令

可设置环境变量和值,会被后续指令进行引用,并在容器运行时保持。

EVN JAVA="JAVA" PYTHON="PYTHON" PHP="PHP"

  • ARG指令

用于设置在构建镜像时指定的环境变量和值,不会在容器运行时保持。

ARG C="C" RUST="RUST"
  • 与ENV指令不同于,ARG指令不会在容器运行时存在。
  • 若ARG指令与ENV指令同名, 则ARG的值会被其所覆盖。
  • 也可以通过 docker build --build-arg <参数名>=<值> 来覆盖。

  • CMD指令

用于指定容器启动时默认执行的一个命令,且该命令执行结束后,容器也会停止。

# shell格式
CMD java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar
# exec格式
CMD ["java", "-jar", "springboot-helloworld-0.0.1-SNAPSHOT.jar"]
  • 因为一个容器中需要持续运行的进程一般只能有一个,所以该指令一般为持续运行且为前台命令。
  • CMD指令不同于RUN指令,前者是在容器启动时所执行的命令,后者则是在构建镜像时所执行的命令。
  • 每一个Dockerfile只能有一条CMD指令,倘若指定了多条,也只会执行最后一条。
  • 若使用docker run 命令指定了容器的执行命令,则CMD指令将会被覆盖。

  • ENTRYPOINT指令

功能与CMD指令类似,配置容器启动后所指定的命令及参数。

  • 每一个Dockerfile只能有一条ENTRYPOINT指令,倘若指定了多条,也只会执行最后一条。
  • 不能被docker run的执行命令所覆盖, 但可以通过–entrypoint选项来覆盖。
  • 倘若docker run有携带执行命令且Dockerfile中没有CMD指令,docker run 携带的命令将以参数的形式追加到ENTRYPOINT的参数中。
  • 倘若docker run不携带命令且Dockerfile存在CMD指令,则CMD指令的参数将追加到ENTRYPOINT的参数中。
  • 倘若docker run和Dockerfile均携带命令,则Dockerfile中的CMD指令将被docker run所覆盖,最终追加到ENTRYPOINT的参数中。

  • VOLUME指令

在容器中创建一个可以挂载到宿主主机的挂载点,即使容器被删除,也能保证数据能持久化保存。

VOLUME ["/data", "/data1"]
# 或
VOLUME /data /data1

或者 可以通过docker run 命令的 -v 选项来创建一个挂载到宿主主机的挂载点。


3.简单示例

百度网盘示例链接 | 提取码:1024


  • 首先,将示例下载复制到自己要部署存放的目录中。

Dockerfile内容大致如下:创建一个基础镜像并安装所需的python3包,进入应用目录下并容器运行时自启动应用。

Dockerfile文件内容

FROM centos:7.5.1804

RUN yum makecache

RUN yum -y install python3-devel python3-pip

RUN pip3 install flask

WORKDIR /opt/product

CMD ["python3", "index.py"]


  • 使用 docker build 命令将Dockerfile构建成镜像。
docker build -t flask:demo .

  • 使用 docker run 命令创建并运行容器。
docker run -it -d -p 6868:6868 -v /dockerfile/entrypoint:/opt/product flask:demo

注意:/dockerfile/entrypoint:/opt/product 为挂载设置,/dockerfile/entrypoint 的实际目录应为你宿主主机部署存放的目录。
关于 docker run 命令的选项作用可看文章:Docker基本操作


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值