前言:容器技术时代

在现代软件开发和部署环境中,Docker 已成为不可或缺的技术。"在我的电脑上明明能运行的..."这句话曾在开发者之间被当作玩笑使用了很长时间,但随着 Docker 的出现,这个问题已成为过去。

本系列将从 Docker 基本概念到使用 Kubernetes 进行大规模容器编排进行系统学习。在第一篇中,我们将介绍容器技术的概念、Docker 架构、安装方法以及运行第一个容器。

1. 什么是容器技术?

1.1 容器的定义

容器(Container)是一种技术,它将应用程序及其运行所需的所有依赖项(库、配置文件、二进制文件等)打包成一个单元,使其能够在隔离的环境中运行。

容器共享主机操作系统的内核,同时拥有各自独立的文件系统、网络和进程空间。这使得应用程序能够在任何环境中以相同的方式运行。

1.2 容器技术的核心概念

  • 隔离性(Isolation):每个容器在独立的环境中运行,不会影响其他容器或主机系统。
  • 可移植性(Portability):容器可以在任何地方以相同的方式运行。开发环境、测试环境、生产环境之间没有差异。
  • 轻量级(Lightweight):与虚拟机不同,容器不包含整个操作系统,因此启动速度快且资源使用少。
  • 不可变性(Immutability):容器镜像一旦创建就不会改变,使用相同的镜像总是可以重现相同的环境。

2. 虚拟机 vs 容器比较

2.1 虚拟机(VM)的结构

传统虚拟化技术虚拟机在虚拟机监控器(Hypervisor)之上各自安装独立的操作系统(Guest OS):

┌─────────────────────────────────────────────────────────┐
│                      Applications                        │
├─────────────────────────────────────────────────────────┤
│   Guest OS  │   Guest OS  │   Guest OS  │   Guest OS    │
├─────────────────────────────────────────────────────────┤
│                     Hypervisor                           │
├─────────────────────────────────────────────────────────┤
│                      Host OS                             │
├─────────────────────────────────────────────────────────┤
│                      Hardware                            │
└─────────────────────────────────────────────────────────┘

2.2 容器的结构

容器共享主机操作系统的内核,容器运行时(Container Runtime)负责隔离:

┌─────────────────────────────────────────────────────────┐
│  Container  │  Container  │  Container  │  Container    │
│   + App     │   + App     │   + App     │   + App       │
├─────────────────────────────────────────────────────────┤
│                   Container Runtime                      │
├─────────────────────────────────────────────────────────┤
│                       Host OS                            │
├─────────────────────────────────────────────────────────┤
│                       Hardware                           │
└─────────────────────────────────────────────────────────┘

2.3 比较表

项目 虚拟机(VM) 容器(Container)
启动时间 分钟级别(需要启动 OS) 秒级别(进程启动)
资源使用 GB 级别(包含完整 OS) MB 级别(应用 + 依赖)
隔离级别 完全的硬件级隔离 进程级隔离
可移植性 依赖虚拟机监控器 在任何地方运行相同
密度 一台服务器上数十个 一台服务器上数百个
使用场景 运行不同 OS、需要完全隔离时 微服务、CI/CD、开发环境

3. Docker 的历史和优势

3.1 Docker 的诞生

Docker 于 2013 年由名为 dotCloud 的 PaaS 公司(现 Docker, Inc.)的 Solomon Hykes 首次发布。它最初基于 Linux 容器(LXC)技术,但后来开发了自己的容器运行时 libcontainer,发展成为更加独立的平台。

在 Docker 出现之前,容器技术就已存在(如 chroot、FreeBSD Jail、Solaris Zones、LXC 等),但 Docker 使其变得简单且标准化,成功实现了普及。

3.2 Docker 的主要优势

  • 开发-运维环境一致:解决"Works on my machine"问题。开发、测试、生产环境完全一致。
  • 快速部署:通过容器镜像,可以在秒级内部署应用程序。
  • 高效资源使用:与虚拟机相比,使用更少的资源运行更多的应用程序。
  • 支持微服务架构:可以将每个服务分离成独立的容器进行管理。
  • 版本管理:可以通过镜像标签管理应用程序的各种版本。
  • 可扩展性:可以使用相同的镜像轻松创建多个容器实现水平扩展。
  • 社区和生态系统:可以通过 Docker Hub 使用数百万个公共镜像。

4. Docker 架构

