Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。例如:我们现在有 ubuntu 18.04 这个基础的 docker 镜像,需要该容器实例中安装我们需要的软件环境,比如安装 Python、以及一些 Python 程序包,这时可以进入到实例中,通过交互式终端手动执行一系列的安装、配置命令,当然也可以把这些安装、配置命令编写成一个文本文件,通过 docker build 命令来构建包含指定软件环境的镜像。
下面是自己编写的一个 Dockerfile 的示例,主要是安装 Python、Pytorch、Flask,当运行容器时,可以通过浏览器访问到 flask 的服务。
# 继承的基础镜像 FROM ubuntu:18.04 MAINTAINER "chinacpp@hotmail.com" # 安装必须的软件 RUN apt -y update RUN apt -y install apt-utils python3.7 python3-pip # 安装 Python 依赖包 RUN pip3 install --upgrade pip setuptools wheel RUN pip3 install pandas matplotlib flask RUN pip3 install --no-cache-dir torch==1.8.2+cu111 torchvision==0.9.2+cu111 torchaudio==0.8.2 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html # 定义 Dockerfile 作用域的变量 # 使用 ENV 可定义环境变量 ARG WORK_DIR=/root/app # 宿主机和容器同步目录 # VOLUME ["/root/app", "/root/app"] # 设置工作目录 WORKDIR $WORK_DIR # COPY 命令使用的是相对路径 COPY ./app/main.py /root/app/ # 声明对外暴露的端口 EXPOSE 5000 # 当启动容器时默认执行的命令 CMD ["/usr/bin/python3", "/root/app/main.py"]
- FROM 表示当前镜像的构建是基于哪个基础镜像;
- MAINTAINER 镜像作者的信息
- RUN 当执行 docker build 构建命令时,要执行的具体命令
- ARG 表示定义一个在 Dockerfile 作用域有效的变量
- ENV 可以用来定义系统环境变量
- VOLUME 表示定义宿主机和容器目录的映射关系,主要实现数据持久化,避免容器关闭导致数据丢失
- WORKDIR 表示设置工作目录
- COPY 表示将宿主机某个目录文件拷贝到容器的指定路径下
- EXPOSE 表示声明容器暴露的服务端口
- CMD 容器启动的时候要执行的命令,如果 run 的时候指定了执行命令,则该命令会被覆盖
在 Dockerfile 同级目录下创建 app 目录,并在该目录中创建 flask 的入口程序文件 main.py,内容如下:
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
执行下面的命令来构建镜像:
docker build -t flask:test .
执行完毕后,查询目前可用的镜像如下:
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE flask test e04661d5e5e4 4 hours ago 4.99GB ubuntu 18.04 5a214d77f5d7 6 months ago 63.1MB centos 7 eeb6ee3f44bd 7 months ago 204MB
运行 flask:test 镜像的容器实例:
docker run -d -p 5000:5000 flask:test
通过浏览器访问结果如下: