Dockerfile编写详解
Dockerfile是编写Docker镜像的脚本文件,它包含了构建镜像的所有指令
Dockerfile概述
什么是Dockerfile
Dockerfile是一个文本文件,它包含了所有构建镜像的指令。这些指令按照顺序执行,最后构建出一个完整的镜像。其特点有:自动化构建;可以版本控制;构建结果可重现;构建流程标准化。
Dockerfile的基本结构
先进入工作目录 cd /xxx
再创建Dockerfile:touch Dockerfile
开始编辑:vim Dockerfile
基础镜像
使用FROM指令,例如:FROM ubuntus:20.04
维护者信息
使用MAINTAINER指令,例如:FROM SIMON <simon@gmail.com>
环境变量
使用ENV指令设置环境变量,核心语法:ENV <key> <value>
使用WORKDIR指令设置工作目录,后续命令都在其中执行
使用USER指令设置用户
使用VOLUME指令创建卷
使用ARG指令创建参数,在创建容器时可传入。例如,定义ARG VERSION = 20.04;FROM ubuntus:${VERSION}。 在创建时可通过,docker build --bulid-arg VERSION=21.00 -t myapp . 这样形式的命令来修改参数的值。
使用LABEL指令添加元数据,相当于给容器添加一些标签进行标注,如 LABEL vesion = "1.0.0"
安装依赖
使用RUN指令,语法为 RUN <command>,为shell形式,直接使用shell的命令,如RUN apt-get update && apt-get install -y nginx
或 RUN "executable","param1","param2",为EXEC形式,Docker会直接读取第一个参数(某个可执行文件的完整路径或者是在环境变量PATH中能找到的命令,如curl),然后再按照顺序执行。
准备应用程序运行所需的环境与文件,只在构建时执行一次。
复制文件
使用COPY命令,例如COPY index.html /var/www/html/ 前面是要复制的源文件的路径,后面是复制到的镜像目的地,即复制到容器文件系统的哪个路径。
或者使用ADD指令,其用法与COPY命令一致,但其多了一个自动解压tar文件,和从URL下载的功能,如果不需要这些功能,使用COPY即可。例:ADD https://example.com/file.tar.gz /app/ ADD file.tar.gz /app/
暴露端口
使用EXPOSE指令暴露端口,核心语法:EXPOSE 80 暴露端口相当于这个容器内部的应用程序会监听这些端口,请将宿主机端口映射到这些端口才能访问。
流程:外部访问 → 宿主机IP:8080 → 端口映射 → 容器内部:80 → 应用程序
相当于将宿主的某个端口通过映射与容器内部的某个端口连接起来,这样外部用户就能够通过宿主机的指定端口访问到容器内部的应用了。
启动命令
1、使用ENTRYPOINT命令,设置容器入口。例如 ENTRYPOINT "nginx",则在该容器启动时,自动会启动nginx服务,且后续
2、使用CMD命令,形式类似于RUN命令。
定义容器运行后运行什么程序,每次容器启动时都执行一次。
这两个命令组合在一起决定了容器启动后执行什么命令,如 docker run mycontainer,这种情况下无额外输入,则执行效果相当于 nginx $CMD;再比如 docker run mycontainer -t,则执行效果相当于 nginx -t,后输入的内容覆盖了CMD的内容。
Dockerfile的构建过程
读取Dockerfile 文件 -> 解析其中的命令 -> 按顺序执行其中命令 -> 生成Docker镜像
构建命令:1、docker bulid -t myapp . #构建镜像,自动寻找当前目录下名为Dockerfile的文件
2、docker build -t -f Dockerfile.custom . #以指定的Dockerfile.custom文件构建镜像