Docker 的使用和基本问题排查处理
·
Docker 简介
Docker 是一个开源的容器化平台,用于开发、交付和运行应用程序。它通过容器技术将应用及其依赖环境打包在一起,确保应用在任何环境中都能一致运行。
核心概念
1. 镜像(Image)
- 定义:只读的模板,包含运行应用所需的一切(代码、运行时、库、环境变量、配置文件)
- 特性:分层存储、可复用、不可变
- 示例:
nginx:latest、python:3.9-slim
2. 容器(Container)
- 定义:镜像的运行实例,可以启动、停止、删除
- 特性:轻量级、隔离性、可移植
- 与虚拟机区别:共享宿主机内核,无需完整的操作系统
3. Dockerfile
- 定义:用于构建镜像的文本脚本
- 作用:定义镜像的构建步骤和依赖
4. Docker Compose
- 定义:用于定义和运行多容器 Docker 应用的工具
- 作用:通过 YAML 文件配置多个服务
常用命令
镜像操作
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 构建镜像
docker build -t myapp:v1.0 .
容器操作
# 运行容器
docker run -d -p 8080:80 --name my-nginx nginx
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 停止容器
docker stop my-nginx
# 启动容器
docker start my-nginx
# 删除容器
docker rm my-nginx
# 查看容器日志
docker logs my-nginx
# 进入容器
docker exec -it my-nginx /bin/bash
Dockerfile 示例
Python 应用
# 基础镜像
FROM python:3.9-slim
# 工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 5000
# 启动命令
CMD ["python", "app.py"]
Node.js 应用
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Docker Compose 示例
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
- redis
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://redis:6379
db:
image: postgres:13
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:6-alpine
volumes:
postgres_data:
使用场景
1. 应用部署
- 简化部署流程
- 环境一致性保证
- 快速回滚
2. 微服务架构
- 服务隔离
- 独立扩展
- 技术栈灵活
3. 持续集成 / 持续部署
- 标准化构建环境
- 自动化测试
- 快速交付
4. 开发环境
- 快速搭建开发环境
- 避免环境冲突
- 团队协作一致性
优势
- 一致性:开发、测试、生产环境完全一致
- 可移植性:一次构建,到处运行
- 隔离性:应用间互不干扰
- 效率:启动快、资源占用少
- 版本控制:镜像可版本化管理
- 自动化:易于集成到 CI/CD 流程
最佳实践
- 使用轻量级基础镜像:选择
alpine、slim版本 - 分层构建:利用 Docker 缓存,频繁变化的层放后面
- 多阶段构建:减小最终镜像大小
- 不要存储敏感信息:使用环境变量或 secrets 管理
- 健康检查:配置 HEALTHCHECK 确保容器健康
- 资源限制:设置 CPU 和内存限制
常见问题解决
容器无法启动
# 查看容器日志
docker logs <container_id>
# 查看容器详细信息
docker inspect <container_id>
端口冲突
# 查看端口占用
netstat -tuln | grep <port>
# 修改映射端口
docker run -p <new_port>:<container_port> ...
存储空间清理
# 清理未使用的镜像
docker image prune -a
# 清理未使用的容器
docker container prune
# 清理未使用的卷
docker volume prune
# 一键清理所有未使用的资源
docker system prune -a
更多推荐
所有评论(0)