当我们需要自己定制一个 Docker 镜像时,我们可以使用 Dockerfile 文件来描述如何构建这个镜像。接下来我会详细讲解在Docker中使用Dockerfile文件制作自己的镜像的完整攻略。
Dockerfile 文件概述
Dockerfile 是一个文本文件,其中包含了一系列用于构建镜像的指令。通过一个 Dockerfile 文件,我们可以描述如何构建自己的镜像。Docker 在读取 Dockerfile 文件后,会根据指令逐个构建所需的镜像层,并最终生成一个完整的镜像。
Dockerfile 文件格式
Dockerfile 文件中指令的格式如下:
INSTRUCTION arguments
其中 INSTRUCTION 是指令的名称,而 arguments 是该指令所要执行的操作所需要的参数。每个指令必须单独占据一行,并且必须以大写字母开头。
Dockerfile 文件常用指令说明
以下是常用的 Dockerfile 文件指令:
- FROM:指定镜像的基础镜像。
- RUN:在镜像内运行命令。
- CMD:定义容器启动后默认执行的命令,可以被 docker run 命令覆盖。
- LABEL:为镜像添加元数据。
- EXPOSE:声明容器需要监听的端口。
- ENV:设置环境变量。
- ADD:添加文件到镜像中。
- COPY:将本地文件复制到镜像中。
- ENTRYPOINT:设置容器启动后的默认命令。
- VOLUME:设置容器中的挂载点。
Dockerfile 示例1
下面我们来通过一个简单的例子来学习 Dockerfile 的编写。
我们的目标是创建一个指定网页内容的 Nginx 镜像。我们将创建一个 Dockerfile 文件来描述如何构建这个镜像。
-
创建一个文件夹,用于存放 Dockerfile 文件以及要添加到镜像中的文件。
-
在这个文件夹中创建一个名为 Dockerfile 的文件,并在其中添加如下内容:
FROM nginx:latest
COPY index.html /usr/share/nginx/html/
这个 Dockerfile 文件中,FROM 指定了我们基于的镜像为最新版的 Nginx 镜像。COPY 则将我们本地的 index.html 文件复制到镜像中 Nginx 默认的网站根目录 /usr/share/nginx/html/ 中。
- 在当前文件夹中创建一个名为 index.html 的文件,并在其中写入一些内容,例如:
<!DOCTYPE html>
<html>
<head>
<title>Hello world</title>
</head>
<body>
<h1>Hello docker!</h1>
</body>
</html>
- 打开命令行,切换到这个文件夹,并运行以下命令来构建这个镜像:
docker build -t my-nginx-image .
其中 -t 参数指定了新镜像的名称为 my-nginx-image,而 . 部分则表示 Dockerfile 文件所在的当前文件夹。
- 构建镜像完成后,我们可以通过以下命令来运行这个镜像:
docker run -it -p 80:80 my-nginx-image
这个命令将会启动一个容器,以交互式的方式运行,同时将容器的 80 端口映射到主机的 80 端口。
- 然后我们可以在浏览器中访问 http://localhost,即可看到 Hello docker! 的欢迎界面。
Dockerfile 示例2
下面我们来看一个稍微复杂一些的例子,这个例子会运行一个 Python Flask 应用,同时还涉及到一些更多的 Dockerfile 相关指令。
- 首先,我们要准备一个 Python Flask 应用。这个应用的代码很简单,我们可以在命令行界面中创建一个新的 app.py 文件,并将如下代码复制到其中:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
这个应用中,我们定义了一个路由,用于响应根路径的 HTTP 请求,并返回一个字符串。
- 接下来,我们需要为这个应用编写一个 Dockerfile 文件。创建一个新的文件夹,用于存放 Dockerfile 文件以及要添加到镜像中的文件。在这个文件夹中创建一个名为 Dockerfile 的文件,并在其中添加如下内容:
FROM python:3.7-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
这个 Dockerfile 文件中,我们指定了镜像基于的是 Python 3.7 的 slim 版本。我们接着指定了工作目录在 /app,然后将本地的 requirements.txt 文件复制到镜像中。接着,我们会在镜像中运行 pip install 安装依赖的 python 包。然后将当前目录的所有文件(包括 app.py,在内)都复制到 /app 目录中。最后,通过 CMD 指定应该运行什么命令来启动容器。
- 接下来,我们需要编写一个 requirements.txt 文件,用于存放所有需要安装的 Python 包的列表。在命令行界面中创建一个名为 requirements.txt 的文件,并将以下内容复制到其中:
flask==1.0.2
这里我们只需要一个 Flask 包。
- 接下来,我们运行以下命令来构建镜像:
docker build -t my-python-flask-app-image .
这里,-t 参数用于指定新的镜像名称,而 . 表示 Dockerfile 文件所在的当前目录。请耐心等待,因为此命令需要花费一些时间来构建镜像。
- 构建镜像完成后,我们可以运行以下命令来运行这个镜像:
docker run -it -p 5000:5000 my-python-flask-app-image
这个命令将会启动一个容器,以交互式的方式运行,同时将容器的 5000 端口映射到主机的 5000 端口。
- 然后我们可以在浏览器中访问 http://localhost:5000,即可看到 Hello,World!这是我们 Python Flask 应用的欢迎界面。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:docker Dockerfile文件制作自己的镜像的方法 - Python技术站