使用 Docker 和 Docker Compose 编排多服务部署,实现环境隔离、一键启动、便于迁移的容器化解决方案。
开发、测试、生产环境完全一致,彻底消除"在我机器上能跑"问题
秒级启动容器,一键部署整套服务,支持快速回滚
容器间相互隔离,互不影响,安全可控,资源限制
轻松扩展服务实例,应对流量变化,支持自动伸缩
分层存储,镜像复用,节省磁盘空间和构建时间
版本化管理,便于追踪变更,简化运维工作
| 概念 | 说明 | 类比 |
|---|---|---|
Image |
只读模板,包含运行应用所需的所有内容 | 类 / 蓝图 |
Container |
镜像的运行实例,可以启动、停止、删除 | 对象 / 实例 |
Dockerfile |
构建镜像的脚本文件 | 配方 / 说明书 |
Volume |
持久化存储,数据独立于容器生命周期 | 外接硬盘 |
Network |
容器间通信的虚拟网络 | 局域网 |
Registry |
存储和分发镜像的服务 | 应用商店 |
多阶段构建可以显著减小最终镜像大小,提高安全性。
| 指令 | 说明 | 示例 |
|---|---|---|
FROM |
指定基础镜像 | FROM node:18-alpine |
WORKDIR |
设置工作目录 | WORKDIR /app |
COPY |
复制文件到镜像 | COPY . . |
RUN |
执行命令(构建时) | RUN npm install |
ENV |
设置环境变量 | ENV NODE_ENV=production |
EXPOSE |
声明端口(文档作用) | EXPOSE 3000 |
CMD |
容器启动命令 | CMD ["node", "app.js"] |
ENTRYPOINT |
容器入口点 | ENTRYPOINT ["npm"] |
使用 .dockerignore 排除不必要的文件,可以加快构建速度并减小镜像体积。
| 网络类型 | 说明 | 使用场景 |
|---|---|---|
bridge |
默认网络,容器通过虚拟网桥通信 | 单机多容器 |
host |
容器使用主机网络栈 | 高性能场景 |
none |
禁用网络 | 安全隔离 |
overlay |
跨主机容器通信 | Docker Swarm |
| 类型 | 语法 | 特点 | 使用场景 |
|---|---|---|---|
| 命名卷 | volume-name:/path |
Docker 管理,跨容器共享 | 数据库存储 |
| 绑定挂载 | ./host:/container |
直接映射主机目录 | 开发时代码同步 |
| tmpfs | tmpfs:/path |
内存存储,容器停止即丢失 | 临时文件、敏感数据 |
| 命令 | 说明 |
|---|---|
docker build -t myapp . |
构建镜像 |
docker run -d -p 3000:3000 myapp |
运行容器 |
docker ps -a |
查看所有容器 |
docker logs -f container_name |
查看容器日志 |
docker exec -it container_name sh |
进入容器 |
docker stop $(docker ps -q) |
停止所有容器 |
docker system prune -a |
清理未使用的资源 |
| 命令 | 说明 |
|---|---|
docker-compose up -d |
后台启动所有服务 |
docker-compose down -v |
停止并删除容器和卷 |
docker-compose logs -f app |
查看指定服务日志 |
docker-compose ps |
查看服务状态 |
docker-compose restart app |
重启指定服务 |
docker-compose build --no-cache |
重新构建镜像 |
docker-compose exec app sh |
进入服务容器 |
docker-compose pull |
拉取最新镜像 |
生产环境中,敏感信息(如数据库密码)应该使用环境变量或 Docker Secrets 管理,不要写在配置文件中。