什么是 Docker?
如果你经常接触编程、Web 开发或服务器领域,你大概率听说过 Docker 这个词。
Docker 是一个允许我们在被称为 容器(Container) 的环境中运行应用程序的平台。
简单来说,Docker 帮助我们将应用程序及其所需的所有内容(如库、依赖项、配置甚至是特定的运行时版本)打包在一起。
因此,当该应用程序从开发者的笔记本电脑迁移到服务器时,类似以下的问题:
"在我的电脑上运行正常,为什么在服务器上报错?"
就可以大大减少了。
Docker 使应用程序环境变得更加一致。
什么是容器?
容器可以想象成是专为应用程序打造的一个独立盒子。
在这个盒子里包含了应用程序以及让程序正常运行所需的一切。
例如,我们有一个 Laravel 应用程序,它需要:
- PHP 8.3
- MySQL
- Redis
- Nginx
- Composer
与其在计算机上一一安装所有这些软件,我们可以使用 Docker 在各自的容器中运行所有这些需求。
它的结构大致如下:
Laravel Application
│
├── PHP Container
├── Nginx Container
├── MySQL Container
└── Redis Container
所有这些容器都可以相互连接,并作为一个系统协同工作。
Docker 不是虚拟机
Docker 经常被误认为是虚拟机(VM)。
然而,这两者是不同的。
虚拟机通常在计算机内部运行一个完整的操作系统。
例如,我们使用 Windows,然后通过 VirtualBox 运行 Ubuntu。
由于必须运行完整的操作系统,虚拟机需要相当大的资源。
Docker 则更加轻量,因为容器使用的是主操作系统的内核。
简单对比图如下:
虚拟机 (Virtual Machine)
Hardware
↓
Operating System
↓
Virtual Machine
↓
Guest Operating System
↓
Application
Docker
Hardware
↓
Operating System
↓
Docker
↓
Container
↓
Application
正因如此,与虚拟机相比,Docker 的创建、运行、停止和删除通常要快得多。
为什么 Docker 被广泛使用?
Docker 现在在开发者中如此受欢迎有几个原因。
1. 环境更加一致
开发中的一个经典问题是环境差异。
例如,第一个开发者使用的是:
PHP 8.2
第二个开发者使用的是:
PHP 8.3
而生产服务器使用的是:
PHP 8.1
诸如此类的小差异有时会导致应用程序报错。
有了 Docker,环境版本可以从一开始就确定下来。
例如:
FROM php:8.3-fpm
这样,所有开发者都可以使用相同版本的 PHP 来运行应用程序。
2. 项目配置变得更简单
想象一下你刚加入一个新的项目。
通常你可能需要安装:
PHP
Composer
MySQL
Node.js
Redis
Nginx
更不用说还要确保版本匹配了。
使用 Docker,通常你只需要运行类似以下的命令:
docker compose up -d
然后 Docker 就会运行项目所定义的服务。
开发配置变得实用得多。
3. 减少"在我机器上运行正常"的问题
开发者一定经历过这种情况:
开发者 A:
"应用程序在我的笔记本上运行正常。"
开发者 B:
"在我的笔记本上报错。"
服务器:
"这里根本无法运行。"
这些问题通常是由环境差异引起的。
Docker 有助于确保应用程序在几乎相同的环境中运行,无论是:
- 开发者的笔记本电脑,
- 其他开发者的电脑,
- 测试服务器(Staging),
- 生产服务器(Production)。
4. 轻松运行多个服务
现代应用程序通常不仅需要一个服务。
例如,一个应用程序需要:
Backend → Laravel
Database → MySQL
Cache → Redis
Web Server → Nginx
Queue → Laravel Queue Worker
借助 Docker Compose,所有这些服务都可以在一个文件中进行配置。
例如:
services:
app:
build: .
mysql:
image: mysql:8
redis:
image: redis:latest
nginx:
image: nginx:latest
之后只需运行:
docker compose up -d
Docker 将运行所有这些服务。
有关其他完整命令列表,您可以阅读我们总结的查看 docker 容器日志指南。
结论
Docker 是一个允许我们在容器中运行应用程序的平台,具有更一致的环境。
与其手动安装 PHP、MySQL、Redis、Nginx 和各种依赖项,不如使用 Docker 来统一定义它们。
最大的好处是开发环境变得更加易于迁移、分享以及在其他设备上运行。
开始学习 Docker 时需要理解的核心概念是:
- Docker Image 作为模板。
- Container 作为正在运行的应用程序。
- Dockerfile 作为镜像构建指令。
- Docker Compose 用于管理多个容器。
- Volume 用于持久化存储数据。
- Network 用于容器间通信。
如果你经常开发需要多个服务的应用程序,或者与开发团队一起协作,Docker 是一个非常值得学习的工具。
作者
Wilan
巴厘岛Tekno的常驻撰稿人,积极分享技术、编程和软件工程领域的知识。