每次换电脑重装环境都是一场噩梦——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 三个服务同时启动。开发前启动,开发完关掉,不占用系统资源。

六、常见问题与最佳实践

注意:不要用 Docker 来跑开发中的代码。代码应该在宿主机编辑,通过 Volume 映射到容器中。这样修改代码时容器内实时生效,不需要重新构建镜像。
注意:不要在 Dockerfile 中存储密码和密钥。用环境变量(ENV)或 Docker Secrets 管理敏感信息。
最佳实践:每个容器只跑一个进程。不要在一个容器里同时跑 Nginx + PHP + MySQL——这是虚拟机思维,不是容器化思维。用 Docker Compose 编排多个单一职责的容器。

七、推荐学习路径

  1. 第一周:用 docker run 运行 nginx/redis/mysql 等现成镜像,熟悉基本命令
  2. 第二周:写一个简单的 Dockerfile,把自己项目打包成镜像
  3. 第三周:用 Docker Compose 编排多服务应用
  4. 第四周:学习 Volume、Network、多阶段构建等进阶概念

Docker 不是银弹,但它确实解决了开发环境不一致这个困扰程序员几十年的老问题。一旦你的项目用上了 Docker,你再也不想回到那个"在我电脑上能跑"的时代了。