Docker 是什么?核心原理、常用命令与实战入门指南
一、Docker 是什么?
Docker 是一个开源的应用容器化平台,可以将应用程序及其运行所需的依赖、运行环境和配置打包到标准化的镜像中,再通过容器运行应用。它主要用于软件开发、测试、部署和环境管理,能够减少不同计算机、开发环境与服务器之间的环境差异。
简单来说,Docker 可以把应用程序和它需要的运行环境一起打包,让应用在不同环境中更容易运行。
例如,你开发了一个基于 Python、Vue 或 Spring Boot 的项目。在自己的电脑上,项目可能运行正常,但部署到服务器后,却因为 Python 版本、Java 版本、系统依赖或环境变量不同而出现问题。
使用 Docker 后,可以将应用及其所需的运行环境封装成镜像,在支持相应容器运行环境的设备上启动,从而降低环境不一致带来的部署问题。
Docker 官方文档将其定位为用于开发、交付和运行应用程序的开放平台。https://docs.docker.com/get-started/docker-overview/
Docker 主要解决什么问题?
Docker 的核心价值不只是简化安装,而是让应用环境更加标准化。
- 环境不一致: 减少开发、测试和生产环境之间的差异。
- 部署复杂: 将应用环境打包,降低手动配置服务器的工作量。
- 依赖冲突: 让不同应用使用相互隔离的运行环境。
- 迁移困难: 便于将应用部署到其他支持 Docker 的主机或云环境。
- 协作成本高: 团队成员可以基于同一份镜像和配置运行项目。
- 环境重建困难: 通过 Dockerfile 和 Compose 配置重复构建应用环境。
需要注意的是,Docker 并不能保证所有应用在任何设备上都完全兼容。CPU 架构、操作系统、内核能力、硬件资源以及外部服务配置仍然可能影响应用运行。
二、Docker 的核心概念
学习 Docker 时,最重要的是理解镜像、容器、仓库、Dockerfile 和 Docker Compose 这几个概念。
1. Docker 镜像(Image)
Docker 镜像是创建容器的只读模板,其中包含运行应用所需的文件系统内容、应用程序、依赖及相关配置。
可以将镜像理解为应用运行环境的一个可分发模板。
例如:
nginx:可以用于运行 Nginx Web 服务器。mysql:可以用于运行 MySQL 数据库。redis:可以用于运行 Redis 服务。python:提供 Python 运行环境。- 自己构建的项目镜像:可以包含应用代码及其运行依赖。
镜像通常由多个只读层组成。构建镜像时,Docker 可以利用已有层和构建缓存,减少重复工作。
2. Docker 容器(Container)
容器是镜像的一个运行实例。
镜像本身是模板,而容器是根据模板创建并启动的运行环境。
例如,使用同一个 Nginx 镜像,可以创建多个独立的 Nginx 容器。它们可以分别使用不同的端口、配置文件、网络和存储设置。
容器具有以下特点:
- 可以启动、停止、重启和删除。
- 可以与其他容器进行网络通信。
- 可以限制 CPU、内存等资源使用。
- 可以通过卷挂载保存需要长期保留的数据。
- 容器自身的可写层通常不会在删除容器后继续保留。
特别注意:容器不等于虚拟机,也不等于永久存储空间。 如果重要数据只写入容器的可写层,删除容器后,这些数据通常也会丢失。
3. Docker 仓库(Registry)
Docker 仓库用于存储、分发和管理镜像。
常见的镜像分发服务包括 Docker Hub,以及企业或团队自行搭建的私有镜像仓库。
仓库可以帮助开发者完成以下工作:
- 下载别人构建好的镜像。
- 上传自己构建的镜像。
- 通过标签管理镜像版本。
- 在团队或服务器之间共享镜像。
- 配合访问权限管理私有镜像。
需要区分两个术语:
- Registry(镜像仓库服务): 提供镜像存储和分发能力的服务。
- Repository(镜像仓库项目): 通常用于组织同一类镜像及其不同标签。
4. Dockerfile
Dockerfile 是用于描述如何构建 Docker 镜像的文本文件。
它可以定义基础镜像、工作目录、依赖安装步骤、文件复制方式、环境变量和默认启动命令等内容。
例如,下面是一个简单的 Python 应用 Dockerfile:
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
这份配置主要完成以下工作:
- 使用 Python 3.12 的精简镜像作为基础。
- 将
/app设置为工作目录。 - 复制依赖清单并安装 Python 依赖。
- 将项目文件复制到镜像中。
- 默认通过
python app.py启动应用。
这里的 requirements.txt 和 app.py 需要由项目实际提供。如果应用需要监听网络端口、配置数据库或设置环境变量,还需要根据项目情况补充配置。
5. Docker Compose
Docker Compose 是用于定义和管理多容器应用的工具。
当一个项目同时需要前端、后端、数据库和缓存服务时,如果全部通过命令手动启动,就需要分别处理容器名称、端口、网络、存储及启动顺序等配置。
使用 Docker Compose,可以将这些设置集中写在一个 compose.yaml 文件中,并通过命令统一启动和管理服务。https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-docker-compose/
例如,一个常见的 Web 应用可能包含:
frontend:前端页面服务。backend:业务 API 服务。mysql:关系型数据库。redis:缓存服务。
通过 Compose,可以用一份配置描述这些服务,并集中管理它们的运行方式。
三、Docker 的工作原理
Docker 采用客户端与服务端相结合的架构。
开发者执行 docker run、docker build 等命令时,Docker CLI 会向 Docker Engine 提供的 API 发起请求,由 Docker 守护进程等组件完成相应操作。
整个过程可以简化为:
编写 Dockerfile → 构建镜像 → 创建容器 → 启动应用 → 访问应用。
1. Docker 的主要组成部分
组成部分 | 作用 |
|---|---|
Docker CLI | 接收并执行用户输入的 Docker 命令 |
Docker Engine | Docker 的核心运行环境,负责管理容器等资源 |
Docker Daemon | 通常指 |
Docker Image | 用于创建容器的镜像模板 |
Docker Container | 镜像创建出的运行实例 |
Docker Registry | 存储和分发镜像 |
Docker Compose | 使用配置文件管理多个容器组成的应用 |
2. Docker 为什么能够实现环境隔离?
在 Linux 环境中,Docker 利用操作系统内核提供的能力实现容器隔离,主要涉及以下技术:
- Namespaces(命名空间): 为进程、网络、挂载点等资源提供隔离视图。
- Cgroups(控制组): 用于统计和限制进程组的 CPU、内存等资源使用。
- 分层文件系统: 通过镜像层和容器可写层组织文件系统。
- 网络机制: 支持容器之间以及容器与外部网络之间的通信。
容器通常共享宿主机的 Linux 内核,因此不需要像传统虚拟机那样为每个容器运行一套独立的完整操作系统内核。
不过,容器隔离并不意味着绝对安全。生产环境仍然需要合理配置权限、网络、资源限制和镜像安全策略。
四、Docker 与虚拟机有什么区别?
Docker 容器和虚拟机都可以用于隔离应用运行环境,但两者的实现方式不同。
对比维度 | Docker 容器 | 传统虚拟机 |
|---|---|---|
隔离方式 | 主要利用操作系统内核隔离机制 | 通过虚拟化技术提供虚拟硬件及独立操作系统环境 |
内核 | 通常共享宿主机 Linux 内核 | 通常拥有独立的客户机操作系统内核 |
启动速度 | 通常较快 | 通常需要更长的启动时间 |
资源开销 | 通常较低 | 通常较高 |
环境隔离 | 适合应用级隔离 | 适合需要独立操作系统环境的场景 |
典型用途 | 微服务、开发测试、持续集成 | 操作系统隔离、传统应用、特殊系统环境 |
这并不意味着 Docker 一定比虚拟机更好。
如果需要运行不同内核的操作系统,或者需要更强的操作系统级隔离,虚拟机可能更合适。实际部署也经常采用虚拟机与 Docker 结合的方式,例如先在云服务器虚拟机中安装 Docker,再运行多个应用容器。
五、Docker 的常见应用场景
Docker 并不只适用于后端开发,也广泛用于开发环境搭建、数据库运行、自动化测试和应用部署等工作。
1. 开发环境搭建
开发者可以使用 Docker 统一项目所需的语言运行时、数据库、缓存和其他依赖。
例如,多个项目分别依赖不同版本的 Node.js、Python 或 MySQL,可以为不同项目创建独立的容器环境,减少本机依赖冲突。
2. Web 应用部署
前端构建完成后,可以通过 Nginx 等 Web 服务器镜像部署静态文件;后端应用则可以使用对应的运行环境镜像打包。
这种方式能够将应用部署步骤标准化,方便后续迁移和更新。
3. 数据库和缓存服务
在开发和测试阶段,可以使用 Docker 运行 MySQL、PostgreSQL、Redis 等服务。
但数据库容器并不意味着数据会自动永久保存。需要持久化的数据应配置 Docker Volume 或合适的外部存储,并制定备份与恢复方案。
4. 微服务架构
微服务项目通常由多个相对独立的服务组成。Docker 可以为每个服务提供独立的运行环境,配合 Compose 或其他编排系统管理服务之间的关系。
5. 自动化测试与持续集成
在 CI/CD 流程中,可以使用容器运行构建、测试和打包任务,让不同流水线阶段使用相对一致的环境。
6. AI 应用与模型服务
Docker 也常用于部署 AI 推理服务、模型 API、向量数据库及相关辅助组件。
对于涉及 GPU 的任务,还需要考虑宿主机驱动、容器运行时、GPU 支持以及框架版本之间的兼容性。
六、Docker 安装与环境检查
Docker 的安装方式与操作系统有关。Windows 和 macOS 用户通常可以使用 Docker Desktop;Linux 用户可以根据发行版安装 Docker Engine。
官方安装文档:
- Docker Desktop:https://docs.docker.com/desktop/
- Docker Engine:https://docs.docker.com/engine/install/
安装完成后,可以通过以下命令检查环境。
docker --version
查看 Docker 客户端版本。
docker info
查看 Docker Engine 的运行信息。如果守护进程未启动、权限不足或连接配置异常,该命令可能会报错。
docker compose version
检查 Docker Compose 是否可用。
如果安装和运行环境正常,可以继续执行后面的示例。
七、Docker 常用命令大全
Docker 命令主要用于管理镜像、容器、网络、存储和应用构建流程。
1. 镜像管理命令
命令 | 作用 |
|---|---|
| 查看本地镜像 |
| 下载 Nginx 镜像 |
| 根据当前目录中的 Dockerfile 构建镜像 |
| 为镜像添加标签 |
| 上传镜像到对应仓库 |
| 删除指定镜像 |
删除镜像前,需要确认没有容器正在使用它,且镜像确实不再需要。
2. 容器管理命令
命令 | 作用 |
|---|---|
| 查看运行中的容器 |
| 查看所有容器,包括已停止的容器 |
| 创建并启动 Nginx 容器 |
| 启动已有容器 |
| 停止容器 |
| 重启容器 |
| 删除已停止的容器 |
| 查看容器日志 |
| 进入支持 |
| 查看容器详细配置 |
如果容器内没有 sh,需要根据镜像提供的工具选择合适的命令。
3. 网络与存储命令
docker network ls
查看 Docker 网络。
docker volume ls
查看 Docker 卷。
docker stats
查看运行中容器的资源使用情况。
docker system df
查看 Docker 磁盘空间占用情况。
这些命令有助于排查容器无法互相访问、资源占用过高以及磁盘空间不足等问题。
4. Docker Compose 常用命令
命令 | 作用 |
|---|---|
| 后台启动 Compose 应用 |
| 重新构建需要构建的镜像并启动应用 |
| 查看应用服务状态 |
| 持续查看应用日志 |
| 停止服务,但保留容器 |
| 启动已有服务容器 |
| 重启服务 |
| 停止并移除 Compose 创建的容器和网络 |
重要提醒: docker compose down 默认不会删除已声明并使用的命名卷,但删除卷、执行清理命令或重建存储配置时仍需谨慎。对于数据库等关键服务,不要在未确认数据备份前执行带有 --volumes 的清理操作。
八、Docker 实战:运行一个 Nginx 网站
下面通过一个简单示例,演示如何使用 Docker 启动 Web 服务。
第一步:下载 Nginx 镜像
docker pull nginx:stable
该命令从配置的镜像仓库下载 nginx:stable 镜像。实际使用时,应确认所选标签的更新策略和兼容性要求。
第二步:启动容器
docker run -d \
--name my-nginx \
-p 8080:80 \
nginx:stable
参数说明:
-d:让容器在后台运行。--name my-nginx:为容器指定名称。-p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口。nginx:stable:指定运行所使用的镜像。
如果宿主机的 8080 端口没有被占用,并且网络访问没有被防火墙阻止,就可以通过浏览器访问:
http://localhost:8080
正常情况下会看到 Nginx 的默认欢迎页面。
第三步:查看容器状态
docker ps
确认 my-nginx 容器处于运行状态,并检查端口映射。
第四步:查看运行日志
docker logs my-nginx
如果页面无法访问,可以先检查容器状态和日志,再排查端口占用、网络配置以及防火墙设置。
第五步:停止和删除容器
docker stop my-nginx
docker rm my-nginx
第一条命令停止容器,第二条命令删除容器。
这里没有删除 Nginx 镜像,因此后续仍然可以使用该镜像创建新的容器。
九、Docker 数据持久化:Volume 是什么?
Docker 容器的可写层通常与容器生命周期绑定。如果直接把数据库文件保存在容器内部,删除容器后就可能失去这些数据。
Volume(数据卷)用于将数据独立于容器进行管理,是 Docker 数据持久化的重要方式。
例如,运行一个 MySQL 容器时,可以使用命名卷保存数据库文件:
docker volume create mysql-data
docker run -d \
--name mysql-demo \
-e MYSQL_ROOT_PASSWORD=change-this-password \
-v mysql-data:/var/lib/mysql \
mysql:8.4
上述命令演示了数据卷的基本用法。正式部署时,应使用安全的密码管理方式,不要将真实密码直接写入公开脚本,并根据应用要求配置访问权限和网络。
其中:
docker volume create mysql-data:创建名为mysql-data的卷。-v mysql-data:/var/lib/mysql:将数据卷挂载到容器中的 MySQL 数据目录。/var/lib/mysql:该示例中 MySQL 镜像使用的数据目录。
即使删除并重新创建容器,只要仍然挂载同一个卷,且没有删除该卷,数据通常仍然可以保留。
不过,数据持久化不等于数据备份。重要数据仍需定期备份,并验证备份能否恢复。
十、Docker 安全使用建议
Docker 能够隔离应用运行环境,但不能替代完整的系统安全措施。尤其是在生产环境中,应注意以下事项。
- 优先使用可信镜像。 选择官方或可信维护者提供的镜像,并检查来源、标签和更新记录。
- 避免不必要的高权限运行。 不要随意使用
--privileged,也不要在没有充分理由时将宿主机敏感目录挂载到容器。 - 谨慎暴露端口。 只开放业务真正需要访问的端口,避免将数据库直接暴露到公网。
- 妥善管理密钥。 不要将 API Key、数据库密码等敏感信息直接写入公开的 Dockerfile 或代码仓库。
- 控制资源使用。 根据服务负载配置合理的 CPU、内存和存储限制,避免单个容器占用过多资源。
- 及时更新镜像。 定期检查基础镜像、应用依赖和安全补丁。
- 建立备份与恢复机制。 对数据库、用户上传文件及其他关键数据制定备份计划。
- 不要误认为容器绝对安全。 容器与宿主机内核共享资源,错误配置或内核漏洞仍可能带来安全风险。
十一、Docker 常见问题
1. Docker 和 Docker Compose 有什么区别?
Docker 提供容器镜像构建、容器运行和资源管理等能力。Docker Compose 则主要用于通过配置文件定义和管理由多个服务组成的应用。
如果只需要运行一个 Nginx 容器,可以直接使用 docker run。如果需要同时运行前端、后端、数据库和缓存,Compose 通常更方便。
2. Docker 容器停止后,数据还在吗?
这取决于数据存储位置。
容器停止后,容器可写层中的数据通常仍然存在;但容器被删除后,可写层中的数据通常会随之丢失。保存在独立数据卷或其他持久化存储中的数据,则可以在满足相应配置条件时继续保留。
3. Docker 一定比虚拟机快吗?
不一定。容器通常具有较低的额外资源开销和较快的启动速度,但实际性能还会受到应用类型、磁盘 I/O、网络、CPU 架构、运行时配置和宿主机资源等因素影响。
4. Docker 可以在 Windows 上运行吗?
可以。Windows 用户通常可以通过 Docker Desktop 使用 Docker。具体运行方式取决于系统版本、虚拟化支持以及所使用的容器类型。Linux 容器在 Windows 上通常需要借助 WSL 2 或 Hyper-V 等机制提供运行环境。
5. Docker 可以部署前端项目吗?
可以。常见做法是先构建 Vue、React 等前端项目,再将生成的静态文件放入 Nginx 等 Web 服务器镜像中,通过容器对外提供访问服务。
如果项目还需要后端 API、数据库或缓存,可以进一步使用 Docker Compose 统一管理这些服务。
6. Docker 适合个人开发者吗?
适合。个人开发者可以使用 Docker 搭建本地数据库、测试环境和项目依赖,也可以将自己的应用打包部署到云服务器。但初学者应先掌握镜像、容器、端口映射、数据卷和日志等基础知识,再逐步学习复杂的生产部署方案。
7. Docker 和 Kubernetes 有什么关系?
Docker 主要解决应用容器的构建、运行和管理问题;Kubernetes 则用于管理集群中的容器化应用,提供调度、服务发现、扩缩容和故障恢复等能力。
Kubernetes 并不要求所有工作负载都必须通过 Docker Engine 运行,它可以使用符合其容器运行时接口要求的运行时。
十二、总结
Docker 是现代软件开发和部署中常用的容器化技术。它通过镜像封装应用运行环境,通过容器运行应用,并借助网络、数据卷和 Compose 等能力管理应用所需的资源与服务。
对于初学者,建议按照以下顺序学习:
- 理解 Docker、镜像和容器的基本概念。
- 掌握镜像下载、容器启动、停止和日志查看。
- 学习端口映射、网络和数据卷。
- 学会编写 Dockerfile,构建自己的应用镜像。
- 使用 Docker Compose 管理前端、后端和数据库。
- 进一步学习镜像优化、资源限制、安全配置和生产部署。
当你能够独立完成应用容器化、数据持久化和多服务部署时,就已经具备了 Docker 的核心实用能力。