8 Commits

Author SHA1 Message Date
Baohua Yang
02898e346c Update to latest 2026-01-25 17:46:02 -08:00
Baohua Yang
7d8d7e63f4 Fix coding lang 2026-01-25 17:26:05 -08:00
Baohua Yang
cc6510d0b2 fix: resolve content issues found in user review
- fix(install): correct Docker version in macOS guide
- fix(intro): localize external image to prevent link rot
- doc(swarm): add context note about Kubernetes supremacy
- fix(network): remove broken missing image reference
2026-01-24 19:45:22 -08:00
Baohua Yang
306a205314 Update local serve using honkit 2026-01-22 09:01:49 -08:00
Baohua Yang
5eed72afa0 Fix missing files 2026-01-21 11:31:23 -08:00
Baohua Yang
6bba22679b Use latest tools 2026-01-12 09:33:56 -08:00
Baohua Yang
24eb615f54 Use latest version tools 2026-01-12 09:02:39 -08:00
Baohua Yang
43e12058eb Update tools to latest version 2026-01-11 10:05:49 -08:00
48 changed files with 337 additions and 176 deletions

4
.gitignore vendored
View File

@@ -11,3 +11,7 @@ node_modules/
package-lock.json
docker-compose.override.yml
# Editor configs
.obsidian/
.vscode/

View File

@@ -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 ScoutDocker Init 相关内容
* 更新镜像加速器配置
* 添加 CentOS EOL 警告推荐使用 Rocky Linux/AlmaLinux
* 扩充安全章节和底层架构章节内容
* 1.3.0 2021-12-31
* 全面支持 Docker v20.10 新版本
* 新增 Docker Compose v2
* Docker Hub 自动构建转为付费功能

View File

