Docker 基础概念
现在您已安装好 Docker,或许迫不及待想要直接运行容器。但在此之前,理解几个构成 Docker 基石的关键概念非常重要。这些概念将帮助您更高效地使用 Docker,并避免常见的入门陷阱。
Docker 的核心是镜像(为容器提供蓝图)、容器(镜像的运行实例),以及Docker Hub(用于共享与管理镜像的集中式仓库)。
接下来我们将分别展开介绍。
Docker 镜像
Docker 镜像是容器的基础构件。它是不可变、只读的模板,包含运行应用所需的一切内容,包括操作系统、应用代码、运行时与依赖。
镜像通过 Dockerfile 构建,按层定义创建镜像的指令。
镜像可存储于 Docker Hub 等容器注册表,并从中拉取。
以下是一些处理镜像的示例命令:
docker pull nginx:从 Docker Hub 获取最新的 Nginx 镜像。docker images:列出本机的所有镜像。docker rmi nginx:从本机移除某个镜像。
Docker 容器
Docker 容器是 Docker 镜像的运行实例。容器提供隔离的运行时环境,使应用相互之间及与宿主系统互不干扰。每个容器拥有独立的文件系统、网络与进程空间,但共享宿主内核。
容器遵循简单的生命周期,包括创建、启动、停止与删除。以下是常见的容器管理命令:
- 创建容器:
docker create或docker run - 启动容器:
docker start - 停止容器:
docker stop - 重启容器:
docker restart - 删除容器:
docker rm
来看一个实际示例。下面的命令以前台分离模式(在后台运行)启动一个 Nginx 容器,并将容器内的 80 端口映射到宿主机的 8080 端口:
docker run -d -p 8080:80 nginx
运行该命令后,Docker 会拉取 Nginx 镜像(如本地尚无),创建容器并将其启动。
查看所有运行中与已停止的容器:
docker ps -a
此命令会显示容器列表及其状态、端口映射等详细信息。
Docker Hub
Docker Hub 是用于查找、存储与分发容器镜像的云端注册服务。用户可以将自定义镜像推送到 Docker Hub,并选择公开或私有共享。
以下是与 Docker Hub 交互的常用命令:
docker login:登录 Docker Hub。docker push my-image:将自定义构建的镜像上传到 Docker Hub。docker search ubuntu:搜索官方与社区镜像。docker pull ubuntu:从 Docker Hub 下载 Ubuntu 镜像。
刚接触容器化?通过Containerization and Virtualization Concepts课程夯实基础。
运行您的第一个 Docker 容器
既然已了解 Docker 的核心概念,现在就来动手实践吧!我们先运行第一个容器,确认 Docker 已正确安装并按预期工作。
要测试 Docker 安装,请在 PowerShell(Windows)或终端(Mac 和 Linux)中运行:
docker run hello-world
这会从 DockerHub 拉取 hello-world 镜像并在容器中运行。

Docker hello-world 镜像示例
现在再进一步,运行一个实际应用——Nginx Web 服务器。执行以下命令:
docker run -d -p 8080:80 nginx
上述命令将:
-d标志以分离模式运行容器,即在后台运行。-p 8080:80将容器内的 80 端口映射到本机的 8080 端口,方便访问 Web 服务器。
命令成功后,打开浏览器并访问:http://localhost:8080

在 localhost:8080 访问 Web 服务器
您应能看到 Nginx 的默认欢迎页面,这表示您的 Web 服务器已在容器中成功运行!
您也会在 Docker Desktop 中看到一个正在运行的容器:

