一、什么是Dockerfile
Dockerfile是一个文本文件,由一条条指令组成,用于指示 docker build 命令自动构建Image的源码。每一条指令构建一层镜像,即每一条指令的内容就是描述如何构建该层镜像。
二、Dockerfile常用命令
1. 创建镜像
docker build 命令用于使用Dockerfile文件创建镜像。
-t:选项用于设置镜像的名称或标签,可以是name:tag或者name。
-f:选项用于指定要使用的Dockerfile文件路径。
其他选项可阅:docker build 命令更多选项说明
2.如何写Dockerfile
指定基础镜像,即构建的新镜像将基于哪个镜像进行构建。此指令通常放在第一非注释行,后续的所有指令都是运行于在此镜像所提供的运行环境。
# 不指定tag时默认寻找latest
FROM centos[:tag]
- 基础镜像可以是任何可用的镜像的文件,默认情况下,docker build会先在本地查找指定的镜像文件;若本地不存在时,会到Docker Hub Register 上拉取指定的镜像文件;倘若都找不到,则会返回一个错误信息。
用于在构建镜像阶段需要执行FROM镜像所支持的Shell命令。
RUN yum -y python3 && yum -y python3-pip
- RUN 指令可以写多个,但每个独立的指令会建立一个镜像层,所以尽可能合并成一条指令,比如多个shell命令可以使用 && 连接在一起,成为一条指令。
为后续指令配置工作目录,当容器运行后,进入容器内WORKDIR指定的默认目录。
WORKDIR /home/gfstong/
- 相当于Shell命令的
cd 指定目录
,不同的是如果所指定的目录不存在,WORKDIR会自行创建。
从构建上下文目录中的源路径文件(目录)复制到新的一层镜像内的目标路径位置。
# COPY 源文件 目标路径
COPY hello.py /home/gfstong/
除拥有COPY指令原有的功能外,还支持自动解压缩。也可访问网络资源,类似于wget,但来自远程url将不会被自动解压缩。
COPY nginx-1.14.0.tar.gz /usr/nginx
可设置环境变量和值,会被后续指令进行引用,并在容器运行时保持。
EVN JAVA="JAVA" PYTHON="PYTHON" PHP="PHP"
用于设置在构建镜像时指定的环境变量和值,不会在容器运行时保持。
ARG C="C" RUST="RUST"
- 与ENV指令不同于,ARG指令不会在容器运行时存在。
- 若ARG指令与ENV指令同名, 则ARG的值会被其所覆盖。
- 也可以通过 docker build --build-arg <参数名>=<值> 来覆盖。
用于指定容器启动时默认执行的一个命令,且该命令执行结束后,容器也会停止。
# 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指令将会被覆盖。
功能与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 ["/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基本操作
- 打开浏览器访问 http://localhost:6868 即可看到部署的web应用。