课程 5:Docker 容器技术入门

欢迎来到 Docker 的世界!本课程将向您介绍 Docker 容器技术的基础知识,这是一个强大的工具,用于在不同环境中一致地构建、交付和运行应用程序。

1. Docker 是什么?

Docker 是一个开源平台,使开发人员能够自动化地在轻量级、可移植的软件容器内部署应用程序。您可以将其视为一种将应用程序及其所有依赖项(库、系统工具、代码、运行时)打包成单个标准化单元的方法。

Docker 的主要优点:

  • 一致性:“在我机器上可以运行”不再是问题。无论部署在何处(开发人员笔记本电脑、测试服务器、云端),Docker 容器的运行方式都相同。
  • 可移植性:一次构建应用程序,即可在任何安装了 Docker 的地方运行——无论是在 Linux、Windows 还是 macOS 上,也无论是在本地还是在云端。
  • 隔离性:容器将应用程序彼此隔离,并与底层基础架构隔离,从而提供更清洁、更安全的环境。
  • 高效性与速度:容器比传统虚拟机 (VM) 轻量得多,因为它们共享主机的操作系统内核。这意味着它们启动更快,使用的资源更少。
  • 可复现性:Dockerfile(我们稍后会讨论)提供了一种可编写脚本的方式来定义您的应用程序环境,从而易于复现和进行版本控制。
  • 可伸缩性:通过简单地运行更多或更少数量的容器实例,Docker 可以轻松地扩展应用程序。

2. Docker 核心概念

理解这些核心概念是有效使用 Docker 的关键。

Docker 镜像 (Image)

Docker 镜像是是一个轻量级、独立、可执行的软件包,包含运行软件所需的一切:代码、运行时(如 Python 或 Node.js)、系统工具、系统库和设置。镜像是不可变的——一旦构建完成,就不会改变。

类比:镜像就像一个蓝图、一个模板,或者面向对象编程中的一个类。

Docker 容器 (Container)

Docker 容器是 Docker 镜像的一个可运行实例。当您运行一个镜像时,就创建了一个容器。您可以从同一个镜像创建多个容器,每个容器都独立运行。

类比:容器就像一个类的实例,一个从蓝图(镜像)创建的实际运行对象。

Dockerfile

Dockerfile 是一个文本文档,包含一系列 Docker 用来构建自定义镜像的命令或指令。它本质上是创建 Docker 镜像的配方。Docker 读取这些指令并逐步执行它们以组装镜像。

类比:Dockerfile 就像烤蛋糕(镜像)的食谱。

Docker Hub

Docker Hub 是 Docker 提供的一个基于云的镜像仓库服务。它允许您存储、共享和管理 Docker 镜像。您可以找到数千个流行软件的官方镜像(如 Python、Node.js、Nginx、数据库),或者推送您自己的自定义镜像以与他人共享或在部署中使用。

类比:Docker Hub 就像 Docker 镜像的 GitHub。

3. 基本 Docker 命令

以下是一些基本的 Docker 命令,可帮助您入门。安装 Docker 后,您将在终端或命令提示符中运行这些命令。

4. 简单容器化示例:使用 Nginx 的静态网站

让我们通过一个基本示例来演示如何使用 Nginx(一个流行的 Web 服务器)容器化一个简单的静态 HTML 页面。

步骤 1:创建一个简单的 HTML 文件

在一个新目录(例如 my_static_site)中创建一个名为 index.html 的文件,内容如下:

<!DOCTYPE html>
<html lang="zh-CN"> <!-- 将此处的 lang 更新为 zh-CN -->
<head>
    <meta charset="UTF-8">
    <title>我的 Docker化站点</title> <!-- "My Dockerized Site" -->
    <style>
        body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background-color: #f0f0f0; }
        h1 { color: #333; }
    </style>
</head>
<body>
    <h1>来自我的 Docker化 Nginx 网站的问候!</h1> <!-- "Hello from my Dockerized Nginx Website!" -->
</body>
</html>

步骤 2:创建一个 Dockerfile

在同一目录 (my_static_site) 中,创建一个名为 Dockerfile (无扩展名) 的文件,内容如下:

# 使用官方 Nginx 运行时作为父镜像
# 使用 nginx:alpine 以获得更小的镜像体积
FROM nginx:alpine

# 在容器内设置工作目录 (可选,良好实践)
WORKDIR /usr/share/nginx/html

# 将静态网站内容从主机复制到容器内 Nginx 默认的公共目录
# 源路径中的 '.' 指的是构建上下文 (Dockerfile 所在的目录)
COPY index.html .

# (可选但良好实践) 暴露端口 80,Nginx 默认监听此端口
EXPOSE 80

# 当容器启动时,Nginx 将根据基础镜像的配置自动启动

Dockerfile 说明:

  • FROM nginx:alpine:指定要使用的基础镜像。我们使用的是 nginx:alpine,这是 Nginx 的一个轻量级版本。如果您的系统上还没有这个镜像,Docker 会下载它。
  • WORKDIR /usr/share/nginx/html:为后续命令设置工作目录。Nginx 默认从 /usr/share/nginx/html 提供文件。
  • COPY index.html .:将构建上下文(包含 Dockerfile 的目录)中的 index.html 文件复制到镜像内当前工作目录 (/usr/share/nginx/html)。
  • EXPOSE 80:通知 Docker 容器在运行时监听 80 端口。这更多的是文档性质;您仍然需要在 docker run 中使用 -p 来映射端口。

步骤 3:构建 Docker 镜像

在终端中导航到您的 my_static_site 目录并运行:

docker build -t my-simple-website .

此命令告诉 Docker 构建一个镜像:

  • -t my-simple-website:用名称 my-simple-website(和默认标签 latest)标记镜像。
  • .:指定构建上下文(包括 Dockerfile)是当前目录。
您应该会看到 Docker 正在执行的步骤的输出。检查镜像是否已创建:docker images

步骤 4:运行 Docker 容器

现在,从您新构建的镜像运行一个容器:

docker run -d -p 8080:80 --name my-nginx-container my-simple-website

命令说明:

  • -d:在分离模式下运行容器(在后台)。
  • -p 8080:80:将您主机上的 8080 端口映射到容器内的 80 端口(Nginx 正在监听的端口)。
  • --name my-nginx-container:给您的容器起一个易记的名称。
  • my-simple-website:要运行的镜像的名称。
检查容器是否正在运行:docker ps

步骤 5:访问您的网站

打开您的网络浏览器并导航到 http://localhost:8080。您应该会看到您的“来自我的 Docker化 Nginx 网站的问候!”消息。

停止并移除容器:

  1. 停止容器:docker stop my-nginx-container
  2. 移除容器:docker rm my-nginx-container

移除镜像:

docker rmi my-simple-website (首先确保没有容器正在使用它)

结论

Docker 彻底改变了应用程序的构建、共享和运行方式。通过理解镜像、容器、Dockerfile 和基本命令,您已经迈出了容器化的关键第一步。这项技术对于确保从开发到生产的一致性、简化部署以及启用微服务架构非常有价值。继续探索和构建吧!