diff --git a/.gitignore b/.gitignore index 04f9bb9..f825f2a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,7 @@ node_modules/ package-lock.json docker-compose.override.yml + +# Editor configs +.obsidian/ +.vscode/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d80a1f..8be505f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ # 修订记录 -* 1.3.0 2021-YY-DD +* 1.4.0 2026-01-11 + * 全面支持 Docker Engine v29 新版本 + * 更新 Docker Compose 至 v2.40.x + * 更新 Kubernetes 相关章节至 1.35 版本 + * BuildKit 已成为默认稳定构建器,移除实验特性说明 + * 新增 Docker Scout、Docker Init 相关内容 + * 更新镜像加速器配置 + * 添加 CentOS EOL 警告,推荐使用 Rocky Linux/AlmaLinux + * 扩充安全章节和底层架构章节内容 + +* 1.3.0 2021-12-31 * 全面支持 Docker v20.10 新版本 * 新增 Docker Compose v2 * Docker Hub 自动构建转为付费功能 diff --git a/README.md b/README.md index f78ebda..b19d44d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Docker — 从入门到实践 -[![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![](https://img.shields.io/badge/Based-Docker%20CE%20v27.x-blue.svg)](https://github.com/docker/docker-ce) [![](https://img.shields.io/badge/Docker%20%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98-jd.com-red.svg)][1] +[![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![](https://img.shields.io/badge/Based-Docker%20CE%20v29.x-blue.svg)](https://github.com/docker/docker-ce) [![](https://img.shields.io/badge/Docker%20%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98-jd.com-red.svg)][1] -**v1.4.0** +**v1.4.1** | 语言 | - | | :----------------------------------------------- | :------------------------------------------------- | diff --git a/SUMMARY.md b/SUMMARY.md index e769355..2f61d65 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -6,7 +6,6 @@ * [Docker 简介](introduction/README.md) * [什么是 Docker](introduction/what.md) * [为什么要用 Docker](introduction/why.md) - * [基本概念](basic_concept/README.md) * [镜像](basic_concept/image.md) * [容器](basic_concept/container.md) diff --git a/appendix/repo/centos.md b/appendix/repo/centos.md index 5ebaf20..99afdf2 100644 --- a/appendix/repo/centos.md +++ b/appendix/repo/centos.md @@ -4,15 +4,27 @@ [CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。 -该仓库位于 `https://hub.docker.com/_/centos` ,提供了 CentOS 从 5 ~ 8 各个版本的镜像。 +> ⚠️ **重要提示**:CentOS 8 已于 2021 年 12 月 31 日停止维护(EOL),CentOS 7 将于 2024 年 6 月 30 日结束支持。Docker Hub 上的 CentOS 官方镜像**已停止更新**。 +> +> 对于新项目,建议使用以下替代方案: +> - [Rocky Linux](https://hub.docker.com/_/rockylinux):CentOS 创始人发起的社区驱动项目 +> - [AlmaLinux](https://hub.docker.com/_/almalinux):由 CloudLinux 支持的企业级发行版 +> - [CentOS Stream](https://hub.docker.com/r/centos/centos):RHEL 的上游开发分支 + +该仓库位于 `https://hub.docker.com/_/centos`,提供了 CentOS 从 5 ~ 8 各个版本的镜像(仅供参考,不再更新)。 ## 使用方法 -默认会启动一个最小化的 CentOS 环境。 +使用 Rocky Linux 替代(推荐): ```bash -$ docker run --name centos -it centos bash -bash-4.2# +$ docker run --name rocky -it rockylinux:9 bash +``` + +使用旧版 CentOS 7(仅用于遗留系统): + +```bash +$ docker run --name centos -it centos:7 bash ``` ## Dockerfile diff --git a/buildx/buildkit.md b/buildx/buildkit.md index 2a2f08a..3da8d02 100644 --- a/buildx/buildkit.md +++ b/buildx/buildkit.md @@ -2,13 +2,21 @@ **BuildKit** 是下一代的镜像构建组件,在 https://github.com/moby/buildkit 开源。 -**注意:如果您的镜像构建使用的是云服务商提供的镜像构建服务(腾讯云容器服务、阿里云容器服务等),由于上述服务提供商的 Docker 版本低于 18.09,BuildKit 无法使用,将造成镜像构建失败。建议使用 BuildKit 构建镜像时使用一个新的 Dockerfile 文件(例如 Dockerfile.buildkit)** +> **重要**:自 Docker 23.0 起,BuildKit 已成为**默认稳定构建器**,无需手动启用。Docker Engine v29 进一步将 Containerd 镜像存储设为默认,提升与 Kubernetes 的互操作性。 -目前,Docker Hub 自动构建已经支持 buildkit,具体请参考 https://github.com/docker-practice/docker-hub-buildx +目前,Docker Hub 自动构建已经支持 BuildKit,具体请参考 https://github.com/docker-practice/docker-hub-buildx ## `Dockerfile` 新增指令详解 -启用 `BuildKit` 之后,我们可以使用下面几个新的 `Dockerfile` 指令来加快镜像构建。 +使用 BuildKit 后,我们可以使用下面几个新的 `Dockerfile` 指令来加快镜像构建。 + +要使用最新的 Dockerfile 语法特性,建议在 Dockerfile 开头添加语法指令: + +```docker +# syntax=docker/dockerfile:1 +``` + +这将使用最新的稳定版语法解析器,确保你可以使用所有最新特性。 ### `RUN --mount=type=cache` @@ -23,7 +31,7 @@ WORKDIR /app COPY package.json /app/ -RUN npm i --registry=https://registry.npm.taobao.org \ +RUN npm i --registry=https://registry.npmmirror.com \ && rm -rf ~/.npm COPY src /app/src @@ -42,7 +50,7 @@ COPY --from=builder /app/dist /app/dist `BuildKit` 提供了 `RUN --mount=type=cache` 指令,可以实现上边的设想。 ```docker -# syntax = docker/dockerfile:experimental +# syntax=docker/dockerfile:1 FROM node:alpine as builder WORKDIR /app @@ -51,7 +59,7 @@ COPY package.json /app/ RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \ --mount=type=cache,target=/root/.npm,id=npm_cache \ - npm i --registry=https://registry.npm.taobao.org + npm i --registry=https://registry.npmmirror.com COPY src /app/src @@ -69,11 +77,6 @@ RUN --mount=type=cache,target=/tmp/dist,from=builder,source=/app/dist \ mkdir -p /app/dist && cp -r /tmp/dist/* /app/dist ``` -**由于 `BuildKit` 为实验特性,每个 `Dockerfile` 文件开头都必须加上如下指令** - -```docker -# syntax = docker/dockerfile:experimental -``` 第一个 `RUN` 指令执行后,`id` 为 `my_app_npm_module` 的缓存文件夹挂载到了 `/app/node_modules` 文件夹中。多次执行也不会产生多个中间层镜像。 @@ -97,7 +100,7 @@ RUN --mount=type=cache,target=/tmp/dist,from=builder,source=/app/dist \ 该指令可以将一个镜像(或上一构建阶段)的文件挂载到指定位置。 ```docker -# syntax = docker/dockerfile:experimental +# syntax=docker/dockerfile:1 RUN --mount=type=bind,from=php:alpine,source=/usr/local/bin/docker-php-entrypoint,target=/docker-php-entrypoint \ cat /docker-php-entrypoint ``` @@ -107,7 +110,7 @@ RUN --mount=type=bind,from=php:alpine,source=/usr/local/bin/docker-php-entrypoin 该指令可以将一个 `tmpfs` 文件系统挂载到指定位置。 ```docker -# syntax = docker/dockerfile:experimental +# syntax=docker/dockerfile:1 RUN --mount=type=tmpfs,target=/temp \ mount | grep /temp ``` @@ -117,7 +120,7 @@ RUN --mount=type=tmpfs,target=/temp \ 该指令可以将一个文件(例如密钥)挂载到指定位置。 ```docker -# syntax = docker/dockerfile:experimental +# syntax=docker/dockerfile:1 RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \ cat /root/.aws/credentials ``` @@ -131,7 +134,7 @@ $ docker build -t test --secret id=aws,src=$HOME/.aws/credentials . 该指令可以挂载 `ssh` 密钥。 ```docker -# syntax = docker/dockerfile:experimental +# syntax=docker/dockerfile:1 FROM alpine RUN apk add --no-cache openssh-client RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts @@ -145,9 +148,9 @@ $ ssh-add ~/.ssh/id_rsa $ docker build -t test --ssh default=$SSH_AUTH_SOCK . ``` -## docker compose build 使用 Buildkit +## docker compose build 使用 BuildKit -设置 `COMPOSE_DOCKER_CLI_BUILD=1` 和 `DOCKER_BUILDKIT=1` 环境变量即可使用。 +自 Docker 23.0 起,BuildKit 已默认启用,无需额外配置。如果使用旧版本,可设置 `DOCKER_BUILDKIT=1` 环境变量启用。 ## 官方文档 diff --git a/compose/install.md b/compose/install.md index 9582bf4..35e9d7d 100644 --- a/compose/install.md +++ b/compose/install.md @@ -16,12 +16,14 @@ Linux 系统请使用以下介绍的方法安装。 从 [官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。 -例如,在 Linux 64 位系统上直接下载对应的二进制包。 +> **提示**:版本更新较快,请访问上述链接获取最新版本号,替换下方命令中的版本号。 + +例如,在 Linux 64 位系统上直接下载对应的二进制包(以 v2.40.3 为例)。 ```bash $ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} $ mkdir -p $DOCKER_CONFIG/cli-plugins -$ curl -SL https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose +$ curl -SL https://github.com/docker/compose/releases/download/v2.40.3/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose ``` 之后,执行 @@ -34,13 +36,13 @@ $ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose ```bash $ docker compose version -Docker Compose version v2.29.1 +Docker Compose version v2.40.3 ``` ## bash 补全命令 ```bash -$ curl -L https://raw.githubusercontent.com/docker/compose/v2.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose +$ curl -L https://raw.githubusercontent.com/docker/compose/v2.40.3/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose ``` ## 卸载 diff --git a/image/build.md b/image/build.md index 5372b0e..17bd9d1 100644 --- a/image/build.md +++ b/image/build.md @@ -4,6 +4,18 @@ Dockerfile 是一个文本文件,其内包含了一条条的 **指令(Instruction)**,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 +## 使用 docker init 快速创建(推荐) + +Docker 提供了 `docker init` 命令,可以根据项目类型自动生成 Dockerfile、.dockerignore 和 compose.yaml 文件: + +```bash +$ docker init +``` + +该命令会交互式地询问项目类型(如 Go、Node.js、Python、Rust 等),并生成符合最佳实践的配置文件。对于新项目,这是推荐的起步方式。 + +## 手动创建 Dockerfile + 还以之前定制 `nginx` 镜像为例,这次我们使用 Dockerfile 来定制。 在一个空白目录中,建立一个文本文件,并命名为 `Dockerfile`: diff --git a/install/centos.md b/install/centos.md index 03b9857..46c44ea 100644 --- a/install/centos.md +++ b/install/centos.md @@ -6,7 +6,11 @@ ### 系统要求 -Docker 支持 64 位版本 CentOS 7/8/9,以及 Rocky Linux/AlmaLinux 8/9,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 `overlay2` 存储层驱动)无法使用,并且部分功能可能不太稳定。对于 CentOS 8 及更高版本,以及 Rocky Linux/AlmaLinux,推荐使用 `dnf` 包管理器。 +> ⚠️ **重要提示**:CentOS 8 已于 2021 年 12 月 31 日停止维护,CentOS 7 已于 2024 年 6 月 30 日结束支持。建议新项目使用 **Rocky Linux** 或 **AlmaLinux** 作为替代。 + +Docker 支持 64 位版本 CentOS 7/8/9(Stream)、Rocky Linux 8/9、AlmaLinux 8/9,并且要求内核版本不低于 3.10。CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 `overlay2` 存储层驱动)无法使用,并且部分功能可能不太稳定。 + +对于 Rocky Linux、AlmaLinux 或 CentOS Stream,推荐使用 `dnf` 包管理器。 ### 卸载旧版本 diff --git a/install/mac.md b/install/mac.md index 53c8697..25f80c5 100644 --- a/install/mac.md +++ b/install/mac.md @@ -42,7 +42,7 @@ $ brew install --cask docker ```bash $ docker --version -Docker version 27.2.1, build 9e34c9b +Docker version 29.1.4, build 048e46e ``` 如果 `docker version`、`docker info` 都正常的话,可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/): diff --git a/install/mirror.md b/install/mirror.md index 518b2d6..03f967e 100644 --- a/install/mirror.md +++ b/install/mirror.md @@ -1,14 +1,18 @@ # 镜像加速器 -国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。~~国内很多云服务商都提供了国内加速器服务,例如:~~ +国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。 -* [阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 左侧镜像工具 -> 镜像加速器 -> 复制加速器地址)](https://cr.console.aliyun.com/cn-hangzhou/instances) +> ⚠️ **注意**:镜像加速器的可用性经常变化。配置前请先访问 [docker-practice/docker-registry-cn-mirror-test](https://github.com/docker-practice/docker-registry-cn-mirror-test/actions) 查看各镜像站的实时状态。 -**由于镜像服务可能出现宕机,建议同时配置多个镜像。各个镜像站测试结果请到 [docker-practice/docker-registry-cn-mirror-test](https://github.com/docker-practice/docker-registry-cn-mirror-test/actions) 查看。** +## 推荐配置方案 -> 国内各大云服务商(腾讯云、阿里云、百度云)均提供了 Docker 镜像加速服务,建议根据运行 Docker 的云平台选择对应的镜像加速服务,具体请参考本页最后一小节。 +1. **云服务器用户**:优先使用所在云平台提供的内部加速器(见本页末尾) +2. **本地开发用户**:使用阿里云个人加速器或其他可用的公共加速器 +3. **代理方案**:如有条件,可配置 HTTP 代理直接访问 Docker Hub -本节我们以 [AtomHub 可信镜像中心](https://hub.atomgit.com/) 镜像服务 `https://hub.atomgit.com` 为例进行介绍。 +* [阿里云加速器](https://cr.console.aliyun.com/cn-hangzhou/instances)(需登录获取个人加速地址) + +本节以 [AtomHub 可信镜像中心](https://hub.atomgit.com/) 镜像服务 `https://hub.atomgit.com` 为例进行介绍。 > `hub.atomgit.com` 仅包含部分官方镜像,可以满足初学者的使用。 diff --git a/install/ubuntu.md b/install/ubuntu.md index 49ff4d7..cdde519 100644 --- a/install/ubuntu.md +++ b/install/ubuntu.md @@ -6,12 +6,13 @@ ### 系统要求 -Docker 支持诸多版本的 [Ubuntu](https://ubuntu.com/server) 操作系统。但是较旧的版本上将不会有Docker新版本的持续更新,以截至2024年中的几个 Ubuntu LTS(Long Term Support,长期支持)版本为例: +Docker 支持诸多版本的 [Ubuntu](https://ubuntu.com/server) 操作系统。但是较旧的版本上将不会有 Docker 新版本的持续更新,以截至 2026 年初的几个 Ubuntu LTS(Long Term Support,长期支持)版本为例: -* Ubuntu Noble 24.04 (LTS),Docker v27.2.1 -* Ubuntu Jammy 22.04 (LTS), Docker v27.2.1 -* Ubuntu Focal 20.04 (LTS), Docker v27.2.1 -* Ubuntu Bionic 18.04 (LTS),Docker v24.0.2 +* Ubuntu Noble 24.04 (LTS),Docker v29.1.x +* Ubuntu Jammy 22.04 (LTS), Docker v29.1.x +* Ubuntu Focal 20.04 (LTS), Docker v29.1.x + +> **注意**:Ubuntu 18.04 LTS 已于 2023 年结束标准支持,不再推荐用于新部署。 在 Ubuntu LTS 版本上,目前 Docker 支持 amd64、arm64、armhf、ppc64el、s390x 等 5 个平台;而非 LTS 版本支持的平台通常较少。同时,LTS 版本会获得 5 年的升级维护支持,这样的系统会获得更长期的安全保障,因此在生产环境中推荐使用 LTS 版本。 diff --git a/introduction/what.md b/introduction/what.md index 9d5c9b5..1f03760 100644 --- a/introduction/what.md +++ b/introduction/what.md @@ -2,7 +2,7 @@ **Docker** 最初是 `dotCloud` 公司创始人 [Solomon Hykes](https://github.com/shykes) 在法国期间发起的一个公司内部项目,它是基于 `dotCloud` 公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源](https://en.wikipedia.org/wiki/Docker_\(software\)),主要项目代码在 [GitHub](https://github.com/moby/moby) 上进行维护。`Docker` 项目后来还加入了 Linux 基金会,并成立推动 [开放容器联盟(OCI)](https://opencontainers.org/)。 -**Docker** 自开源后受到广泛的关注和讨论,至今其 [GitHub 项目](https://github.com/moby/moby) 已经超过 5 万 7 千个星标和一万多个 `fork`。甚至由于 `Docker` 项目的火爆,在 `2013` 年底,[dotCloud 公司决定改名为 Docker](https://www.docker.com/blog/dotcloud-is-becoming-docker-inc/)。`Docker` 最初是在 `Ubuntu 12.04` 上开发实现的;`Red Hat` 则从 `RHEL 6.5` 开始对 `Docker` 进行支持;`Google` 也在其 `PaaS` 产品中广泛应用 `Docker`。 +**Docker** 自开源后受到广泛的关注和讨论,至今其 [GitHub 项目](https://github.com/moby/moby) 已经超过 6.8 万个星标和一万多个 `fork`。甚至由于 `Docker` 项目的火爆,在 `2013` 年底,[dotCloud 公司决定改名为 Docker](https://www.docker.com/blog/dotcloud-is-becoming-docker-inc/)。`Docker` 最初是在 `Ubuntu 12.04` 上开发实现的;`Red Hat` 则从 `RHEL 6.5` 开始对 `Docker` 进行支持;`Google` 也在其 `PaaS` 产品中广泛应用 `Docker`。 **Docker** 使用 `Google` 公司推出的 [Go 语言](https://golang.google.cn/) 进行开发实现,基于 `Linux` 内核的 [cgroup](https://zh.wikipedia.org/wiki/Cgroups),[namespace](https://en.wikipedia.org/wiki/Linux_namespaces),以及 [OverlayFS](https://docs.docker.com/storage/storagedriver/overlayfs-driver/) 类的 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 等技术,对进程进行封装隔离,属于 [操作系统层面的虚拟化技术](https://en.wikipedia.org/wiki/Operating-system-level_virtualization)。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 [LXC](https://linuxcontainers.org/lxc/introduction/),从 `0.7` 版本以后开始去除 `LXC`,转而使用自行开发的 [libcontainer](https://github.com/docker/libcontainer),从 `1.11` 版本开始,则进一步演进为使用 [runC](https://github.com/opencontainers/runc) 和 [containerd](https://github.com/containerd/containerd)。 diff --git a/kubernetes/setup/kubeadm.md b/kubernetes/setup/kubeadm.md index b1848ec..78a5d00 100644 --- a/kubernetes/setup/kubeadm.md +++ b/kubernetes/setup/kubeadm.md @@ -2,6 +2,8 @@ `kubeadm` 提供了 `kubeadm init` 以及 `kubeadm join` 这两个命令作为快速创建 `kubernetes` 集群的最佳实践。 +> **版本说明**:Kubernetes 版本更新较快(约每 4 个月一个新版本),本文档基于 Kubernetes 1.35 编写。请访问 [Kubernetes 官方发布页](https://kubernetes.io/releases/) 获取最新版本信息。 + ## 安装 containerd 参考 [安装 Docker](../../install) 一节添加 apt/yum 源,之后执行如下命令。 @@ -107,7 +109,7 @@ oom_score = 0 stream_idle_timeout = "4h0m0s" enable_selinux = false selinux_category_range = 1024 - sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9" + sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10" stats_collect_period = 10 # systemd_cgroup = false enable_tls_streaming = false @@ -377,7 +379,7 @@ $ kubectl get node -o yaml | grep CIDR ``` ```bash -$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.24.0/Documentation/kube-flannel.yml +$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.26.1/Documentation/kube-flannel.yml ``` ## master 节点默认不能运行 pod diff --git a/repository/dockerhub.md b/repository/dockerhub.md index 17ae8d9..258eb5a 100644 --- a/repository/dockerhub.md +++ b/repository/dockerhub.md @@ -57,15 +57,15 @@ docker.io/library/centos:latest 以下命令中的 `username` 请替换为你的 Docker 账号用户名。 ```bash -$ docker tag ubuntu:18.04 username/ubuntu:18.04 +$ docker tag ubuntu:24.04 username/ubuntu:24.04 $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE -ubuntu 18.04 275d79972a86 6 days ago 94.6MB -username/ubuntu 18.04 275d79972a86 6 days ago 94.6MB +ubuntu 24.04 5a81c4b8502e 6 days ago 78.3MB +username/ubuntu 24.04 5a81c4b8502e 6 days ago 78.3MB -$ docker push username/ubuntu:18.04 +$ docker push username/ubuntu:24.04 $ docker search username diff --git a/security/README.md b/security/README.md index c183e6a..1660aae 100644 --- a/security/README.md +++ b/security/README.md @@ -1,7 +1,59 @@ # 安全 -评估 Docker 的安全性时,主要考虑三个方面: +容器安全是生产环境部署的核心考量。评估 Docker 的安全性时,主要考虑以下几个方面: -* 由内核的命名空间和控制组机制提供的容器内在安全 -* Docker 程序(特别是服务端)本身的抗攻击性 -* 内核安全性的加强机制对容器安全性的影响 +## 核心安全机制 + +* **内核命名空间(Namespace)**:提供进程、网络、文件系统等资源的隔离 +* **控制组(Cgroups)**:限制容器的 CPU、内存、I/O 等资源使用 +* **Docker 守护进程安全**:服务端的访问控制和防护 +* **内核能力机制(Capabilities)**:细粒度的权限控制 + +## 现代安全实践 + +### 镜像安全扫描 + +使用工具扫描镜像中的已知漏洞: + +* **Docker Scout**:Docker 官方集成的安全扫描工具,提供 SBOM 分析 +* **Trivy**:开源的全面漏洞扫描器 +* **Snyk**:商业级安全平台 + +```bash +# 使用 Docker Scout 扫描镜像 +$ docker scout cves myimage:latest + +# 使用 Trivy 扫描 +$ trivy image myimage:latest +``` + +### 非 root 用户运行 + +避免以 root 用户运行容器,降低权限逃逸风险: + +```dockerfile +FROM node:20-alpine +RUN addgroup -g 1001 appgroup && adduser -u 1001 -G appgroup -D appuser +USER appuser +``` + +### 只读文件系统 + +使用只读根文件系统增强安全性: + +```bash +$ docker run --read-only --tmpfs /tmp myimage +``` + +### Docker Content Trust(DCT) + +启用镜像签名验证,确保镜像来源可信: + +```bash +$ export DOCKER_CONTENT_TRUST=1 +$ docker pull myregistry/myimage:latest +``` + +## 本章内容 + +本章将详细介绍各安全机制的原理和配置方法。 diff --git a/swarm_mode/README.md b/swarm_mode/README.md index fb7c09a..b524585 100644 --- a/swarm_mode/README.md +++ b/swarm_mode/README.md @@ -2,4 +2,6 @@ Docker 1.12 [Swarm mode](https://docs.docker.com/engine/swarm/) 已经内嵌入 Docker 引擎,成为了 docker 子命令 `docker swarm`。请注意与旧的 `Docker Swarm` 区分开来。 -`Swarm mode` 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 `Swarm` 集群具备与 Mesos、Kubernetes 竞争的实力。 +`Swarm mode` 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。 + +> **定位说明**:Swarm mode 适合小型团队和简单的容器编排场景,具有学习成本低、配置简单的优势。对于大规模生产部署、复杂的微服务架构,建议使用 [Kubernetes](../kubernetes/README.md),它拥有更丰富的生态系统和更强大的扩展能力。 diff --git a/underly/arch.md b/underly/arch.md index ea3b929..9811cbc 100644 --- a/underly/arch.md +++ b/underly/arch.md @@ -1,11 +1,51 @@ # 基本架构 -Docker 采用了 `C/S` 架构,包括客户端和服务端。Docker 守护进程 (`Daemon`)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。 +Docker 采用了 `C/S`(客户端/服务端)架构,包括客户端和服务端。Docker 守护进程(`Daemon`)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 `socket` 或者 `RESTful API` 来进行通信。 ![Docker 基本架构](../.gitbook/assets/docker_arch.png) -Docker 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息。 +## 核心组件 -Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker 守护进程交互。 +Docker 的核心组件形成了一个层次化的架构: + +``` +┌─────────────────────────────────────────────────┐ +│ Docker CLI │ +│ (docker 命令行工具) │ +├─────────────────────────────────────────────────┤ +│ dockerd │ +│ (Docker 守护进程/引擎) │ +├─────────────────────────────────────────────────┤ +│ containerd │ +│ (容器生命周期管理器) │ +├─────────────────────────────────────────────────┤ +│ runc │ +│ (OCI 容器运行时) │ +└─────────────────────────────────────────────────┘ +``` + +* **Docker CLI**:用户与 Docker 交互的命令行工具 +* **dockerd**:Docker 守护进程,提供 Docker API,管理镜像、网络、存储等 +* **containerd**:高级容器运行时,管理容器的完整生命周期 +* **runc**:低级容器运行时,根据 OCI 规范创建和运行容器 + +## Docker Desktop 架构 + +在 macOS 和 Windows 上,Docker Desktop 使用轻量级虚拟机运行 Linux 内核: + +* **macOS**:使用 Apple Hypervisor Framework 或 QEMU +* **Windows**:使用 WSL 2(推荐)或 Hyper-V + +这意味着容器实际运行在虚拟机内的 Linux 环境中,而非直接运行在宿主系统上。 + +## Docker Engine v29 重要变化 + +自 Docker Engine v29 起,**Containerd 镜像存储**成为新安装的默认配置。这一变化: + +* 简化了 Docker 的内部架构 +* 提升了与 Kubernetes 等 containerd 平台的互操作性 +* 为 Lazy Pulling 等新特性奠定基础 + +Docker 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息。Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker 守护进程交互。