Docker 把应用和依赖打包进可重复运行的容器,让环境更一致、依赖更隔离。下面走一遍安装、常用命令、Compose 与常见平替,够你上手日常开发。

Docker 到底解决什么问题

你可以把 Docker 当成一套“把运行环境一起交付”的工具箱,主要解决这几类痛点:

  • 环境一致:开发机、CI、测试机、线上尽量跑同一套镜像,不再靠“我电脑上能跑”。
  • 依赖隔离:不同项目的依赖版本冲突(例如 Node/Python/数据库版本)用容器分开装。
  • 上手更快:新人不必手工装一堆依赖,拉镜像或 docker compose up 即可跑起来。
  • 可控可复现:容器可随时删掉重建,回到干净状态,减少“装坏了”的不可控因素。

安装 Docker

三平台最常见路径是:macOS/Windows 用 Docker Desktop;Linux 用 Docker Engine(也可用发行版包管理器按官方仓库安装)。

macOS

推荐用 Docker Desktop:

  • 从 Docker 官方下载并安装 Docker Desktop(DMG 安装,拖拽到 Applications)。
  • 默认安装位置:/Applications/Docker.app
  • 首次启动后,菜单栏 Docker 图标变为运行状态即可。
  • 验证(见下文命令):docker version

补充:Docker Desktop 也提供命令行安装方式(适合自动化),但新手用图形安装更省心。

Windows

同样推荐 Docker Desktop,主流是 WSL 2 后端:

  • 先确保系统满足 Docker Desktop 的要求,尤其是启用虚拟化能力与 WSL 2。
  • 安装 WSL 2(常见做法:管理员终端执行 wsl --install,按提示重启/更新)。
  • 运行 Docker Desktop 安装程序,按向导完成安装。
  • 默认安装目录通常在:C:\Program Files\Docker\Docker
  • 验证:PowerShell/CMD 里执行 docker version

提示:如果你本来就大量用 Linux 工具链,WSL 2 后端通常更顺滑;企业环境若有 Hyper-V 相关约束,则按 Docker Desktop 文档选择对应后端。

Linux

Linux 上通常装 Docker Engine(服务端组件),按你的发行版走官方文档即可:

  • Docker Engine 官方入口:https://docs.docker.com/engine/install/(按 Ubuntu/Debian/Fedora/RHEL/CentOS 等分发版选择步骤)。
  • 安装完成后,启动 Docker 服务,并用 docker versiondocker run hello-world(可选)验证。

常见坑:如果 docker versionpermission denied,先试试 sudo docker version;想免 sudo 的话,一般需要把当前用户加入 docker 组并重新登录后生效(按官方 post-install 步骤处理)。 安全提示:docker 组因为可访问 Docker socket,权限非常接近 root 级别;个人开发机上谨慎使用即可,共享机器或生产环境建议更保守地配置权限与访问方式。

如果你的目标是“本机开发跑容器”,这条路径往往比 Desktop 更轻量;但不同发行版的安装命令略有差异,建议直接对照官方分发版页面执行。

先跑起来:最常用的几个命令

下面这组命令覆盖了新手日常 80% 的操作。先把它们跑一遍,感受一下“镜像拉取 -> 启动容器 -> 观察日志 -> 进容器排查 -> 停止清理”的闭环。

docker version
docker pull nginx
docker run -d --name demo-nginx -p 8080:80 nginx
docker ps
docker logs demo-nginx
docker exec -it demo-nginx sh
docker stop demo-nginx
docker rm demo-nginx
docker images
docker volume ls

解释(按你执行顺序来理解):

  • docker version:确认 Docker 客户端/服务端能正常通信(Desktop 或 Engine 是否就绪)。
  • docker pull nginx:拉取镜像到本机(后续 run 就不必现拉)。
  • docker run -d --name demo-nginx -p 8080:80 nginx:后台启动一个 Nginx 容器,命名为 demo-nginx,并把宿主机 8080 映射到容器内 80
  • docker ps:查看正在运行的容器(加 -a 看全部容器)。
  • docker logs demo-nginx:看容器标准输出日志(排错第一入口)。
  • docker exec -it demo-nginx sh:进入容器里开一个交互 shell(临时排查用,别把“改配置”当成长期方案)。
  • docker stop demo-nginx:停止容器。
  • docker rm demo-nginx:删除容器(删掉后可随时 run 重建)。
  • docker images:查看本机已有镜像。
  • docker volume ls:查看本机卷(持久化数据常用)。

镜像、容器、卷、端口映射怎么理解

把概念对齐,后面你看命令就会更直观:

  • 镜像(image):一个“可复制的运行环境模板”,包含应用与依赖。你可以 pullbuildtag 它。
  • 容器(container):镜像的一个运行实例。容器有生命周期:创建、运行、停止、删除。
  • 卷(volume):容器之外的持久化存储。容器删了,卷还在;适合数据库数据目录等。
  • 端口映射(-p 宿主:容器):容器内服务通常只监听容器网络,映射后才能从宿主机访问。
    • 例:-p 8080:80 表示访问本机 http://localhost:8080,转发到容器内的 80 端口。

理解这一点很关键:容器天然“可丢弃”,你要保留的通常是数据(卷)和配置(代码仓库/配置文件),而不是“进容器手工改一堆东西”。

用 Compose 跑一个常见本地开发场景

Compose 解决的问题很简单:当你的本地开发不止一个容器(例如 Web + DB),用一个 compose.yaml(或 docker-compose.yml)把它们的镜像、端口、环境变量、卷关系描述清楚,然后一条命令拉起或收掉。

