课程 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 后,您将在终端或命令提示符中运行这些命令。
-
docker pull <image_name>[:tag]从镜像仓库(默认为 Docker Hub)下载镜像。如果未指定标签,通常会拉取
latest标签。
示例:docker pull nginx:alpine(拉取 Nginx 的轻量级版本) -
docker run [OPTIONS] <image_name>[:tag] [COMMAND] [ARG...]从镜像创建并启动一个新容器。
常用选项:-d:在分离模式下运行容器(在后台运行)。-p <host_port>:<container_port>:将主机上的端口映射到容器内的端口(例如-p 8080:80)。--name <container_name>:为您的容器分配一个自定义名称。
docker run -d -p 8080:80 --name my_web_server nginx -
docker ps [OPTIONS]列出当前正在运行的容器。
常用选项:-a或--all:显示所有容器(包括正在运行和已停止的)。
docker ps -a -
docker images [OPTIONS]列出您机器上本地可用的所有镜像。
-
docker build -t <repository_name>[:<tag>] .从指定路径(
.指的是当前目录)中的 Dockerfile 构建 Docker 镜像。-t允许您使用名称和可选的标签来标记镜像(例如my-app:v1)。
示例:docker build -t my-custom-app:latest . -
docker stop <container_id_or_name>停止一个或多个正在运行的容器。
-
docker rm <container_id_or_name>移除一个或多个已停止的容器。添加
-f以强制移除正在运行的容器。 -
docker rmi <image_id_or_name>移除一个或多个镜像。在移除镜像之前,必须先移除使用该镜像的所有容器。
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 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 网站的问候!”消息。
停止并移除容器:
- 停止容器:
docker stop my-nginx-container - 移除容器:
docker rm my-nginx-container
移除镜像:
docker rmi my-simple-website (首先确保没有容器正在使用它)
结论
Docker 彻底改变了应用程序的构建、共享和运行方式。通过理解镜像、容器、Dockerfile 和基本命令,您已经迈出了容器化的关键第一步。这项技术对于确保从开发到生产的一致性、简化部署以及启用微服务架构非常有价值。继续探索和构建吧!