@@ -1,62 +1,69 @@
# 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**
| 语言 | - |
| :----------------------------------------------- | :------------------------------------------------- |
| [简体中文](https://github.com/yeasy/docker_practice) | [阅读](https://vuepress.mirror.docker-practice.com/) |
**v1.4.3**
[Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker可以让应用的部署、测试和分发都变得前所未有的高效和轻松
无论是应用开发者运维人员还是其他信息技术从业人员都有必要认识和掌握 Docker节约有限的生命
本书既适用于具备基础 Linux 知识的 Docker 初学者也希望可供理解原理和实现的高级用户参考同时书中给出的实践案例可供在进行实际部署时借鉴前六章为基础内容供用户理解 Docker 的基本概念和操作7 ~ 9 章介绍包括数据管理网络等高级操作 10 ~ 12 章介绍了容器生态中的几个核心项目1314 章讨论了关于 Docker 安全和实现技术等高级话题后续章节则分别介绍包括 EtcdFedora CoreOSKubernetes容器云等相关热门开源项目最后还展示了使用容器技术的典型的应用场景和实践案例
本书既适用于具备基础 Linux 知识的 Docker 初学者也希望可供理解原理和实现的高级用户参考同时书中给出的实践案例可供在进行实际部署时借鉴
* 在线阅读[docker-practice.com](https://vuepress.mirror.docker-practice.com/)[GitBook](https://yeasy.gitbook.io/docker_practice/)[Github](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)
* 离线阅读[`$ docker run -it --rm -p 4000:80 ccr.ccs.tencentyun.com/dockerpracticesig/docker_practice:vuepress`](https://github.com/yeasy/docker_practice/wiki/%E7%A6%BB%E7%BA%BF%E9%98%85%E8%AF%BB%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3)
## 内容特色
Docker 自身仍在快速发展中生态环境也在蓬勃成长建议初学者使用最新稳定版本的 Docker 进行学习实践欢迎 [参与项目维护](CONTRIBUTING.md)
* **系统全面**前六章为基础内容帮助深入理解 Docker 的基本概念镜像容器仓库和核心操作
* **进阶实战**7 ~ 9 章涵盖数据管理网络配置Dockerfile 最佳实践等高级操作
* **生态深度**10 ~ 12 章介绍 KubernetesEtcd 等容器生态核心项目
* **安全实现**1314 章深入讨论 Docker 安全机制与底层实现技术
* **广泛扩展**涵盖 Fedora CoreOS容器云等热门开源项目并展示典型的应用场景和实践案例
* [修订记录](CHANGELOG.md)
* [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)
## 阅读方式
<!--
## 微信小程序
### 在线阅读
> 推荐访问官方 GitBook体验最佳
<p align="center">
<img width="200" src="https://docker_practice.gitee.io/pic/dp-wechat-miniprogram.jpg">
</p>
* **GitBook**: [yeasy.gitbook.io/docker_practice](https://yeasy.gitbook.io/docker_practice/)
* **GitHub**: [github.com/yeasy/docker_practice](https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md)
* **Mirror**: [docker-practice.com](https://vuepress.mirror.docker-practice.com/)
<p align="center"><strong>微信扫码 随时随地阅读~</strong></p>
-->
### 本地阅读
## 技术交流
<!--
<p align="center">
<img width="200" src="https://docker_practice.gitee.io/pic/dpsig-wechat.jpg">
</p>
#### 方式 1Docker 镜像推荐
无需安装任何依赖一条命令即可启动
<p align="center"><strong>微信扫码 加入群聊~ 或者微信添加 <code>dpsigs</code> 邀请入群</strong></p>
-->
```bash
docker run -it --rm -p 4000:80 ccr.ccs.tencentyun.com/dockerpracticesig/docker_practice:vuepress
```
启动后访问 [http://localhost:4000](http://localhost:4000)。
[详情参考](https://github.com/yeasy/docker_practice/wiki/%E7%A6%BB%E7%BA%BF%E9%98%85%E8%AF%BB%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3)
欢迎加入 Docker 技术交流 QQ 分享 Docker 资源交流 Docker 技术
#### 方式 2本地构建HonKit
适合想要修改内容或深度定制的读者需要安装 Node.js 环境
* QQ I 已满341410255
* QQ II 已满419042067
* QQ III 已满210028779
* QQ IV 已满483702734
* QQ V 已满460598761
* QQ VI 已满581983671
* QQ VII 已满252403484
* QQ VIII已满544818750
* QQ IX 已满571502246
* QQ X 已满145983035
```bash
npm install
npx honkit serve
```
启动后访问 [http://localhost:4000](http://localhost:4000)。
建议前往 [Github Discussions](https://github.com/yeasy/docker_practice/discussions) 进行技术交流
## 社区交流
>如果有容器技术相关的疑问请通过 [Issues](https://github.com/yeasy/docker_practice/issues/new/choose) 来提出
欢迎加入 Docker 技术交流群分享 Docker 资源交流 Docker 技术
* **GitHub Discussions**[点击前往](https://github.com/yeasy/docker_practice/discussions)(技术问答、交流)
* **GitHub Issues**[提交 Bug](https://github.com/yeasy/docker_practice/issues/new/choose)(内容错误、建议)
> **交流 QQ **部分已满建议优先使用 GitHub Discussions
> * 341410255 (I), 419042067 (II), 210028779 (III), 483702734 (IV), 460598761 (V)
> * 581983671 (VI), 252403484 (VII), 544818750 (VIII), 571502246 (IX), 145983035 (X)
## 参与贡献
欢迎 [参与项目维护](CONTRIBUTING.md)
* [修订记录](CHANGELOG.md)
* [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)
## 进阶学习
@@ -64,8 +71,8 @@ Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初
[Docker 技术入门与实战][1]已更新到第 4 讲解最新容器技术栈知识欢迎大家阅读并反馈建议
* [京东图书][1]
* [天猫图书](https://detail.tmall.com/item.htm?id=997383773726&skuId=6143496614475)
* [京东图书][1]
* [天猫图书](https://detail.tmall.com/item.htm?id=997383773726&skuId=6143496614475)
## 鼓励项目

View File

@@ -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)

View File

@@ -24,7 +24,7 @@
应该保证在一个容器中只运行一个进程将多个应用解耦到不同容器中保证了容器的横向扩展和复用例如 web 应用应该包含三个容器web应用数据库缓存
如果容器互相依赖你可以使用 [Docker 自定义网络](../network/linking.md) 来把这些容器连接起来
如果容器互相依赖你可以使用 [Docker 自定义网络](../network/README.md) 来把这些容器连接起来
### 镜像层数尽可能少

View File

@@ -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 日停止维护EOLCentOS 7 也已于 2024 6 30 **完全结束支持**Docker Hub 上的 CentOS 官方镜像**已停止更新**且存在未修复的安全漏洞
>
> 2026 年了对于任何新项目**强烈建议**使用以下生产级替代方案
> - [Rocky Linux](https://hub.docker.com/_/rockylinux)CentOS 原创始人发起的社区驱动项目,目前主流为 Rocky Linux 9。
> - [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 9 替代**推荐**
```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

View File

@@ -2,13 +2,21 @@
**BuildKit** 是下一代的镜像构建组件 https://github.com/moby/buildkit 开源。
**注意如果您的镜像构建使用的是云服务商提供的镜像构建服务腾讯云容器服务阿里云容器服务等由于上述服务提供商的 Docker 版本低于 18.09BuildKit 无法使用将造成镜像构建失败建议使用 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` 环境变量
## 官方文档

View File

@@ -1,4 +1,4 @@
version: '3'
services:

View File

@@ -25,7 +25,7 @@
我们通过使用 `Docker Compose` 来启动 `Drone`编写 `docker-compose.yml` 文件
```yaml
version: '3'
services:

View File

@@ -32,25 +32,23 @@ Debian GNU/Linux 8
### 使用 Ubuntu 官方镜像
下面以 `ubuntu:18.04` 为例演示如何使用该镜像安装一些常用软件
下面以 `ubuntu:24.04` 为例演示如何使用该镜像安装一些常用软件
首先使用 `-ti` 参数启动容器登录 `bash`查看 `ubuntu` 的发行版本号
```bash
$ docker run -ti ubuntu:18.04 /bin/bash
$ docker run -ti ubuntu:24.04 /bin/bash
root@7d93de07bf76:/# cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04 LTS"
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
VERSION_ID="24.04"
VERSION="24.04 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
```
当试图直接使用 `apt-get` 安装一个软件的时候会提示 `E: Unable to locate package`
@@ -58,7 +56,7 @@ UBUNTU_CODENAME=bionic
```bash
root@7d93de07bf76:/# apt-get install curl
Reading package lists... Done
Building dependency tree
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package curl
```
@@ -67,25 +65,10 @@ E: Unable to locate package curl
```bash
root@7d93de07bf76:/# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [7348 B]
Get:4 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [823 kB]
Get:5 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:6 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]
Get:8 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [31.0 kB]
Get:9 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [835 kB]
Get:10 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]
Get:11 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]
Get:12 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]
Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [1127 kB]
Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1350 kB]
Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [11.4 kB]
Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [44.7 kB]
Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [2496 B]
Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [4252 B]
Fetched 17.6 MB in 1min 25s (207 kB/s)
Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
...
Fetched 25.8 MB in 8s (3215 kB/s)
Reading package lists... Done
```

View File

@@ -78,7 +78,7 @@ $ docker compose kill -s SIGINT
格式为 `docker compose logs [options] [SERVICE...]`
查看服务容器的输出默认情况下docker-compose 将对不同的服务输出使用不同的颜色来区分可以通过 `--no-color` 来关闭颜色
查看服务容器的输出默认情况下docker compose 将对不同的服务输出使用不同的颜色来区分可以通过 `--no-color` 来关闭颜色
该命令在调试问题的时候十分有用

View File

@@ -5,7 +5,7 @@
默认的模板文件名称为 `docker-compose.yml`格式为 YAML 格式
```yaml
version: "3" # 在 Compose V2 中version 字段已成为可选,且推荐不再使用。
services:
webapp:
@@ -27,7 +27,7 @@ services:
指定 `Dockerfile` 所在文件夹的路径可以是绝对路径或者相对 docker-compose.yml 文件的路径 `Compose` 将会利用它自动构建这个镜像然后使用这个镜像
```yaml
version: '3'
services:
webapp:
@@ -41,7 +41,7 @@ services:
使用 `arg` 指令指定构建镜像时的变量
```yaml
version: '3'
services:
webapp:
@@ -130,7 +130,7 @@ devices:
解决容器的依赖启动先后的问题以下例子中会先启动 `redis` `db` 再启动 `web`
```yaml
version: '3'
services:
web:
@@ -352,7 +352,7 @@ network_mode: "container:[container name/id]"
配置容器连接的网络
```yaml
version: "3"
services:
some-service:
@@ -394,7 +394,7 @@ ports:
存储敏感数据例如 `mysql` 服务密码
```yaml
version: "3.1"
services:
mysql:
@@ -474,7 +474,7 @@ volumes:
如果路径为数据卷名称必须在文件中配置数据卷
```yaml
version: "3"
services:
my_src:
@@ -553,7 +553,7 @@ Compose 模板文件支持动态读取主机的系统环境变量和当前目录
例如下面的 Compose 文件将从运行它的环境中读取变量 `${MONGO_VERSION}` 的值并写入执行的指令中
```yaml
version: "3"
services:
db:

View File

@@ -1,4 +1,4 @@
FROM python:3.6-alpine
FROM python:3.12-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask

View File

@@ -1,4 +1,4 @@
version: '3'
services:
web:

View File

@@ -1,4 +1,4 @@
version: "3"
services:
db:

View File

@@ -1,4 +1,4 @@
version: "3"
services:
db:

View File

@@ -23,14 +23,14 @@ COPY . /code/
第二步 `requirements.txt` 文件里面写明需要安装的具体依赖包名
```bash
Django>=2.0,<3.0
psycopg2>=2.7,<3.0
Django>=4.0,<5.0
psycopg2-binary>=2.9,<3.0
```
第三步`docker-compose.yml` 文件将把所有的东西关联起来它描述了应用的构成一个 web 服务和一个数据库使用的 Docker 镜像镜像之间的连接挂载到容器的卷以及服务开放的端口
```yaml
version: "3"
services:
db:
@@ -105,8 +105,8 @@ web_1 | Performing system checks...
web_1 |
web_1 | System check identified no issues (0 silenced).
web_1 |
web_1 | November 23, 2017 - 06:21:19
web_1 | Django version 1.11.7, using settings 'django_example.settings'
web_1 | November 23, 2024 - 06:21:19
web_1 | Django version 4.2, using settings 'django_example.settings'
web_1 | Starting development server at http://0.0.0.0:8000/
web_1 | Quit the server with CONTROL-C.
```
@@ -116,5 +116,5 @@ web_1 | Quit the server with CONTROL-C.
你还可以在 Docker 上运行其它的管理命令例如对于同步数据库结构这种事在运行完 `docker compose up` 在另外一个终端进入文件夹运行以下命令即可
```bash
$ docker compose run web python manage.py syncdb
$ docker compose run web python manage.py migrate
```

View File

@@ -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
```
## 卸载

View File

@@ -10,6 +10,14 @@
`Compose` 恰好满足了这样的需求它允许用户通过一个单独的 `docker-compose.yml` 模板文件YAML 格式来定义一组相关联的应用容器为一个项目project
## 模板文件规范
Compose 模板文件采用 YAML 格式扩展名为 `.yml` `.yaml`
> **注意** Compose V2 `version` 字段已不再强制要求 Docker Compose v5 规范已完全不需要顶层 `version` 字段为了保持最佳兼容性建议不在新文件中使用该字段
Docker Compose 默认使用 `docker-compose.yml` 作为模板文件
`Compose` 中有两个重要的概念
* 服务 (`service`)一个应用的容器实际上可以包括若干运行相同镜像的容器实例
@@ -18,4 +26,8 @@
`Compose` 的默认管理对象是项目通过子命令对项目中的一组容器进行便捷地生命周期管理
`Compose` 项目由 Python 编写实现上调用了 Docker 服务提供的 API 来对容器进行管理因此只要所操作的平台支持 Docker API就可以在其上利用 `Compose` 来进行编排管理
`Compose` 项目早期 Python 编写称为 Docker Compose V1
现在的 Docker Compose V2 是一个 Go 语言编写的 Docker CLI 插件已经集成到 Docker Desktop Docker Engine 直接通过 `docker compose` 命令使用它提供了更快的性能和更好的集成体验
只要所操作的平台支持 Docker API就可以在其上利用 `Compose` 来进行编排管理

View File

@@ -30,7 +30,7 @@ gem 'rails', '4.0.2'
最后`docker-compose.yml` 文件才是最神奇的地方 `docker-compose.yml` 文件将把所有的东西关联起来它描述了应用的构成一个 web 服务和一个数据库每个镜像的来源数据库运行在使用预定义的 PostgreSQL 镜像web 应用侧将从本地目录创建镜像之间的连接以及服务开放的端口
```yaml
version: "3"
services:
db:

View File

@@ -41,7 +41,7 @@ if __name__ == "__main__":
编写 `Dockerfile` 文件内容为
```docker
FROM python:3.6-alpine
FROM python:3.12-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
@@ -53,7 +53,7 @@ CMD ["python", "app.py"]
编写 `docker-compose.yml` 文件这个是 Compose 使用的主模板文件
```yaml
version: '3'
services:
web:

View File

@@ -13,7 +13,7 @@
[`docker-compose.yml`](https://github.com/yeasy/docker_practice/blob/master/compose/demo/wordpress/docker-compose.yml) 文件将开启一个 `wordpress` 服务和一个独立的 `MySQL` 实例:
```yaml
version: "3"
services:
db:

View File

@@ -7,7 +7,7 @@
如果不使用 `-d` 参数运行容器
```bash
$ docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
$ docker run ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
@@ -19,7 +19,7 @@ hello world
如果使用了 `-d` 参数运行容器
```bash
$ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
$ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
```
@@ -32,7 +32,7 @@ $ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep
```
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77b2dc01fe0f ubuntu:18.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright
77b2dc01fe0f ubuntu:24.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright
```
要获取容器的输出信息可以通过 `docker container logs` 命令

View File

@@ -6,7 +6,7 @@
```bash
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:18.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
7691a814370e ubuntu:24.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ docker export 7691a814370e > ubuntu.tar
```

View File

@@ -11,7 +11,7 @@
例如下面的命令输出一个 Hello World之后终止容器
```bash
$ docker run ubuntu:18.04 /bin/echo 'Hello world'
$ docker run ubuntu:24.04 /bin/echo 'Hello world'
Hello world
```
@@ -20,7 +20,7 @@ Hello world
下面的命令则启动一个 bash 终端允许用户进行交互
```bash
$ docker run -t -i ubuntu:18.04 /bin/bash
$ docker run -t -i ubuntu:24.04 /bin/bash
root@af8bae53bdd3:/#
```

View File

@@ -11,7 +11,7 @@
```bash
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba267838cc1b ubuntu:18.04 "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton
ba267838cc1b ubuntu:24.04 "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton
```
处于终止状态的容器可以通过 `docker container start` 命令来重新启动

View File

@@ -62,7 +62,7 @@ $ docker inspect web
$ docker run --rm -it \
# -v $HOME/.bash_history:/root/.bash_history \
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
ubuntu:18.04 \
ubuntu:24.04 \
bash
root@2affd44b4667:/# history

View File

@@ -4,6 +4,18 @@
Dockerfile 是一个文本文件其内包含了一条条的 **指令(Instruction)**每一条指令构建一层因此每一条指令的内容就是描述该层应当如何构建
## 使用 docker init 快速创建推荐
Docker 提供了 `docker init` 命令可以根据项目类型自动生成 Dockerfile.dockerignore compose.yaml 文件
```bash
$ docker init
```
该命令会交互式地询问项目类型 GoNode.jsPythonRust 并生成符合最佳实践的配置文件对于新项目这是推荐的起步方式
## 手动创建 Dockerfile
还以之前定制 `nginx` 镜像为例这次我们使用 Dockerfile 来定制
在一个空白目录中建立一个文本文件并命名为 `Dockerfile`

View File

@@ -34,3 +34,13 @@ COPY --chown=10:11 files* /mydir/
```
如果源路径为文件夹复制的时候不是直接复制该文件夹而是将文件夹中的内容复制到目标路径
## 使用 `--link` 优化多阶段构建
BuildKit 可以使用 `--link` 选项来优化多阶段构建的性能使用 `--link` 文件会以独立层的形式添加无需依赖前序指令的结果
```docker
COPY --link --from=builder /app/dist /usr/share/nginx/html
```
这样可以更高效地利用缓存加速构建过程

View File

@@ -17,7 +17,7 @@
假设我们需要一个得知自己当前公网 IP 的镜像那么可以先用 `CMD` 来实现
```docker
FROM ubuntu:18.04
FROM ubuntu:24.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
@@ -49,7 +49,7 @@ $ docker run myip curl -s http://myip.ipip.net -i
这显然不是很好的解决方案而使用 `ENTRYPOINT` 就可以解决这个问题现在我们重新用 `ENTRYPOINT` 来实现这个镜像
```docker
FROM ubuntu:18.04
FROM ubuntu:24.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*

View File

@@ -15,11 +15,11 @@ ubuntu bionic 329ed837d508 3 days ago
列表包含了 `仓库名``标签``镜像 ID``创建时间` 以及 `所占用的空间`
其中仓库名标签在之前的基础概念章节已经介绍过了**镜像 ID** 则是镜像的唯一标识一个镜像可以对应多个 **标签**因此在上面的例子中我们可以看到 `ubuntu:18.04` `ubuntu:bionic` 拥有相同的 ID因为它们对应的是同一个镜像
其中仓库名标签在之前的基础概念章节已经介绍过了**镜像 ID** 则是镜像的唯一标识一个镜像可以对应多个 **标签**因此在上面的例子中我们可以看到 `ubuntu:24.04` `ubuntu:noble` 拥有相同的 ID因为它们对应的是同一个镜像
## 镜像体积
如果仔细观察会注意到这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同比如`ubuntu:18.04` 镜像大小在这里是 `63.3MB`但是在 [Docker Hub](https://hub.docker.com/layers/ubuntu/library/ubuntu/bionic/images/sha256-32776cc92b5810ce72e77aca1d949de1f348e1d281d3f00ebcc22a3adcdc9f42?context=explore) 显示的却是 `25.47 MB`。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 `docker image ls` 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。
如果仔细观察会注意到这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同比如`ubuntu:24.04` 镜像大小在这里是 `78MB`但是在 [Docker Hub](https://hub.docker.com/_/ubuntu) 显示的却是 `29MB`。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 `docker image ls` 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。
另外一个需要注意的问题是`docker image ls` 列表中的镜像体积总和并非是所有镜像实际硬盘消耗由于 Docker 镜像是多层存储结构并且可以继承复用因此不同镜像可能会因为使用相同的基础镜像从而拥有共同的层由于 Docker 使用 Union FS相同的层只需要保存一份即可因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多
@@ -83,7 +83,7 @@ ubuntu bionic 329ed837d508 3 days ago
列出特定的某个镜像也就是说指定仓库名和标签
```bash
$ docker image ls ubuntu:18.04
$ docker image ls ubuntu:24.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 329ed837d508 3 days ago 63.3MB
```

View File

@@ -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/9StreamRocky Linux 8/9AlmaLinux 8/9并且要求内核版本不低于 3.10CentOS 7 满足最低内核的要求但由于内核版本比较低部分功能 `overlay2` 存储层驱动无法使用并且部分功能可能不太稳定
对于 Rocky LinuxAlmaLinux CentOS Stream推荐使用 `dnf` 包管理器
### 卸载旧版本

View File

@@ -42,7 +42,7 @@ $ brew install --cask docker
```bash
$ docker --version
Docker version 27.2.1, build 9e34c9b
Docker version 26.1.1, build 4cf5afa
```
如果 `docker version``docker info` 都正常的话可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/)

View File

@@ -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` 仅包含部分官方镜像可以满足初学者的使用

View File

@@ -6,12 +6,13 @@
### 系统要求
Docker 支持诸多版本的 [Ubuntu](https://ubuntu.com/server) 操作系统。但是较旧的版本上将不会有Docker新版本的持续更新以截至2024年中的几个 Ubuntu LTSLong Term Support长期支持版本为例
Docker 支持诸多版本的 [Ubuntu](https://ubuntu.com/server) 操作系统。但是较旧的版本上将不会有 Docker 新版本的持续更新,以截至 2026 年初的几个 Ubuntu LTSLong 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 支持 amd64arm64armhfppc64els390x 5 个平台而非 LTS 版本支持的平台通常较少同时LTS 版本会获得 5 年的升级维护支持这样的系统会获得更长期的安全保障因此在生产环境中推荐使用 LTS 版本

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

View File

@@ -2,11 +2,11 @@
**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 架构](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/media/docker-on-linux.png)
![Docker 架构](./_images/docker-on-linux.png)
> `runc` 是一个 Linux 命令行工具用于根据 [OCI容器运行时规范](https://github.com/opencontainers/runtime-spec) 创建和运行容器。

View File

@@ -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

View File

@@ -6,7 +6,7 @@
当创建一个 Docker 容器的时候同时会创建了一对 `veth pair` 接口当数据包发送到一个接口时另外一个接口也可以收到相同的数据包这对接口一端在容器内 `eth0`另一端在本地并被挂载到 `docker0` 网桥名称以 `veth` 开头例如 `vethAQI2QT`通过这种方式主机可以跟容器通信容器之间也可以相互通信Docker 就创建了在主机和所有容器之间一个虚拟共享网络
![Docker 网络](./_images/network.png)
## 用户自定义网络

View File

@@ -27,7 +27,7 @@ tmpfs on /etc/resolv.conf type tmpfs ...
这样每次启动的容器 DNS 自动配置为 `114.114.114.114` `8.8.8.8`使用以下命令来证明其已经生效
```bash
$ docker run -it --rm ubuntu:18.04 cat etc/resolv.conf
$ docker run -it --rm ubuntu:24.04 cat etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8

View File

@@ -1,4 +1,4 @@
version: '3'
services:
registry:

View File

@@ -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

View File

@@ -87,7 +87,6 @@ $ openssl x509 -req -days 750 -in "site.csr" -sha256 \
私有仓库默认的配置文件位于 `/etc/docker/registry/config.yml`我们先在本地编辑 `config.yml`之后挂载到容器中
```yaml
version: 0.1
log:
accesslog:
disabled: true
@@ -140,7 +139,7 @@ $ docker run --rm \
## 编辑 `docker-compose.yml`
```yaml
version: '3'
services:
registry:
@@ -190,15 +189,15 @@ $ docker login docker.domain.com
尝试推送拉取镜像
```bash
$ docker pull ubuntu:18.04
$ docker pull ubuntu:24.04
$ docker tag ubuntu:18.04 docker.domain.com/username/ubuntu:18.04
$ docker tag ubuntu:24.04 docker.domain.com/username/ubuntu:24.04
$ docker push docker.domain.com/username/ubuntu:18.04
$ docker push docker.domain.com/username/ubuntu:24.04
$ docker image rm docker.domain.com/username/ubuntu:18.04
$ docker image rm docker.domain.com/username/ubuntu:24.04
$ docker pull docker.domain.com/username/ubuntu:18.04
$ docker pull docker.domain.com/username/ubuntu:24.04
```
如果我们退出登录尝试推送镜像
@@ -206,7 +205,7 @@ $ docker pull docker.domain.com/username/ubuntu:18.04
```bash
$ docker logout docker.domain.com
$ docker push docker.domain.com/username/ubuntu:18.04
$ docker push docker.domain.com/username/ubuntu:24.04
no basic auth credentials
```

View File

@@ -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 TrustDCT
启用镜像签名验证确保镜像来源可信
```bash
$ export DOCKER_CONTENT_TRUST=1
$ docker pull myregistry/myimage:latest
```
## 本章内容
本章将详细介绍各安全机制的原理和配置方法

View File

@@ -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` 集群具备与 MesosKubernetes 竞争的实力
`Swarm mode` 内置 kv 存储功能提供了众多的新特性比如具有容错能力的去中心化设计内置服务发现负载均衡路由网格动态伸缩滚动更新安全传输等
> **定位说明**Swarm mode 适合小型团队和简单的容器编排场景具有学习成本低配置简单的优势对于大规模生产部署复杂的微服务架构建议使用 [Kubernetes](../kubernetes/README.md)它拥有更丰富的生态系统和更强大的扩展能力

View File

@@ -1,4 +1,4 @@
version: "3"
services:
wordpress:

View File

@@ -4,6 +4,9 @@
使用 `Swarm` 集群之前需要了解以下几个概念
> [!NOTE]
> 虽然 Swarm Docker 引擎内置的集群管理工具但在大规模生产环境中Kubernetes 已经成为容器编排的事实标准如果您主要是为了学习容器编排建议重点关注 Kubernetes 章节
## 节点
运行 Docker 的主机可以主动初始化一个 `Swarm` 集群或者加入一个已存在的 `Swarm` 集群这样这个运行 Docker 的主机就成为一个 `Swarm` 集群的节点 (`node`)

View File

@@ -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 守护进程交互