下面是一个最小的多服务 Compose 示例,用来展示结构与依赖关系:这里的 appnginx 只是为了演示编排;真实项目通常会把它替换成你自己的应用镜像(image:build:),并在应用里真正连接 db

安全提醒:示例里的 secret123 仅用于本地演示,别在真实项目里写死或提交密码到仓库;建议用 .env 文件或通过运行环境/CI 注入环境变量。

services:
  app:
    image: nginx:stable
    ports:
      - "8080:80"
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      POSTGRES_DB: appdb
      POSTGRES_USER: appuser
      POSTGRES_PASSWORD: secret123
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

配套的基本操作如下:

docker compose up -d
docker compose ps
docker compose logs -f
docker compose down

要点:

  • depends_on 只表达启动依赖顺序,不等于“数据库已就绪可连接”;应用端仍应做好重试或健康检查。
  • pgdata 是具名卷,保证 down 之后(默认不带 -v)数据仍在;适合本地开发数据库持久化。
  • 如果你把 app 换成自己的服务镜像(或 build:),Compose 就变成团队上手的最短路径。
  • 服务间访问:同一 Compose 网络里通常用服务名当主机名,例如数据库一般连 db:5432
  • 从宿主机连 Postgres:容器内互联用 db:5432;如果你想在宿主机用 GUI/psql 连接,需要给 db 显式加 ports: 映射(例如 5432:5432,若宿主机 5432 被占用可改成 15432:5432),或直接用 docker compose exec db psql -U appuser -d appdb 在容器里连。

日常开发里的常规工作流

一套更“工程化”的用法通常长这样(尽量少走歪路):

  • 第一次拉起:写 compose.yaml,跑 docker compose up -d,确认端口能访问、日志无报错。
  • 看状态与日志:docker compose ps + docker compose logs -f,把排错入口固定在这里。
  • 需要进容器排查:优先 docker compose exec <service> sh(或 docker exec),用完即退,不把修复永久留在容器里。
  • 需要重置环境:停止并清理容器 docker compose down;如果要把这个 Compose 项目的具名卷也一起删掉(会删除持久化的 DB 数据),用 docker compose down -v(谨慎)。
  • 定期整理:不用的镜像/容器/卷及时清理,避免磁盘越用越满(见速查)。

一个最小的“真实项目感”例子:很多 Compose 项目会在 app 上用 build: 构建本地镜像,并用 bind mount 把源码挂进容器,这样改代码时往往不需要每次重建镜像。

什么时候需要 rebuild:如果你改了 Dockerfile、依赖清单(如 package-lock.json/requirements.txt)或需要把新产物打进镜像,一般要先 docker compose build 再拉起;如果只是改业务代码且用了挂载与热更新,通常不需要 rebuild,最多重启容器(甚至无需重启)。

清理与占用排查:可以用 docker system df 看磁盘占用;需要强力清理时再用 docker system prune -fdocker volume prune 等命令,但它们会删除“未使用”的资源,执行前先确认不会误删你还需要的数据。

经验法则:把“可复现”写进配置(Compose、Dockerfile、环境变量),而不是写进某个同学的本机操作习惯。

Docker 的常见平替

这些不是“更好”,而是“在某些约束下更合适”。你只要抓住:它是什么、谁该用、为什么选它。

Podman

Podman 是一套与 Docker CLI 生态高度相近的容器工具链,很多场景可以在不常驻 daemon 的模式下工作。适合偏 Linux、希望更贴近系统容器栈或有“无 root/更强隔离”诉求的人;如果你在服务器侧不想引入 Docker daemon,Podman 往往更顺手。

containerd + nerdctl

containerd 是底层容器运行时之一,nerdctl 提供了更接近 Docker 的命令行体验(含构建、运行等常见操作)。适合你本来就处在 Kubernetes/containerd 生态,想减少“Docker 专有层”的依赖;对接 k8s 运行时或做更底层的容器排障时,它的心智负担反而更低。

OrbStack

OrbStack 是 macOS 上用于运行 Linux 环境与容器的桌面工具,可作为 Docker Desktop 的替代选择之一。适合你在 Mac 上更在意性能、资源占用与日常体验;如果 Docker Desktop 的启动速度/资源占用让你不舒服,OrbStack 值得试试。

新手最常用命令速查

  • 基础检查:docker version
  • 镜像:docker pull <image>docker images
  • 容器运行与查看:docker run ...docker ps-a 看全部)
  • 日志与排错:docker logs <container>docker exec -it <container> sh
  • 停止与清理:docker stop <container>docker rm <container>
  • 卷:docker volume ls
  • 占用查看:docker system df
  • 清理未使用资源(谨慎):docker system prune -fdocker volume prune
  • Compose:docker compose up -ddocker compose psdocker compose logs -fdocker compose down

参考资料

  • Docker Desktop for Mac 安装文档:https://docs.docker.com/desktop/setup/install/mac-install/
  • Docker Desktop for Windows 安装文档:https://docs.docker.com/desktop/setup/install/windows-install/
  • Docker Engine 安装文档(Linux):https://docs.docker.com/engine/install/
  • Docker Overview(入门概览):https://docs.docker.com/get-started/docker-overview/
  • Docker Cheatsheet(PDF):https://docs.docker.com/get-started/docker_cheatsheet.pdf
  • Docker Compose Getting Started:https://docs.docker.com/compose/gettingstarted/
  • Podman 安装文档:https://podman.io/docs/installation
  • nerdctl(containerd CLI):https://github.com/containerd/nerdctl
  • OrbStack 文档:https://docs.orbstack.dev/