“一次构建,到处运行”——Docker用这句口号改变了软件部署的方式。从开发环境的一致性到生产环境的弹性扩缩容,容器化已经成为现代应用部署的标准。但Docker的学习曲线也让不少人望而却步。本文用最通俗的语言,带你从Docker基础概念一路走到生产环境部署。
Docker入门基础
Docker是目前最流行的容器化技术,它将应用及其依赖打包到一个可移植的容器中,实现”一次构建,到处运行”。相比传统虚拟机,Docker容器启动更快、资源占用更少、部署更简单。
安装Docker
curl -fsSL https://get.docker.com | bash
systemctl enable --now docker
docker --version
核心概念
- 镜像(Image)——应用的只读模板,包含运行应用所需的一切
- 容器(Container)——镜像的运行实例,可以启动、停止、删除
- Dockerfile——构建镜像的脚本文件
- 数据卷(Volume)——容器数据持久化存储
- 网络(Network)——容器间通信的虚拟网络
Dockerfile编写
以一个Node.js应用为例,编写Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
优化技巧:
- 使用alpine基础镜像减小体积
- 先复制依赖文件再复制源码,利用构建缓存
- 多阶段构建,最终镜像只包含运行时文件
常用容器操作
# 构建镜像
docker build -t myapp:1.0 .
# 运行容器
docker run -d --name myapp -p 3000:3000 -v /data:/app/data myapp:1.0
# 查看容器
docker ps
docker logs -f myapp
# 进入容器
docker exec -it myapp sh
# 停止和删除
docker stop myapp
docker rm myapp
Docker Compose编排
对于多容器应用(如Web+数据库+Redis),使用docker-compose.yml统一管理:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
- redis
environment:
- DB_HOST=db
- REDIS_HOST=redis
db:
image: mysql:8.0
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
redis:
image: redis:7-alpine
volumes:
db_data:
一键启动所有服务:
docker-compose up -d
docker-compose logs -f
docker-compose down
生产环境部署
镜像管理
- 使用私有镜像仓库(Harbor或云厂商ACR)存储镜像
- 镜像标签使用版本号而非latest,确保可回滚
- 定期扫描镜像漏洞(用Trivy、Clair等工具)
容器安全
- 容器以非root用户运行
- 设置资源限制(CPU、内存)防止单个容器耗尽资源
- 使用只读文件系统,需要写入的目录挂载数据卷
- 禁用容器的特权模式
docker run -d --name myapp
--cpu-shares 512 --memory 512m
--read-only --tmpfs /tmp
--user 1000:1000
myapp:1.0
日志管理
配置Docker日志驱动,限制日志文件大小:
# /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
容器编排进阶
当应用规模扩大到多台服务器时,需要使用容器编排平台:
| 平台 | 适用场景 | 复杂度 |
| Docker Compose | 单机多容器 | 低 |
| Docker Swarm | 多机简单集群 | 中 |
| Kubernetes | 大规模生产环境 | 高 |
对于大多数中小团队,Docker Compose已经足够。当需要自动扩缩容、滚动更新、服务发现等高级功能时,再考虑迁移到Kubernetes。
常见问题排查
- 容器启动后立即退出——检查CMD/ENTRYPOINT是否正确,用docker logs查看错误
- 容器间无法通信——确保容器在同一个网络中,使用服务名而非IP访问
- 数据丢失——确认重要数据已挂载到数据卷,容器删除不影响数据
- 端口冲突——检查宿主机端口是否被占用,用docker ps查看端口映射
Docker容器化已经成为现代应用部署的标准方式。掌握Docker基础和Docker Compose编排,就能应对绝大多数部署场景。