Docker 入门指南

| 分类 docker  | 标签 docker 

Docker 入门指南 — 核心原理与源码对应详解

Docker 是当前容器技术的标杆,基于 Linux 内核的 Namespace、Cgroups 等特性,实现轻量级虚拟化。随着开源生态发展,Docker 组件拆分成多个独立项目,源码结构不断优化。本文结合 2025 年最新 Docker 及相关组件源码,深入剖析核心技术及对应源码位置,助你快速理解实现细节。


一、Docker 核心原理

1. Namespace(命名空间)

  • 功能:隔离进程号、网络、文件系统挂载点、主机名等,实现容器间资源隔离。
  • 源码位置runc/libcontainer/nsenter

2. Cgroups(控制组)

  • 功能:限制容器 CPU、内存、IO 等资源使用,确保资源公平。
  • 源码位置: 资源管理已拆分,最新实现由独立项目管理: containerd/cgroups

3. 联合文件系统(OverlayFS)

4. chroot(根目录隔离)

5. 容器运行时与生命周期管理

6. 网络管理(libnetwork)

  • 功能:虚拟网络桥接、端口映射及容器间通信。
  • 源码位置docker/libnetwork

二、Docker 安装及环境准备

1. 安装前提

  • 需要 Linux 内核支持 Namespace、Cgroups 等特性。
  • 发行版建议:CentOS、Ubuntu、Arch Linux 等主流发行版均支持。

2. 安装示例(CentOS)

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker

3. 配置用户权限

将当前用户加入 docker 组,避免使用 root 权限:

sudo usermod -aG docker your_username

三、镜像加速推荐


四、Docker 常用命令

docker run -it --rm alpine:3.4           # 启动交互式临时容器
docker exec -it container_id sh          # 进入正在运行容器终端
docker ps                                # 查看运行中容器
docker images                            # 查看本地镜像列表
docker pull image_name                   # 拉取远程镜像
docker push image_name                   # 推送镜像到仓库
docker rm container_id                   # 删除容器
docker rmi image_name                    # 删除镜像
docker build -t myapp .                  # 构建镜像

五、Dockerfile 简要示范

FROM alpine:3.4
LABEL maintainer="your_email@example.com"
RUN apk add --no-cache curl
ENV MY_VAR=hello
COPY ./app /app
WORKDIR /app
EXPOSE 8080
CMD ["./app"]

六、Docker 容器启动流程与源码对应

步骤 作用 源码位置
用户执行 docker run Docker daemon 解析命令,调用 containerd API moby/moby
containerd 创建容器 容器生命周期管理 containerd/containerd
runc 启动容器进程 Namespace、cgroups、chroot配置 opencontainers/runc
文件系统挂载 OverlayFS 层叠加挂载 moby/moby/daemon/graphdriver/overlay2
网络配置 libnetwork 网络桥接和端口映射 docker/libnetwork

七、总结

Docker 核心基于 Linux 容器技术,配合多个独立且协同的开源项目(containerd、runc、libnetwork)构建了功能完善的容器生态。源码模块拆分清晰,理解源码架构帮助更好地运维和开发扩展。


参考链接