Docker是软件开发中使用最广泛的容器化工具。以下是从零知识到工作开发环境的实用指南。
Docker实际上解决什么
经典的开发者问题:”在我的机器上可以运行。”Docker通过将应用程序及其整个环境(操作系统库、运行时、依赖项、配置)打包成容器来解决这个问题,该容器在任何安装了Docker的机器上运行都完全相同。对于开发:你的本地环境与生产环境匹配。对于部署:相同的容器镜像在CI、预演和生产中运行。对于入职:新开发者运行一个命令而非20步设置文档。
核心概念
镜像:从Dockerfile构建的文件系统和运行时环境的快照。容器:镜像的运行实例——你可以从同一镜像运行许多容器。Dockerfile:构建镜像的指令脚本(FROM、RUN、COPY、EXPOSE、CMD)。注册表:镜像的存储库——Docker Hub是公共注册表,私有注册表存在于企业使用。卷:在容器重启后仍然存在的持久存储。网络:容器如何与彼此和外部世界通信。
一个工作示例
简单的Node.js应用Dockerfile:
FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . EXPOSE 3000 CMD ["node", "server.js"]
构建:docker build -t my-app .
运行:docker run -p 3000:3000 my-app
-p 3000:3000将你机器上的3000端口映射到容器中的3000端口。应用程序现在可以在localhost:3000访问。
多服务应用程序的Docker Compose
大多数应用程序有多个服务(网络应用、数据库、缓存)。Docker Compose让你一起定义和运行它们。最小的docker-compose.yml:
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: password
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
运行全部:docker compose up。停止全部:docker compose down。数据库数据跨重启保留在pgdata卷中。
常见开发模式
实时重载的卷挂载:docker run -v $(pwd):/app my-app将你的本地目录挂载到容器中——代码更改无需重建即可反映。环境变量:使用--env-file .env将本地变量传递给容器。多阶段构建:在一个镜像(node、python)中构建并将结果复制到更小的运行时镜像中以减少生产镜像大小。Docker Desktop(Mac/Windows)提供开发期间管理容器和镜像的图形界面。




