mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-10 11:54:37 +00:00
Update tools to latest version
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -11,3 +11,7 @@ node_modules/
|
|||||||
package-lock.json
|
package-lock.json
|
||||||
|
|
||||||
docker-compose.override.yml
|
docker-compose.override.yml
|
||||||
|
|
||||||
|
# Editor configs
|
||||||
|
.obsidian/
|
||||||
|
.vscode/
|
||||||
|
|||||||
12
CHANGELOG.md
12
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 v20.10 新版本
|
||||||
* 新增 Docker Compose v2
|
* 新增 Docker Compose v2
|
||||||
* Docker Hub 自动构建转为付费功能
|
* Docker Hub 自动构建转为付费功能
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# Docker — 从入门到实践
|
# Docker — 从入门到实践
|
||||||
|
|
||||||
[](https://github.com/yeasy/docker_practice) [](https://github.com/yeasy/docker_practice/releases) [](https://github.com/docker/docker-ce) [][1]
|
[](https://github.com/yeasy/docker_practice) [](https://github.com/yeasy/docker_practice/releases) [](https://github.com/docker/docker-ce) [][1]
|
||||||
|
|
||||||
**v1.4.0**
|
**v1.4.1**
|
||||||
|
|
||||||
| 语言 | - |
|
| 语言 | - |
|
||||||
| :----------------------------------------------- | :------------------------------------------------- |
|
| :----------------------------------------------- | :------------------------------------------------- |
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
* [Docker 简介](introduction/README.md)
|
* [Docker 简介](introduction/README.md)
|
||||||
* [什么是 Docker](introduction/what.md)
|
* [什么是 Docker](introduction/what.md)
|
||||||
* [为什么要用 Docker](introduction/why.md)
|
* [为什么要用 Docker](introduction/why.md)
|
||||||
|
|
||||||
* [基本概念](basic_concept/README.md)
|
* [基本概念](basic_concept/README.md)
|
||||||
* [镜像](basic_concept/image.md)
|
* [镜像](basic_concept/image.md)
|
||||||
* [容器](basic_concept/container.md)
|
* [容器](basic_concept/container.md)
|
||||||
|
|||||||
@@ -4,15 +4,27 @@
|
|||||||
|
|
||||||
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致。
|
[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
|
```bash
|
||||||
$ docker run --name centos -it centos bash
|
$ docker run --name rocky -it rockylinux:9 bash
|
||||||
bash-4.2#
|
```
|
||||||
|
|
||||||
|
使用旧版 CentOS 7(仅用于遗留系统):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ docker run --name centos -it centos:7 bash
|
||||||
```
|
```
|
||||||
|
|
||||||
## Dockerfile
|
## Dockerfile
|
||||||
|
|||||||
@@ -2,13 +2,21 @@
|
|||||||
|
|
||||||
**BuildKit** 是下一代的镜像构建组件,在 https://github.com/moby/buildkit 开源。
|
**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` 新增指令详解
|
## `Dockerfile` 新增指令详解
|
||||||
|
|
||||||
启用 `BuildKit` 之后,我们可以使用下面几个新的 `Dockerfile` 指令来加快镜像构建。
|
使用 BuildKit 后,我们可以使用下面几个新的 `Dockerfile` 指令来加快镜像构建。
|
||||||
|
|
||||||
|
要使用最新的 Dockerfile 语法特性,建议在 Dockerfile 开头添加语法指令:
|
||||||
|
|
||||||
|
```docker
|
||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
```
|
||||||
|
|
||||||
|
这将使用最新的稳定版语法解析器,确保你可以使用所有最新特性。
|
||||||
|
|
||||||
### `RUN --mount=type=cache`
|
### `RUN --mount=type=cache`
|
||||||
|
|
||||||
@@ -23,7 +31,7 @@ WORKDIR /app
|
|||||||
|
|
||||||
COPY package.json /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
|
&& rm -rf ~/.npm
|
||||||
|
|
||||||
COPY src /app/src
|
COPY src /app/src
|
||||||
@@ -42,7 +50,7 @@ COPY --from=builder /app/dist /app/dist
|
|||||||
`BuildKit` 提供了 `RUN --mount=type=cache` 指令,可以实现上边的设想。
|
`BuildKit` 提供了 `RUN --mount=type=cache` 指令,可以实现上边的设想。
|
||||||
|
|
||||||
```docker
|
```docker
|
||||||
# syntax = docker/dockerfile:experimental
|
# syntax=docker/dockerfile:1
|
||||||
FROM node:alpine as builder
|
FROM node:alpine as builder
|
||||||
|
|
||||||
WORKDIR /app
|
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 \
|
RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \
|
||||||
--mount=type=cache,target=/root/.npm,id=npm_cache \
|
--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
|
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
|
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` 文件夹中。多次执行也不会产生多个中间层镜像。
|
第一个 `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
|
```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 \
|
RUN --mount=type=bind,from=php:alpine,source=/usr/local/bin/docker-php-entrypoint,target=/docker-php-entrypoint \
|
||||||
cat /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` 文件系统挂载到指定位置。
|
该指令可以将一个 `tmpfs` 文件系统挂载到指定位置。
|
||||||
|
|
||||||
```docker
|
```docker
|
||||||
# syntax = docker/dockerfile:experimental
|
# syntax=docker/dockerfile:1
|
||||||
RUN --mount=type=tmpfs,target=/temp \
|
RUN --mount=type=tmpfs,target=/temp \
|
||||||
mount | grep /temp
|
mount | grep /temp
|
||||||
```
|
```
|
||||||
@@ -117,7 +120,7 @@ RUN --mount=type=tmpfs,target=/temp \
|
|||||||
该指令可以将一个文件(例如密钥)挂载到指定位置。
|
该指令可以将一个文件(例如密钥)挂载到指定位置。
|
||||||
|
|
||||||
```docker
|
```docker
|
||||||
# syntax = docker/dockerfile:experimental
|
# syntax=docker/dockerfile:1
|
||||||
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
|
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
|
||||||
cat /root/.aws/credentials
|
cat /root/.aws/credentials
|
||||||
```
|
```
|
||||||
@@ -131,7 +134,7 @@ $ docker build -t test --secret id=aws,src=$HOME/.aws/credentials .
|
|||||||
该指令可以挂载 `ssh` 密钥。
|
该指令可以挂载 `ssh` 密钥。
|
||||||
|
|
||||||
```docker
|
```docker
|
||||||
# syntax = docker/dockerfile:experimental
|
# syntax=docker/dockerfile:1
|
||||||
FROM alpine
|
FROM alpine
|
||||||
RUN apk add --no-cache openssh-client
|
RUN apk add --no-cache openssh-client
|
||||||
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
|
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 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` 环境变量启用。
|
||||||
|
|
||||||
## 官方文档
|
## 官方文档
|
||||||
|
|
||||||
|
|||||||
@@ -16,12 +16,14 @@ Linux 系统请使用以下介绍的方法安装。
|
|||||||
|
|
||||||
从 [官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。
|
从 [官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。
|
||||||
|
|
||||||
例如,在 Linux 64 位系统上直接下载对应的二进制包。
|
> **提示**:版本更新较快,请访问上述链接获取最新版本号,替换下方命令中的版本号。
|
||||||
|
|
||||||
|
例如,在 Linux 64 位系统上直接下载对应的二进制包(以 v2.40.3 为例)。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
|
$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
|
||||||
$ mkdir -p $DOCKER_CONFIG/cli-plugins
|
$ 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
|
```bash
|
||||||
$ docker compose version
|
$ docker compose version
|
||||||
Docker Compose version v2.29.1
|
Docker Compose version v2.40.3
|
||||||
```
|
```
|
||||||
|
|
||||||
## bash 补全命令
|
## bash 补全命令
|
||||||
|
|
||||||
```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
|
||||||
```
|
```
|
||||||
|
|
||||||
## 卸载
|
## 卸载
|
||||||
|
|||||||
@@ -4,6 +4,18 @@
|
|||||||
|
|
||||||
Dockerfile 是一个文本文件,其内包含了一条条的 **指令(Instruction)**,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
|
Dockerfile 是一个文本文件,其内包含了一条条的 **指令(Instruction)**,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
|
||||||
|
|
||||||
|
## 使用 docker init 快速创建(推荐)
|
||||||
|
|
||||||
|
Docker 提供了 `docker init` 命令,可以根据项目类型自动生成 Dockerfile、.dockerignore 和 compose.yaml 文件:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ docker init
|
||||||
|
```
|
||||||
|
|
||||||
|
该命令会交互式地询问项目类型(如 Go、Node.js、Python、Rust 等),并生成符合最佳实践的配置文件。对于新项目,这是推荐的起步方式。
|
||||||
|
|
||||||
|
## 手动创建 Dockerfile
|
||||||
|
|
||||||
还以之前定制 `nginx` 镜像为例,这次我们使用 Dockerfile 来定制。
|
还以之前定制 `nginx` 镜像为例,这次我们使用 Dockerfile 来定制。
|
||||||
|
|
||||||
在一个空白目录中,建立一个文本文件,并命名为 `Dockerfile`:
|
在一个空白目录中,建立一个文本文件,并命名为 `Dockerfile`:
|
||||||
|
|||||||
@@ -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` 包管理器。
|
||||||
|
|
||||||
### 卸载旧版本
|
### 卸载旧版本
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ $ brew install --cask docker
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker --version
|
$ 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/):
|
如果 `docker version`、`docker info` 都正常的话,可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/):
|
||||||
|
|||||||
@@ -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` 仅包含部分官方镜像,可以满足初学者的使用。
|
> `hub.atomgit.com` 仅包含部分官方镜像,可以满足初学者的使用。
|
||||||
|
|
||||||
|
|||||||
@@ -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 Noble 24.04 (LTS),Docker v29.1.x
|
||||||
* Ubuntu Jammy 22.04 (LTS), Docker v27.2.1
|
* Ubuntu Jammy 22.04 (LTS), Docker v29.1.x
|
||||||
* Ubuntu Focal 20.04 (LTS), Docker v27.2.1
|
* Ubuntu Focal 20.04 (LTS), Docker v29.1.x
|
||||||
* Ubuntu Bionic 18.04 (LTS),Docker v24.0.2
|
|
||||||
|
> **注意**:Ubuntu 18.04 LTS 已于 2023 年结束标准支持,不再推荐用于新部署。
|
||||||
|
|
||||||
在 Ubuntu LTS 版本上,目前 Docker 支持 amd64、arm64、armhf、ppc64el、s390x 等 5 个平台;而非 LTS 版本支持的平台通常较少。同时,LTS 版本会获得 5 年的升级维护支持,这样的系统会获得更长期的安全保障,因此在生产环境中推荐使用 LTS 版本。
|
在 Ubuntu LTS 版本上,目前 Docker 支持 amd64、arm64、armhf、ppc64el、s390x 等 5 个平台;而非 LTS 版本支持的平台通常较少。同时,LTS 版本会获得 5 年的升级维护支持,这样的系统会获得更长期的安全保障,因此在生产环境中推荐使用 LTS 版本。
|
||||||
|
|
||||||
|
|||||||
@@ -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** 最初是 `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)。
|
**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)。
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
`kubeadm` 提供了 `kubeadm init` 以及 `kubeadm join` 这两个命令作为快速创建 `kubernetes` 集群的最佳实践。
|
`kubeadm` 提供了 `kubeadm init` 以及 `kubeadm join` 这两个命令作为快速创建 `kubernetes` 集群的最佳实践。
|
||||||
|
|
||||||
|
> **版本说明**:Kubernetes 版本更新较快(约每 4 个月一个新版本),本文档基于 Kubernetes 1.35 编写。请访问 [Kubernetes 官方发布页](https://kubernetes.io/releases/) 获取最新版本信息。
|
||||||
|
|
||||||
## 安装 containerd
|
## 安装 containerd
|
||||||
|
|
||||||
参考 [安装 Docker](../../install) 一节添加 apt/yum 源,之后执行如下命令。
|
参考 [安装 Docker](../../install) 一节添加 apt/yum 源,之后执行如下命令。
|
||||||
@@ -107,7 +109,7 @@ oom_score = 0
|
|||||||
stream_idle_timeout = "4h0m0s"
|
stream_idle_timeout = "4h0m0s"
|
||||||
enable_selinux = false
|
enable_selinux = false
|
||||||
selinux_category_range = 1024
|
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
|
stats_collect_period = 10
|
||||||
# systemd_cgroup = false
|
# systemd_cgroup = false
|
||||||
enable_tls_streaming = false
|
enable_tls_streaming = false
|
||||||
@@ -377,7 +379,7 @@ $ kubectl get node -o yaml | grep CIDR
|
|||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```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
|
## master 节点默认不能运行 pod
|
||||||
|
|||||||
@@ -57,15 +57,15 @@ docker.io/library/centos:latest
|
|||||||
以下命令中的 `username` 请替换为你的 Docker 账号用户名。
|
以下命令中的 `username` 请替换为你的 Docker 账号用户名。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker tag ubuntu:18.04 username/ubuntu:18.04
|
$ docker tag ubuntu:24.04 username/ubuntu:24.04
|
||||||
|
|
||||||
$ docker image ls
|
$ docker image ls
|
||||||
|
|
||||||
REPOSITORY TAG IMAGE ID CREATED SIZE
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||||
ubuntu 18.04 275d79972a86 6 days ago 94.6MB
|
ubuntu 24.04 5a81c4b8502e 6 days ago 78.3MB
|
||||||
username/ubuntu 18.04 275d79972a86 6 days ago 94.6MB
|
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
|
$ docker search username
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
```
|
||||||
|
|
||||||
|
## 本章内容
|
||||||
|
|
||||||
|
本章将详细介绍各安全机制的原理和配置方法。
|
||||||
|
|||||||
@@ -2,4 +2,6 @@
|
|||||||
|
|
||||||
Docker 1.12 [Swarm mode](https://docs.docker.com/engine/swarm/) 已经内嵌入 Docker 引擎,成为了 docker 子命令 `docker swarm`。请注意与旧的 `Docker Swarm` 区分开来。
|
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),它拥有更丰富的生态系统和更强大的扩展能力。
|
||||||
|
|||||||
@@ -1,11 +1,51 @@
|
|||||||
# 基本架构
|
# 基本架构
|
||||||
|
|
||||||
Docker 采用了 `C/S` 架构,包括客户端和服务端。Docker 守护进程 (`Daemon`)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。
|
Docker 采用了 `C/S`(客户端/服务端)架构,包括客户端和服务端。Docker 守护进程(`Daemon`)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。
|
||||||
|
|
||||||
客户端和服务端既可以运行在一个机器上,也可通过 `socket` 或者 `RESTful API` 来进行通信。
|
客户端和服务端既可以运行在一个机器上,也可通过 `socket` 或者 `RESTful API` 来进行通信。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
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 守护进程交互。
|
||||||
|
|||||||
Reference in New Issue
Block a user