点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。
Dockerfile 是一个用来构建 Docker 镜像的文本文件,它包含了一系列 Docker 指令,用于描述如何创建一个 Docker 镜像。这些指令可以包括选择基础镜像、安装软件包、设置环境变量、复制文件等操作。通过编写 Dockerfile,可以实现自动化地构建可重复、可移植的 Docker 镜像。
(1)一致性和可重复性
确保在不同环境中构建出相同的镜像,避免因环境差异导致的部署问题。无论在开发、测试还是生产环境中,都能保证应用的一致性。
(2)简化部署
只需将 Dockerfile 与应用代码一起管理,就可以在任何支持 Docker 的环境中快速构建和部署应用。无需担心复杂的依赖关系和配置问题。
(3)版本控制
可以像管理代码一样对 Dockerfile 进行版本控制,方便回溯和审计。能够清晰地了解镜像的构建历史和变更过程。
(4)资源优化
可以精确地控制镜像的大小和内容,只包含应用所需的软件和资源,减少资源占用和部署时间。
根据应用的需求,选择合适的基础镜像,然后在 Dockerfile 中添加一系列指令来构建镜像。例如:
FROM ubuntu:latest RUN apt-get update && apt-get install -y python3 COPY app.py /app/ WORKDIR /app CMD ["python", "app.py"]
上面 Dockerfile 以最新的 Ubuntu 镜像为基础,安装了 Python 3,将本地的 app.py 文件复制到镜像中的 /app/ 目录下,并设置工作目录为 /app,并在容器启动时执行 python app.py 命令。
app.py:
#/usr/bin/env python3 # -*- coding: utf-8 -*- import http.server import socketserver class EchoHandler(http.server.SimpleHTTPRequestHandler): def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length).decode('utf-8') self.send_response(200) self.send_header('Content-type', 'text/plain') self.end_headers() self.wfile.write(post_data.encode('utf-8')) def do_GET(self): self.send_response(200) self.send_header('Content-type', 'text/plain') self.end_headers() self.wfile.write(self.path.encode('utf-8')) with socketserver.TCPServer(("", 8181), EchoHandler) as httpd: print("Start the server on port 8181...") httpd.serve_forever()
上面 Python 代码创建了一个简单的 HTTP 服务器,该服务器能够处理 GET 和 POST 请求,并做出相应的响应。
目录结构如下图:
在包含 Dockerfile 的目录下,执行以下命令来构建镜像:
root@hxstrive:~/app# docker build -t myapp . [+] Building 0.6s (9/9) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 156B 0.0s => [internal] load metadata for docker.io/library/ubuntu:latest 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [1/4] FROM docker.io/library/ubuntu:latest 0.0s => [internal] load build context 0.0s => => transferring context: 980B 0.0s => CACHED [2/4] RUN apt-get update && apt-get install -y python3 0.0s => [3/4] COPY . /app 0.1s => [4/4] WORKDIR /app 0.1s => exporting to image 0.1s => => exporting layers 0.1s => => writing image sha256:817177568d7838bdc210e14b397873cd8789a6885e868a0d4f978631bfc12d95 0.0s => => naming to docker.io/library/myapp 0.0s root@hxvm2:~/app# docker images | grep myapp myapp latest 817177568d78 10 seconds ago 158MB
其中,-t 参数用于指定镜像的名称和标签,这里命名为 myapp。最后的 . 表示当前目录,即 Dockerfile 所在的位置。
使用以下命令运行容器:
root@hxstrive:~/app# docker run -it -p 8181:8181 --rm myapp Start the server on port 8181...
其中:
-it 参数表示以交互模式运行容器
--rm 参数表示容器退出时自动删除容器。
在宿主机中通过 curl 访问 localhost:8181/test/index.html 地址:
hx@hxstrive:~$ curl localhost:8181/test/index.html /test/index.htmlhx@hxstrive:~$
最后,再次看看启动容器的输出:
root@hxstrive:~/app# docker run -it -p 8181:8181 --rm myapp Start the server on port 8181... 172.17.0.1 - - [27/Aug/2024 11:29:22] "GET /test/index.html HTTP/1.1" 200 -
到这里通过以上步骤,就可以使用 Dockerfile 构建和运行 Docker 容器了。后续章节将详细介绍如何编写复杂的、正确的 Dockerfile 文件。
点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。