每次换电脑重装环境都是一场噩梦——Python 版本不对、Node 找不到、数据库端口冲突。直到我开始用 Docker,这些问题彻底消失了。本文不是 Docker 官方文档的翻译,而是一个从实际痛点出发的上手指南,帮你理解容器化的真正价值,并用几个真实例子让你立刻用起来。
一、为什么要用 Docker?不只是"轻量级虚拟机"
很多人把 Docker 理解为"轻量级虚拟机",这不完全对。Docker 的核心价值不是"比虚拟机省资源",而是环境的一致性。你在 Windows 上写的代码,同事在 Mac 上跑,服务器是 Linux——三台机器的环境完全不同。Docker 用一个标准化的镜像描述文件(Dockerfile),确保在任何地方运行的环境都一模一样。
传统环境
每个开发者手动安装 Python、Node、MySQL,版本各不相同。"我机器上能跑"成为最烦人的日常对话。
Docker 方式
所有依赖写在一个配置文件中,一个 docker compose up 命令启动整套环境。任何人的机器上运行结果都一样。
二、Docker 核心三件套
| 概念 | 类比 | 作用 |
|---|---|---|
| 镜像(Image) | 软件安装包 | 包含应用和所有依赖的只读模板 |
| 容器(Container) | 安装后的运行实例 | 镜像的运行态,可读可写,互不干扰 |
| Dockerfile | 安装说明书 | 定义如何从零构建一个镜像的文本文件 |
一个直观的理解:镜像就像 ISO 文件,容器就像用这个 ISO 启动的虚拟机。同一个镜像可以启动无数个容器,每个容器之间完全隔离。
三、10 个命令吃透 Docker
# 1. 拉取镜像(类似下载安装包)
docker pull nginx
# 2. 查看本地所有镜像
docker images
# 3. 运行一个容器(-d 后台运行,-p 端口映射,--name 命名)
docker run -d -p 8080:80 --name my-nginx nginx
# 4. 查看运行中的容器
docker ps
# 5. 查看所有容器(包括已停止的)
docker ps -a
# 6. 停止/启动/重启容器
docker stop my-nginx
docker start my-nginx
docker restart my-nginx
# 7. 进入容器内部(执行命令)
docker exec -it my-nginx bash
# 8. 查看容器日志
docker logs -f my-nginx
# 9. 删除容器和镜像
docker rm my-nginx
docker rmi nginx
# 10. 一键清理(删除所有停止的容器、未使用的镜像和网络)
docker system prune -a
四、实战:用 Docker Compose 一键启动 WordPress
WordPress 需要 PHP + MySQL 两个服务。传统方式要装 PHP、配 Nginx、装 MySQL、改配置文件——至少半小时。用 Docker Compose,一个 YAML 文件搞定:
version: "3.9"
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
volumes:
db_data:
保存为 docker-compose.yml,然后:
# 启动(首次会下载镜像)
docker compose up -d
# 访问 http://localhost:8080 就能看到 WordPress 安装界面了
从零到 WordPress 跑起来,不到 2 分钟。想删除环境?docker compose down -v,干干净净,不留痕迹。
五、Docker 化你的开发环境
这里分享一个我实际在用的开发环境 Docker Compose 配置,包含了 PostgreSQL、Redis、MinIO(对象存储):
version: "3.9"
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: dev
POSTGRES_PASSWORD: dev123
POSTGRES_DB: myapp
ports: ["5432:5432"]
volumes: ["./data/pg:/var/lib/postgresql/data"]
redis:
image: redis:7-alpine
ports: ["6379:6379"]
minio:
image: minio/minio
command: server /data --console-address ":9001"
ports: ["9000:9000", "9001:9001"]
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes: ["./data/minio:/data"]
一行 docker compose up -d,PostgreSQL + Redis + MinIO 三个服务同时启动。开发前启动,开发完关掉,不占用系统资源。
六、常见问题与最佳实践
ENV)或 Docker Secrets 管理敏感信息。七、推荐学习路径
- 第一周:用 docker run 运行 nginx/redis/mysql 等现成镜像,熟悉基本命令
- 第二周:写一个简单的 Dockerfile,把自己项目打包成镜像
- 第三周:用 Docker Compose 编排多服务应用
- 第四周:学习 Volume、Network、多阶段构建等进阶概念
Docker 不是银弹,但它确实解决了开发环境不一致这个困扰程序员几十年的老问题。一旦你的项目用上了 Docker,你再也不想回到那个"在我电脑上能跑"的时代了。