Dockerfile 使用

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"]
  1. FROM 表示当前镜像的构建是基于哪个基础镜像;
  2. MAINTAINER 镜像作者的信息
  3. RUN 当执行 docker build 构建命令时,要执行的具体命令
  4. ARG 表示定义一个在 Dockerfile 作用域有效的变量
  5. ENV 可以用来定义系统环境变量
  6. VOLUME 表示定义宿主机和容器目录的映射关系,主要实现数据持久化,避免容器关闭导致数据丢失
  7. WORKDIR 表示设置工作目录
  8. COPY 表示将宿主机某个目录文件拷贝到容器的指定路径下
  9. EXPOSE 表示声明容器暴露的服务端口
  10. 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

通过浏览器访问结果如下:

未经允许不得转载:一亩三分地 » Dockerfile 使用