Docker容器化部署实践
容器化就像给应用穿上统一的"宇航服",让它们在任何环境中都能正常运行。Docker作为容器技术的代表,彻底改变了应用部署的方式。本文将带你从零开始,掌握Docker容器化部署的核心实践。
Docker核心概念
在开始实践之前,先了解几个核心概念:
- 镜像(Image): 应用的打包格式,包含运行所需的一切
- 容器(Container): 镜像的运行实例
- 仓库(Registry): 存储和分发镜像的地方
- Dockerfile: 构建镜像的脚本文件
- Docker Compose: 多容器应用编排工具
Docker安装与配置
在Ubuntu系统上安装Docker:
# 更新软件包索引
sudo apt update
# 安装依赖包
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
sudo docker --version
第一个Docker应用
让我们从运行一个简单的Nginx容器开始:
# 拉取Nginx镜像
docker pull nginx:latest
# 运行Nginx容器
docker run -d --name my-nginx -p 80:80 nginx
# 查看运行中的容器
docker ps
# 访问Nginx
curl http://localhost
编写Dockerfile
Dockerfile是构建自定义镜像的关键。以下是一个Node.js应用的Dockerfile示例:
# 使用官方Node.js镜像作为基础
FROM node:16-alpine
# 设置工作目录
WORKDIR /app
# 复制package.json和package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 定义启动命令
CMD ["node", "server.js"]
构建并运行镜像:
# 构建镜像
docker build -t my-node-app .
# 运行容器
docker run -d --name node-app -p 3000:3000 my-node-app
Docker Compose多容器编排
对于复杂的多服务应用,使用Docker Compose进行编排:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DATABASE_URL=postgres://user:password@db:5432/mydb
volumes:
- ./app:/app
- /app/node_modules
db:
image: postgres:13
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
启动服务:
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 停止服务
docker-compose down
最佳实践建议
- 使用多阶段构建减少镜像大小
- 避免在容器中存储数据,使用卷(volumes)
- 设置资源限制防止容器占用过多资源
- 使用.dockerignore文件排除不必要的文件
- 定期更新基础镜像以获取安全补丁
- 为生产环境使用特定的标签而非latest
容器化的本质是将应用与环境解耦,实现"一次构建,到处运行"。掌握Docker不仅提高部署效率,更是迈向云原生架构的重要一步。
常见问题排查
遇到问题时,可以使用以下命令进行排查:
# 查看容器日志
docker logs [容器名]
# 进入容器内部
docker exec -it [容器名] /bin/bash
# 查看容器资源使用情况
docker stats
# 检查镜像层信息
docker history [镜像名]
# 清理无用资源
docker system prune -a
通过本文的实践,你应该已经掌握了Docker容器化部署的基本技能。下一步可以探索Kubernetes等容器编排平台,构建更强大的云原生应用架构。