Docker 使用客户端-服务器架构。让我们来看看主要组件。

4.1 Docker Engine

Docker Engine 是 Docker 的核心组件,负责创建和运行容器。它由三个主要组件组成:

  • Docker 守护进程(dockerd):在后台运行,管理 Docker 对象(镜像、容器、网络、卷)。
  • REST API:提供与守护进程通信的接口。
  • Docker CLI(docker):用户控制 Docker 的命令行界面。

4.2 Docker 客户端

Docker 客户端是用户与 Docker 交互的主要方式。使用 docker 命令时,客户端将命令发送给 Docker 守护进程,守护进程执行该命令。

# 用户输入命令
docker run nginx

# Docker 客户端向 Docker 守护进程发送请求
# Docker 守护进程下载 nginx 镜像并运行容器

4.3 Docker 守护进程

Docker 守护进程(dockerd)接收 Docker API 请求并管理 Docker 对象。多个守护进程也可以相互通信来管理 Docker 服务。

4.4 Docker 对象

  • 镜像(Image):用于创建容器的只读模板。
  • 容器(Container):镜像的可运行实例。
  • 网络(Network):用于容器间通信的隔离网络。
  • 卷(Volume):用于持久存储容器数据的空间。

4.5 Docker 架构图

┌──────────────────────────────────────────────────────────────┐
│                        Docker Host                           │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │                    Docker Daemon                        │ │
│  │  ┌───────────┐  ┌───────────┐  ┌───────────────────┐   │ │
│  │  │  Images   │  │ Containers│  │ Networks/Volumes │   │ │
│  │  └───────────┘  └───────────┘  └───────────────────┘   │ │
│  └─────────────────────────────────────────────────────────┘ │
│                            ▲                                  │
│                            │ REST API                         │
│                            ▼                                  │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │                    Docker CLI                           │ │
│  └─────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
                            ▲
                            │
                            ▼
             ┌──────────────────────────┐
             │      Docker Registry     │
             │      (Docker Hub)        │
             └──────────────────────────┘

5. Docker 安装

Docker 可以在 Windows、macOS、Linux 所有平台上安装。让我们看看各操作系统的安装方法。

5.1 在 Windows 上安装 Docker

系统要求:

  • Windows 10 64位:Pro、Enterprise、Education(Build 19041 及以上)
  • Windows 11 64位:Home、Pro、Enterprise、Education
  • 启用 WSL 2(Windows Subsystem for Linux 2)
  • 硬件虚拟化支持(在 BIOS 中启用)

安装步骤:

  1. Docker 官方网站下载 Docker Desktop for Windows。
  2. 运行下载的 Docker Desktop Installer.exe
  3. 安装过程中选择"Use WSL 2 instead of Hyper-V"选项。
  4. 安装完成后重启系统。
  5. 运行 Docker Desktop 并同意服务条款。
# 验证安装(在 PowerShell 中)
docker --version
docker run hello-world

5.2 在 macOS 上安装 Docker

系统要求:

  • macOS 12.0(Monterey)及以上
  • Apple Silicon(M1/M2/M3)或 Intel 处理器
  • 最少 4GB RAM

安装步骤:

  1. Docker 官方网站下载 Docker Desktop for Mac。
  2. 打开下载的 Docker.dmg 文件,将 Docker 拖到 Applications 文件夹。
  3. 从 Applications 运行 Docker。
  4. 批准系统权限请求。
# 使用 Homebrew 安装(替代方案)
brew install --cask docker

# 验证安装
docker --version
docker run hello-world

5.3 在 Linux(Ubuntu/Debian)上安装 Docker

在 Linux 上直接安装 Docker Engine:

# 删除旧版 Docker 包
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装必要的包
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 添加 Docker 仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.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-buildx-plugin docker-compose-plugin

# 将当前用户添加到 docker 组(无需 sudo 使用 docker)
sudo usermod -aG docker $USER

# 应用更改(注销后重新登录或)
newgrp docker

# 验证安装
docker --version
docker run hello-world

5.4 在 Linux(CentOS/RHEL)上安装 Docker

# 安装必要的包
sudo yum install -y yum-utils

# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动并启用 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER

# 验证安装
docker --version
docker run hello-world

6. 运行第一个容器

6.1 Hello World 容器

验证 Docker 是否正确安装的最简单方法是运行 hello-world 镜像:

docker run hello-world

