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 version或docker run hello-world(可选)验证。
常见坑:如果 docker version 报 permission 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):一个“可复制的运行环境模板”,包含应用与依赖。你可以
pull、build、tag它。 - 容器(container):镜像的一个运行实例。容器有生命周期:创建、运行、停止、删除。
- 卷(volume):容器之外的持久化存储。容器删了,卷还在;适合数据库数据目录等。
- 端口映射(
-p 宿主:容器):容器内服务通常只监听容器网络,映射后才能从宿主机访问。- 例:
-p 8080:80表示访问本机http://localhost:8080,转发到容器内的80端口。
- 例:
理解这一点很关键:容器天然“可丢弃”,你要保留的通常是数据(卷)和配置(代码仓库/配置文件),而不是“进容器手工改一堆东西”。
用 Compose 跑一个常见本地开发场景
Compose 解决的问题很简单:当你的本地开发不止一个容器(例如 Web + DB),用一个 compose.yaml(或 docker-compose.yml)把它们的镜像、端口、环境变量、卷关系描述清楚,然后一条命令拉起或收掉。
下面是一个最小的多服务 Compose 示例,用来展示结构与依赖关系:这里的 app 用 nginx 只是为了演示编排;真实项目通常会把它替换成你自己的应用镜像(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 -f、docker 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 -f,docker volume prune - Compose:
docker compose up -d,docker compose ps,docker compose logs -f,docker 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/