Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上。本文将全面介绍 Docker 的核心概念和使用方法。
Docker 基础概念
核心组件
Docker 包含三个核心组件:
- Docker 引擎:负责创建和管理 Docker 容器
 - Docker 镜像:容器的模板,包含了应用及其依赖
 - Docker 容器:镜像的运行实例
 
工作原理
Docker 使用客户端-服务器架构:
- Docker daemon:服务器组件,管理容器
 - Docker CLI:命令行客户端,与 daemon 交互
 - Docker registry:存储和分发 Docker 镜像
 
安装 Docker
Windows 安装
- 下载 Docker Desktop for Windows
 - 运行安装程序
 - 启用 WSL 2(Windows Subsystem for Linux)
 - 启动 Docker Desktop
 
Linux 安装
Ubuntu/Debian 系统下的安装命令:
# 更新包索引
sudo apt-get update
# 安装依赖
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
Docker 基本命令
镜像管理
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 列出本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
容器操作
# 运行容器
docker run -d -p 80:80 --name my-nginx nginx
# 列出运行中的容器
docker ps
# 列出所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop my-nginx
# 启动容器
docker start my-nginx
# 删除容器
docker rm my-nginx
Dockerfile 详解
Dockerfile 是用于构建 Docker 镜像的文本文件。
基本结构
# 基础镜像
FROM node:14
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制源代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["npm", "start"]
常用指令
- FROM:指定基础镜像
 - WORKDIR:设置工作目录
 - COPY/ADD:复制文件
 - RUN:执行命令
 - ENV:设置环境变量
 - EXPOSE:声明端口
 - CMD/ENTRYPOINT:指定启动命令
 
Docker Compose
Docker Compose 用于定义和运行多容器 Docker 应用程序。
安装
# Linux
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose.yml 示例
version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: mongo:latest
    volumes:
      - mongodb_data:/data/db
volumes:
  mongodb_data:
基本命令
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看日志
docker-compose logs
# 查看服务状态
docker-compose ps
Docker 网络
网络类型
- bridge:默认网络,容器间可通过 IP 通信
 - host:容器使用主机网络
 - none:容器没有网络连接
 - overlay:跨主机容器网络
 
网络命令
# 创建网络
docker network create my-network
# 列出网络
docker network ls
# 连接容器到网络
docker network connect my-network container-name
# 断开网络连接
docker network disconnect my-network container-name
数据管理
数据卷(Volumes)
# 创建数据卷
docker volume create my-volume
# 使用数据卷运行容器
docker run -v my-volume:/data nginx
绑定挂载(Bind Mounts)
# 将主机目录挂载到容器
docker run -v /host/path:/container/path nginx
最佳实践
镜像构建
- 使用多阶段构建
 
# 构建阶段
FROM node:14 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
- 优化镜像大小
    
- 使用适当的基础镜像
 - 合并 RUN 指令
 - 清理不必要的文件
 
 
容器安全
- 以非 root 用户运行
 
USER node
- 限制资源使用
 
docker run --memory="512m" --cpus="1.5" nginx
实战示例
部署 Web 应用
- 创建 Dockerfile
 
FROM node:14-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
- 创建 docker-compose.yml
 
version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    restart: always
- 部署命令
 
# 构建并启动
docker-compose up -d --build
# 查看日志
docker-compose logs -f
故障排查
常见命令
# 查看容器日志
docker logs container-name
# 进入容器
docker exec -it container-name sh
# 查看容器详细信息
docker inspect container-name
# 查看容器资源使用
docker stats
常见问题
- 容器无法启动
    
- 检查日志
 - 验证端口映射
 - 确认资源限制
 
 - 网络连接问题
    
- 检查网络配置
 - 验证防火墙规则
 - 确认 DNS 设置
 
 
总结
Docker 通过容器化技术简化了应用的部署和管理流程。掌握 Docker 的核心概念和使用方法,可以显著提高开发和运维效率。