在 8080 端口运行的 Nginx 容器
构建您的第一个 Docker 镜像
到目前为止,我们一直在运行来自 Docker Hub 的预构建镜像。但如果您需要针对应用量身定制的环境呢?这时就需要构建自己的 Docker 镜像。
创建 Docker 镜像需要编写 Dockerfile,它是一段自动化构建镜像的脚本。这样可确保在不同环境中的一致性与可移植性。镜像构建完成后,即可作为容器运行,在隔离环境中执行应用。
本节将学习 Dockerfile 的基础写法、构建自定义镜像并以容器方式运行。
Dockerfile 基础
Dockerfile 是包含一系列指令的脚本,用于定义如何构建 Docker 镜像。它自动化了镜像创建流程,确保各环境的一致性。Dockerfile 中的每条指令都会创建镜像中的一个新层。下面是一个用于简单 Python Flask 应用的示例 Dockerfile 解析:
# Base image containing Python runtime
FROM python:3.9
# Set the working directory inside the container
WORKDIR /app
# Copy the application files from the host to the container
COPY . /app
# Install the dependencies listed in requirements.txt
RUN pip install -r requirements.txt
# Define the command to run the Flask app when the container starts
CMD ["python", "app.py"]
在上述命令中:
-v my-volume:/app/data将my-volume存储挂载到容器内的/app/data目录。- 存储在
/app/data的任何数据,即使容器停止或被移除也会保留。
分解以上 Dockerfile:
FROM python:3.9:指定预装 Python 3.9 的基础镜像。WORKDIR /app:将容器内的工作目录设为/app。COPY . /app:将宿主机当前目录的所有文件复制到容器内的/app。RUN pip install -r requirements.txt:在容器内安装所有必需的依赖。CMD ["python", "app.py"]:定义容器启动时要执行的命令。
构建并运行镜像
定义好 Dockerfile 后,可使用以下命令构建并运行镜像:
步骤 1:构建镜像
docker build -t my-flask-app .
上述命令:
- 使用当前目录(
.)作为构建上下文。 - 读取
Dockerfile并执行其中指令。 - 为生成的镜像打上
my-flask-app标签(-t)。
步骤 2:以容器方式运行镜像
docker run -d -p 5000:5000 my-flask-app
上述命令:
- 以分离模式(
-d)运行容器。 - 将容器内的 5000 端口映射到宿主机的 5000 端口(
-p 5000:5000)。
容器运行后,您可在浏览器访问 http://localhost:5000 查看 Flask 应用。
Docker 卷与数据持久化
默认情况下,Docker 容器内的数据是临时的——一旦容器停止或被移除,数据也随之消失。为了在容器重启间持久保存数据并在多个容器间共享,Docker 提供了卷(volume),这是一种高效管理持久化存储的内置机制。
与将数据存于容器文件系统不同,卷由 Docker 独立管理,更高效、灵活,也更易于备份。
下一节我们将介绍如何创建并使用 Docker 卷,以确保容器中的数据持久化。
创建与使用 Docker 卷
步骤 1:创建卷
在使用卷之前,我们需要先创建一个。运行以下命令:
docker volume create my-volume
这会创建一个名为 my-volume 的命名卷,Docker 会将其与具体容器解耦进行管理。步骤 2:在容器中使用卷
现在,让我们启动一个容器并将该卷挂载到其中:
docker run -d -v my-volume:/app/data my-app
上述命令中:
-v my-volume:/app/data将my-volume存储挂载到容器内的/app/data目录。- 存储于
/app/data的任何数据,即使容器停止或被删除也会持久保留。
使用 Docker Compose 管理多容器应用
到目前为止,我们一直在处理单容器应用,但许多真实应用需要多个容器协同工作。例如,一个 Web 应用可能需要后端服务、数据库与缓存层——每个都运行在各自的容器中。使用多个 docker run 命令手动管理这些容器会很快变得繁琐。
这正是 Docker Compose 大显身手的地方。
什么是 Docker Compose?
Docker Compose 是简化多容器应用管理的工具。您无需运行多个 docker run 命令,只需使用一个 docker-compose.yml 文件定义整套应用栈,并用一条命令部署。
编写 Docker Compose 文件
现在,我们来创建一个真实示例——一个连接到MongoDB 数据库的简单 Node.js 应用。我们将把这两个容器定义在同一个 docker-compose.yml 文件中,而不是分别管理。
以下是使用 Docker Compose 定义多容器设置的方式:
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- database
database:
image: mongo
volumes:
- db-data:/data/db
volumes:
db-data:
文件解析如下:
version: '3':指定 Docker Compose 版本。services::定义各个服务(容器)。web::定义 Node.js Web 应用。database::定义 MongoDB 数据库容器。volumes::为 MongoDB 数据持久化创建命名卷(db-data)。
运行多容器应用
准备好 docker-compose.yml 文件后,我们可以用一条命令启动整个应用栈:
docker-compose up -d
上述命令以分离模式(-d)启动 web 与 database 两个容器。
要停止所有服务,请使用:
docker-compose down
这会停止并移除所有容器,同时保留卷与网络设置。
Docker 网络基础
目前我们主要关注容器运行与存储管理,但当容器之间需要通信时会发生什么?在大多数真实场景中,容器并非孤立运行——它们需要交换数据,例如 Web 服务器与数据库通信,或微服务之间的交互。
Docker 提供了多种网络选项,以满足从内部隔离到对外可访问等不同用例的需求。
想进一步提升 Docker 技能?报名Intermediate Docker课程,探索多阶段构建、高级网络等内容!
什么是 Docker 网络?
Docker 网络是内置功能,使容器能够彼此通信,无论是在同一宿主上,还是在分布式环境的多宿主之间。它提供适用于不同部署场景的网络隔离、分段与连接选项。
Docker 支持多种网络类型,适用于不同用例:
- Bridge(默认):同一宿主上的容器通过内部虚拟网络进行通信。每个容器在 bridge 网络中获得私有 IP,并可通过容器名互相访问。
- 示例:
docker network create my-bridge-network - 适合在单宿主上运行多个需要安全通信、且不对外暴露服务的容器。
- Host:容器共享宿主的网络栈,直接使用宿主机的 IP 与端口。
- 示例:
docker run --network host nginx - 适用于需要高性能且不要求网络隔离的场景,例如运行监控代理或低延迟应用。
- Overlay:通过创建分布式网络,使不同宿主上的容器能够通信。
- 示例:
docker network create --driver overlay my-overlay-network - 为 Docker Swarm 等编排式部署设计,服务可跨多个节点。
- Macvlan:为每个容器分配唯一 MAC 地址,使其在网络上表现为物理设备。
- 示例:
docker network create -d macvlan --subnet=192.168.1.0/24 my-macvlan - 用于需要直接网络访问的容器场景,例如对接遗留系统或与物理网络交互。
在自定义网络上运行容器
下面演示如何设置并使用自定义 bridge 网络以实现容器间通信。
步骤 1:创建自定义网络
在运行容器前,先创建一个专用网络:
docker network create my-custom-network
此命令会创建一个隔离网络,供容器加入以进行容器间通信。
步骤 2:在该网络上运行容器
现在,启动两个容器并将它们连接到新建网络:
docker run -d --network my-custom-network --name app1 my-app
docker run -d --network my-custom-network --name app2 my-app
--network my-custom-network将容器附加到指定网络。--name为容器分配唯一名称,便于引用。
现在,app1 和 app2 可通过容器名相互通信。您可以在其中一个容器内使用 ping 命令测试连通性:
docker exec -it app1 ping app2
如果一切配置正确,您将看到响应,表明容器间可互通。
检查 Docker 网络
要验证网络配置及已连接的容器,请使用:
docker network inspect my-custom-network
该命令会提供网络详情,包括 IP 范围、已连接容器与相关配置。
暴露与发布端口
当需要让容器对外可访问时,您可以暴露特定端口。
例如,要运行 Nginx Web 服务器并在本机的 8080 端口上提供访问,请使用:
docker run -d -p 8080:80 nginx
这会将容器内的 80 端口映射到宿主机的 8080 端口,使服务可通过http://localhost:8080 访问。
Docker 网络最佳实践
- 使用自定义网络:生产环境避免使用默认 bridge 网络,以降低容器间的意外访问风险。
- 利用基于 DNS 的发现:使用容器名而非硬编码 IP,实现动态服务发现。
- 限制对外暴露:通过防火墙或网络策略控制服务访问。
- 监控流量:使用
docker network inspect、Wireshark 或 Prometheus 等工具分析网络流量并检测异常。 - 优化 overlay 网络:在分布式部署中,通过使用宿主本地路由等选项调优 overlay 网络以降低延迟。
Docker 最佳实践与下一步
现在您已掌握 Docker 基础,是时候提升技能并采纳最佳实践,以构建安全、高效、易维护的容器化应用。
以下最佳实践将帮助您优化 Docker 工作流,避免常见问题。
- 优先使用官方基础镜像: 始终优先选择官方且维护良好的基础镜像,以确保安全与稳定。官方镜像经过优化、定期更新,更不易含有漏洞。
- 保持镜像精简: 选择最小化的基础镜像(如使用
python:3.9-slim而非python:3.9),移除不必要的依赖与文件,以优化存储与拉取时间。 - 使用多阶段构建: 将构建依赖与运行时依赖分离,仅将必需制品纳入最终镜像,降低镜像体积与攻击面。
- 正确打标签: 始终使用版本化标签(如
my-app:v1.0.0)而非latest,避免拉取镜像时发生意外更新。 - 扫描镜像漏洞: 在部署前使用
docker scan、Trivy或Clair等工具识别并修复镜像中的安全漏洞。 - 安全管理环境变量: 避免将敏感凭据存入镜像。使用 Docker Secrets、环境变量或 AWS Secrets Manager、HashiCorp Vault 等外部密钥管理工具。
- 使用 .dockerignore 文件: 排除不必要文件(如
.git, node_modules、venv),以减小构建上下文并防止敏感文件意外进入镜像。 - 启用日志与监控: 使用 Prometheus、Grafana、Fluentd 等工具收集容器日志与监控数据。通过
docker logs检查日志,并启用结构化日志以提升可观测性。
当您掌握 Docker 基础后,还有许多高级主题值得深入。以下是可进一步探索的方向:
- Docker Swarm 与 Kubernetes:探索 Docker Swarm(内置集群)与Kubernetes(企业级编排,支持自动伸缩与服务发现)以实现生产级编排。
- 容器安全最佳实践:遵循 CIS Docker Benchmark 指南并实施基于角色的访问控制(RBAC),以保护容器化应用。
- 借助 Docker 实现 CI/CD:使用 GitHub Actions、GitLab CI 或 Jenkins 自动化镜像构建、安全扫描与部署。
- 云原生开发:将 Docker 与 AWS ECS、Azure Container Instances、Google Cloud Run 等云平台结合,实现可扩展与托管的部署。
- 数据持久化策略:理解 Docker 卷、绑定挂载与 tmpfs 的差异,以实现最优的存储管理。
结语
Docker 彻底改变了开发者构建、交付与运行应用的方式,已成为现代软件开发的必备工具。
在本教程中,我们介绍了:
- Docker 是什么以及其重要性
- 如何安装并运行您的第一个容器
- 镜像、容器与网络等关键概念
- 使用 Docker 卷实现数据持久化
- 借助 Docker Compose 管理多容器应用
- 安全、性能与可扩展性的最佳实践
而这仅仅是开始!如果您想进一步深化 Docker 专业能力,可以学习初级水平的 Introduction to Docker 课程。若需更深入的知识,可学习涵盖多阶段构建、Docker 网络工具与 Docker Compose 的Intermediate Docker 课程。最后,您也可以考虑获取 Docker 认证,感兴趣的话请查看 2025 年完整 Docker 认证(DCA)指南!
FAQs
Docker 与虚拟机(VM)有何不同?
Docker 容器共享宿主机操作系统内核,因此更轻量且更快;而虚拟机(VM)需要完整的客户操作系统,因而更笨重、速度更慢。容器更适合微服务与快速扩缩容,VM 则更适合在同一硬件上运行不同的操作系统环境。
Docker CE 与 Docker EE 有何区别?
Docker 社区版(CE)是免费的开源版本,适合个人开发者和小型项目。Docker 企业版(EE)是付费版本,提供额外的安全、管理与支持功能,更适合大规模企业级部署。
不使用 WSL 2,Docker 能在 Windows 上运行吗?
可以。Windows 版 Docker Desktop 提供两种模式:基于 WSL 2 的后端(推荐)与 Hyper-V 后端。WSL 2 后端在性能与与 Windows 的集成方面更佳;若无法使用 WSL 2,可选择 Hyper-V 作为替代。
什么是多架构(multi-arch)Docker 镜像?
多架构镜像(multi-arch)允许单个 Docker 镜像支持多种架构(如 x86、ARM)。这可确保同一镜像无需修改即可在不同硬件平台上运行,适用于物联网设备与云环境。
Docker 如何保障安全?
Docker 通过命名空间隔离、控制组(cgroups)与 seccomp 配置文件增强安全性。此外,最佳实践还包括以非 root 用户运行容器、使用精简基础镜像、启用内容信任进行镜像校验,并使用 docker scan 或 Trivy 等工具扫描镜像漏洞。