运行结果:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:53641cd209a4fecfc68e21a99871ce8c6920b2e7502df0a20671c6fccc73a7c6
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
...

6.2 nginx Web 服务器容器

现在让我们运行一个实际可用的 nginx Web 服务器容器:

# 运行 nginx 容器
docker run -d -p 8080:80 --name my-nginx nginx

# 选项说明:
# -d: 后台运行(detached mode)
# -p 8080:80: 将主机的 8080 端口连接到容器的 80 端口
# --name my-nginx: 给容器命名
# nginx: 要使用的镜像名称

在浏览器中访问 http://localhost:8080 可以看到 nginx 欢迎页面。

# 查看正在运行的容器
docker ps

# 输出示例:
CONTAINER ID   IMAGE   COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1b2c3d4e5f6   nginx   "/docker-entrypoint..."  10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   my-nginx

# 查看容器日志
docker logs my-nginx

# 停止容器
docker stop my-nginx

# 启动容器
docker start my-nginx

# 删除容器(停止后)
docker stop my-nginx
docker rm my-nginx

6.3 运行交互式容器

也可以直接进入容器内部执行命令:

# 交互式进入 Ubuntu 容器
docker run -it ubuntu bash

# 选项说明:
# -i: 交互模式(interactive)
# -t: 分配 TTY(终端)
# ubuntu: 要使用的镜像
# bash: 要执行的命令

# 在容器内部执行命令
root@container_id:/# cat /etc/os-release
root@container_id:/# apt update
root@container_id:/# exit  # 退出容器

7. Docker Hub 介绍

7.1 什么是 Docker Hub?

Docker Hub 是一个基于云的注册服务,用于存储和共享 Docker 镜像。如果说 GitHub 是用于源代码的,那么 Docker Hub 就是用于 Docker 镜像的。

  • 公共仓库:可以免费存储无限数量的公共镜像。
  • 私有仓库:付费计划可以存储私有镜像。
  • 官方镜像:提供 Docker 验证的官方镜像。
  • 自动构建:可以与 GitHub/Bitbucket 集成进行自动镜像构建。

7.2 使用 Docker Hub

# 在 Docker Hub 搜索镜像
docker search nginx

# 输出示例:
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        19000     [OK]
linuxserver/nginx                 An Nginx container...                           200

# 下载镜像(pull)
docker pull nginx
docker pull nginx:1.25  # 指定特定版本

# 登录 Docker Hub(用于 push 镜像)
docker login

# 标记自己的镜像
docker tag my-image:latest username/my-image:latest

# 上传镜像到 Docker Hub(push)
docker push username/my-image:latest

7.3 主要官方镜像

镜像 说明 示例命令
nginx 高性能 Web 服务器 docker run -d -p 80:80 nginx
mysql MySQL 数据库 docker run -d -e MYSQL_ROOT_PASSWORD=pass mysql
postgres PostgreSQL 数据库 docker run -d -e POSTGRES_PASSWORD=pass postgres
redis 内存数据存储 docker run -d -p 6379:6379 redis
node Node.js 运行时 docker run -it node
python Python 运行时 docker run -it python:3.11
ubuntu Ubuntu Linux docker run -it ubuntu bash
alpine 轻量级 Linux(5MB) docker run -it alpine sh

8. 总结与下一步

在本篇中,我们介绍了容器技术的基本概念、Docker 架构、安装方法以及运行第一个容器的方法。

核心要点

  • 容器是将应用程序和依赖项打包在隔离环境中运行的技术。
  • 与虚拟机的区别:容器共享主机 OS 内核,因此更轻量、更快速。
  • Docker 架构:由 Docker CLI、Docker 守护进程、Docker 仓库组成的客户端-服务器结构。
  • 基本命令docker rundocker psdocker stopdocker rm
  • Docker Hub:存储和共享 Docker 镜像的注册服务。

下一篇预告

第2篇将深入介绍 Docker 镜像和容器管理

  • 镜像与容器的区别
  • 镜像层概念
  • docker pull/push/images/rmi 命令
  • 容器生命周期管理
  • docker run 选项详解(-d、-p、-v、-e、--name)
  • docker exec 和 attach
  • 容器日志查看和资源限制

容器技术是现代软件开发的核心。掌握 Docker 可以构建更高效的开发环境和部署流水线。下一篇我们将学习更多实用的 Docker 使用方法!