Docker 简介

Docker 是一个开源的容器化平台,用于开发、交付和运行应用程序。它通过容器技术将应用及其依赖环境打包在一起,确保应用在任何环境中都能一致运行。

核心概念

1. 镜像(Image)

  • 定义:只读的模板,包含运行应用所需的一切(代码、运行时、库、环境变量、配置文件)
  • 特性:分层存储、可复用、不可变
  • 示例nginx:latestpython: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. 开发环境

  • 快速搭建开发环境
  • 避免环境冲突
  • 团队协作一致性

优势

  1. 一致性:开发、测试、生产环境完全一致
  2. 可移植性:一次构建,到处运行
  3. 隔离性:应用间互不干扰
  4. 效率:启动快、资源占用少
  5. 版本控制:镜像可版本化管理
  6. 自动化:易于集成到 CI/CD 流程

最佳实践

  1. 使用轻量级基础镜像:选择alpineslim版本
  2. 分层构建:利用 Docker 缓存,频繁变化的层放后面
  3. 多阶段构建:减小最终镜像大小
  4. 不要存储敏感信息:使用环境变量或 secrets 管理
  5. 健康检查:配置 HEALTHCHECK 确保容器健康
  6. 资源限制:设置 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

更多推荐