当我开始使用Docker时,很快就意识到它的强大。想象一下,只需几分钟而非数小时就能完成开发环境的搭建,或是在不同机器上运行应用而不再遇到经典的“只在我机器上能跑”的问题。
Docker 通过将应用及其依赖打包到轻量、可移植的容器中,简化了构建、交付与运行应用的方式。无论您是开发者、数据科学家还是系统管理员,掌握 Docker 都能减少烦恼、提升工作流效率。
在本教程中,我将带您了解基础知识——安装 Docker、理解关键概念,并运行您的第一个容器化应用。结束时,您不仅能理解 Docker 的工作原理,还将获得亲身实践的体验,为更高级的主题打下坚实基础。让我们开始吧!
什么是 Docker?
Docker 是一个开源的容器化平台,通过将软件及其依赖打包为称为容器的标准化单元,简化了应用部署。与传统虚拟机不同,Docker 容器共享宿主机的操作系统内核,因此更加高效、轻量。
容器确保应用在开发、测试与生产环境中的运行方式一致。这减少了兼容性问题,并增强了跨平台的可移植性。凭借其灵活性与可扩展性,Docker 已成为现代 DevOps 和云原生开发工作流中的关键工具。
Docker 官方标志。
安装 Docker
Docker 可安装在多种操作系统上,包括 Windows、macOS 和 Linux。虽然核心功能在各平台一致,但安装流程会因系统而略有不同。下面提供在您偏好操作系统上的分步安装指南。
在 Windows 上安装 Docker
下载 Windows 版 Docker Desktop 安装程序
安装 Windows 版 Docker Desktop
docker –version验证安装。通过 PowerShell 检查安装后的 Docker 版本
5. 从开始/运行菜单启动 Docker Desktop 应用。
在 Windows 上启动 Docker Desktop 应用
在 macOS 上安装 Docker
下载 Mac 版 Docker Desktop 安装程序
.dmg文件,将 Docker 拖入应用程序文件夹。docker –version验证安装。在 Linux(Ubuntu)上安装 Docker
sudo apt updatesudo apt install apt-transport-https ca-certificates curl software-properties-commoncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"sudo apt install docker-cedocker –version