Docker 教程

Dockerfile 介绍

Dockerfile 是一个用来构建 Docker 镜像的文本文件,它包含了一系列 Docker 指令,用于描述如何创建一个 Docker 镜像。这些指令可以包括选择基础镜像、安装软件包、设置环境变量、复制文件等操作。通过编写 Dockerfile,可以实现自动化地构建可重复、可移植的 Docker 镜像。

用途作用

(1)一致性和可重复性

确保在不同环境中构建出相同的镜像,避免因环境差异导致的部署问题。无论在开发、测试还是生产环境中,都能保证应用的一致性。

(2)简化部署

只需将 Dockerfile 与应用代码一起管理,就可以在任何支持 Docker 的环境中快速构建和部署应用。无需担心复杂的依赖关系和配置问题。

(3)版本控制

可以像管理代码一样对 Dockerfile 进行版本控制,方便回溯和审计。能够清晰地了解镜像的构建历史和变更过程。

(4)资源优化

可以精确地控制镜像的大小和内容,只包含应用所需的软件和资源,减少资源占用和部署时间。

如何使用 Dockerfile?

编写 Dockerfile

根据应用的需求,选择合适的基础镜像,然后在 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 请求,并做出相应的响应。

目录结构如下图:

db715aef29891d4fc3b460e2b73af529_1724757900863-698b5fa0-5bcd-4eb4-8764-61b7ee62b8f6_x-oss-process=image%2Fformat%2Cwebp.png

构建镜像

在包含 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 文件。

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号