文章目录
- Docker
-
- [第1章 容器生态系统(架构与产业链)](#第1章 容器生态系统(架构与产业链))
- [第2章 容器架构与核心组件](#第2章 容器架构与核心组件)
-
- [003 容器架构](#003 容器架构)
-
- [1. Docker Daemon](#1. Docker Daemon)
- [2. Docker Client](#2. Docker Client)
- [3. Storage Drivers(存储驱动)](#3. Storage Drivers(存储驱动))
- [4. 组件间关系](#4. 组件间关系)
- [第3章 镜像构建与分发(源代码、构建、分发)](#第3章 镜像构建与分发(源代码、构建、分发))
- [第4章 容器生命周期管理(启动、停止、删除、重启等)](#第4章 容器生命周期管理(启动、停止、删除、重启等))
-
- [005 容器操作命令详解](#005 容器操作命令详解)
-
- [1. 容器启动 `docker run`](#1. 容器启动
docker run) - [2. 容器停止 `docker stop`](#2. 容器停止
docker stop) - [3. 容器删除 `docker rm`](#3. 容器删除
docker rm) - [4. 容器重启 `docker restart`](#4. 容器重启
docker restart) - [5. 容器暂停 `docker pause`](#5. 容器暂停
docker pause) - [6. 容器日志 `docker logs`](#6. 容器日志
docker logs) - [7. 容器进容器 `docker exec`](#7. 容器进容器
docker exec)
- [1. 容器启动 `docker run`](#1. 容器启动
- [第5章 容器网络与服务通信(HTTP服务、容器相互连通等)](#第5章 容器网络与服务通信(HTTP服务、容器相互连通等))
Docker
第1章 容器生态系统(架构与产业链)
001 容器技术概述
容器的出现
容器作为一种技术源于 Linux 内核中两个重要模块:
- Cgroups(Control Groups):管理资源配额。
- Namespaces(命名空间):实现资源隔离。
这两个功能共同作用于容器技术中,使容器拥有与虚拟机相似的性能优势,又有隔离效果。
Docker 在 2013 年初将容器 idea 实现为产品,便迅速成为容器的主流产品。当前各大云厂商都提供容器服务,如阿里云、华为云、Azure、GCP 也支持容器方案。
容器生态系统构成

002 容器技术分层
核心技术层(Core Technologies)
-
容器规范:容器规范定义了容器的通用标准,例如:
- OCI(Open Container Initiative):定义了容器 runtime 和 image。这使得容器可以在不同平台运行。
- Docker 作为一个容器技术巨头,基于 OCI 的标准进行开发。
-
容器 runtime:
- runc:Docker 自持的 runtime,符合 OCI 规范。
- lxc:对于较早的 Oracle 容器,它是 runtime 的一个组成部分。
- rkt:CoreOS 开发的 runtime,也符合 OCI 规范。
-
容器管理工具:
- Docker cli:Docker 客户端,用来与 daemon 交互。
- rkt cli:可用来管理容器。
- Kubernetes 是一个容器 orchestrator,版本号为 1.21。
-
容器定义工具:
- Dockerfile:用来定义容器的构建指令。
- base images :如
ubuntu、centos、alpine等,这些镜像包含基础运行时的环境。
-
Registry(镜像仓库):
- Docker Hub :即
docker.io的 mirror,允许用户下载或上传镜像。 - Harbor:是一个企业级私有容器仓库,适合组织部署镜像。
- Docker Hub :即
-
容器 OS:
- 专门用于运行容器的操作系统,例如:
CoreOSAtomic OSUbuntu Core
- 专门用于运行容器的操作系统,例如:
第2章 容器架构与核心组件
003 容器架构
1. Docker Daemon
Docker daemon 是容器实际运行的地方。只有一个:
- 它侦听 Docker API 的请求。
- 它将所有的操作动作传递给后台服务进行处理。
- 它管理容器,镜像,网络等。
你可以通过命令行、REST API 与它交互。

2. Docker Client
你可以用 docker 这个命令与 daemon 交流。例如:
bash
[root@docker ~]# docker run hello-world
装过镜像和容器?不是,docker 客户端首先会查询本地是否已存储。如果没有,会自动去 oci 规范支持的 repository 中下载并启动。
3. Storage Drivers(存储驱动)
存储驱动实现镜像和容器的分层机制,有以下几个常用类型:
| Name | Description |
|---|---|
overlay2 |
Docker 17.06 之后默认使用的存储驱动,性能较优 |
aufs |
Ubuntu 14.04 等传统系统常用 |
btrfs |
相对较少使用,但有一定的兼容性及性能优势 |
devicemapper |
不太推荐,因为兼容性差,性能不佳,已被废弃 |
4. 组件间关系
以下是各个组件之间的互动关系:
- Client 与 server 之间通过 API 通信。
- server 与 Storage drivers 之间通信,处理容器和镜像操作。
- server 与 Network drivers 之间通信,实现容器的网络管理。
- server 与 Registry 之间通信,实现镜像的拉取、推送、删除。
- server 与 containers 之间通信,处理容器管理。
第3章 镜像构建与分发(源代码、构建、分发)
004 镜像与容器的交互
text
Dockerfile → build → image → run → container
Dockerfile 是构建镜像的结构定义,build 会根据 Dockerfile 构建出 image,run 会根据 image 创建 container。
镜像构建过程
镜像由若干层组成,每层对应一些构建过程。
- base-image:没有底层依赖的镜像。
- image layer:每层的不同操作形成不同的镜像。
在 docker 中最常见的构建命令为 docker build,其作用是对 build context 中的文件进行打包。
镜像构建的例子
我们来构建一个带有 nginx 的容器镜像:
bash
[root@docker ~]# vim Dockerfile
FROM centos
RUN yum install -y nginx
[root@docker ~]# docker build -t centos-nginx . #构建镜像
第4章 容器生命周期管理(启动、停止、删除、重启等)
005 容器操作命令详解
1. 容器启动 docker run
docker run 是启动容器的命令,它将执行以下操作:
- 启动对应的镜像。
- 配置网络和存储。
- 环境初始化。
2. 容器停止 docker stop
3. 容器删除 docker rm
4. 容器重启 docker restart
5. 容器暂停 docker pause
6. 容器日志 docker logs
7. 容器进容器 docker exec
这些命令可以满足大部分容器管理操作。
text
docker run → docker build → docker images → docker run
bash
docker run -d -p 3000:3000 myapp
注意:
-d是以 detached 模式运行,-p是端口映射。
第5章 容器网络与服务通信(HTTP服务、容器相互连通等)
006 容器网络基础
网络类型(Network Types)
- host 网络:容器共享宿主机的网络命名空间,直接使用系统网络。适用于对网络性能要求高的应用。
- bridge 网络 :也称为默认的网络类型,可以通过以下方式创建:
docker network create --driver bridge docker-network创建一个自定义桥接网络。
- none 网络:容器没有网络,数据存放在自己的库中,不受其他容器影响。
- user-defined network :用户可以自己定义,如
overlay、macvlan等。
容器网络先锋 - docker network inspect
bash
[root@docker ~]# docker network inspect bridge
{
"Name": "bridge",
"Id": "9c8f4ff0c361c169536a912736d7a305b93abd9f32f67036d53f585c813b",
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true"
}
}
网络配置:
--network=host:使用 host 网络--network=bridge:使用 bridge 网络--network=none:是一个不与任何端口通信的网络
容器崩溃问题处理
如果容器发生错误退出,你可以通过以下方式排查:
- 调试应用:使用
docker logs查看日志。 - 或直接进入容器:
docker exec -it <container-id> bash进入容器 bash。
st 网络
--network=bridge:使用 bridge 网络--network=none:是一个不与任何端口通信的网络
容器崩溃问题处理
如果容器发生错误退出,你可以通过以下方式排查:
- 调试应用:使用
docker logs查看日志。 - 或直接进入容器:
docker exec -it <container-id> bash进入容器 bash。 - 进入容器查看系统信息:
uname -a。