Skip to content
On this page

Docker 完全指南

什么是 Docker?

Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。

Docker 核心概念

1. 镜像 (Image)

Docker 镜像是一个轻量级、独立、可执行的软件包,包含运行某个软件所需的所有内容:代码、运行时环境、库、环境变量和配置文件。

2. 容器 (Container)

容器是镜像的运行实例。可以启动、停止、移动和删除。每个容器都是相互隔离的、保证安全的平台。

3. 仓库 (Repository)

仓库是集中存放镜像文件的场所。Docker Hub 是官方的公共仓库,也可以搭建私有仓库。

Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,Docker 客户端与 Docker 服务器进行通信,Docker 服务器负责构建、运行和分发 Docker 镜像。

主要组件:

  • Docker Client: 用户与 Docker 交互的接口
  • Docker Daemon: 在服务器上运行,负责构建、运行和分发 Docker 容器
  • Docker Images: 镜像,容器的基础
  • Docker Registry: 存储和分发镜像的服务

安装 Docker

在不同操作系统上安装 Docker

Windows

  1. 下载 Docker Desktop for Windows
  2. 运行安装程序
  3. 重启计算机
  4. 启动 Docker Desktop

macOS

  1. 下载 Docker Desktop for Mac
  2. 拖拽到 Applications 文件夹
  3. 启动 Docker Desktop

Linux (Ubuntu)

bash
# 更新包索引
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

基本命令

镜像管理

bash
# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx

# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx

# 构建镜像
docker build -t my-app .

容器管理

bash
# 运行容器
docker run -d -p 80:80 nginx

# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 停止容器
docker stop container_id

# 启动容器
docker start container_id

# 删除容器
docker rm container_id

# 进入运行中的容器
docker exec -it container_id bash

Dockerfile 详解

Dockerfile 是一个文本文件,包含一系列指令,用于构建 Docker 镜像。

基本指令:

  • FROM: 指定基础镜像
  • RUN: 执行命令
  • COPY: 复制文件到镜像
  • ADD: 复制文件到镜像(支持远程 URL)
  • WORKDIR: 设置工作目录
  • EXPOSE: 暴露端口
  • CMD: 容器启动时执行的命令
  • ENTRYPOINT: 容器启动时执行的命令(不可被覆盖)

示例 Dockerfile:

docker
# 使用官方 Node.js 运行时作为基础镜像
FROM node:16-alpine

# 设置工作目录
WORKDIR /app

# 复制 package.json 和 package-lock.json
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 定义容器启动时执行的命令
CMD ["npm", "start"]

Docker Compose

Docker Compose 是 Docker 的编排工具,用于定义和运行多容器的 Docker 应用。

docker-compose.yml 示例:

yaml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development

  redis:
    image: redis:alpine
    ports:
      - "6379:6379"

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  postgres_data:

最佳实践

1. 镜像优化

  • 使用官方基础镜像
  • 多阶段构建减少镜像大小
  • 合并 RUN 指令减少层数
  • 使用 .dockerignore 文件

2. 安全性

  • 不在镜像中存储敏感信息
  • 使用非 root 用户运行容器
  • 定期更新基础镜像
  • 扫描镜像漏洞

3. 性能优化

  • 使用多阶段构建
  • 优化层缓存
  • 选择合适的基础镜像

实际应用场景

1. 开发环境

Docker 可以确保开发、测试、生产环境的一致性。

2. 微服务架构

每个微服务可以打包成独立的容器,便于管理和部署。

3. CI/CD 集成

Docker 容器可以作为 CI/CD 流水线中的标准单元。

Docker 生态系统

相关工具:

  • Docker Swarm: Docker 原生的集群和调度工具
  • Kubernetes: 容器编排平台
  • Docker Compose: 多容器应用定义和运行工具
  • Docker Machine: Docker 主机管理工具

总结

Docker 通过容器化技术,极大地简化了应用的部署、扩展和管理。它提供了一种轻量级、可移植的虚拟化方案,已经成为现代软件开发和部署的标准工具之一。

目录