mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 20:31:18 +00:00
Compare commits
8 Commits
v1.4.0
...
02898e346c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02898e346c | ||
|
|
7d8d7e63f4 | ||
|
|
cc6510d0b2 | ||
|
|
306a205314 | ||
|
|
5eed72afa0 | ||
|
|
6bba22679b | ||
|
|
24eb615f54 | ||
|
|
43e12058eb |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -11,3 +11,7 @@ node_modules/
|
||||
package-lock.json
|
||||
|
||||
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 Compose v2
|
||||
* Docker Hub 自动构建转为付费功能
|
||||
|
||||
89
README.md
89
README.md
@@ -1,62 +1,69 @@
|
||||
# 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**
|
||||
|
||||
| 语言 | - |
|
||||
| :----------------------------------------------- | :------------------------------------------------- |
|
||||
| [简体中文](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 章介绍了容器生态中的几个核心项目;13、14 章讨论了关于 Docker 安全和实现技术等高级话题。后续章节则分别介绍包括 Etcd、Fedora CoreOS、Kubernetes、容器云等相关热门开源项目。最后,还展示了使用容器技术的典型的应用场景和实践案例。
|
||||
本书既适用于具备基础 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 章介绍 Kubernetes、Etcd 等容器生态核心项目。
|
||||
* **安全实现**:13、14 章深入讨论 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>
|
||||
#### 方式 1:Docker 镜像(推荐)
|
||||
无需安装任何依赖,一条命令即可启动。
|
||||
|
||||
<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)
|
||||
|
||||
## 鼓励项目
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
应该保证在一个容器中只运行一个进程。将多个应用解耦到不同容器中,保证了容器的横向扩展和复用。例如 web 应用应该包含三个容器:web应用、数据库、缓存。
|
||||
|
||||
如果容器互相依赖,你可以使用 [Docker 自定义网络](../network/linking.md) 来把这些容器连接起来。
|
||||
如果容器互相依赖,你可以使用 [Docker 自定义网络](../network/README.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 官方镜像**已停止更新**且存在未修复的安全漏洞。
|
||||
>
|
||||
> 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
|
||||
|
||||
@@ -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` 环境变量启用。
|
||||
|
||||
## 官方文档
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: '3'
|
||||
|
||||
|
||||
services:
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
我们通过使用 `Docker Compose` 来启动 `Drone`,编写 `docker-compose.yml` 文件。
|
||||
|
||||
```yaml
|
||||
version: '3'
|
||||
|
||||
|
||||
services:
|
||||
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ $ docker compose kill -s SIGINT
|
||||
|
||||
格式为 `docker compose logs [options] [SERVICE...]`。
|
||||
|
||||
查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 `--no-color` 来关闭颜色。
|
||||
查看服务容器的输出。默认情况下,docker compose 将对不同的服务输出使用不同的颜色来区分。可以通过 `--no-color` 来关闭颜色。
|
||||
|
||||
该命令在调试问题的时候十分有用。
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM python:3.6-alpine
|
||||
FROM python:3.12-alpine
|
||||
ADD . /code
|
||||
WORKDIR /code
|
||||
RUN pip install redis flask
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
|
||||
web:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
|
||||
db:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
|
||||
db:
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
## 卸载
|
||||
|
||||
@@ -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` 来进行编排管理。
|
||||
|
||||
@@ -30,7 +30,7 @@ gem 'rails', '4.0.2'
|
||||
最后,`docker-compose.yml` 文件才是最神奇的地方。 `docker-compose.yml` 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、每个镜像的来源(数据库运行在使用预定义的 PostgreSQL 镜像,web 应用侧将从本地目录创建)、镜像之间的连接,以及服务开放的端口。
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
|
||||
db:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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` 命令。
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
|
||||
@@ -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:/#
|
||||
```
|
||||
|
||||
|
||||
@@ -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` 命令来重新启动。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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`:
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
这样可以更高效地利用缓存,加速构建过程。
|
||||
|
||||
@@ -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/*
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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
|
||||
$ 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/):
|
||||
|
||||
@@ -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` 仅包含部分官方镜像,可以满足初学者的使用。
|
||||
|
||||
|
||||
@@ -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 版本。
|
||||
|
||||
|
||||
BIN
introduction/_images/docker-on-linux.png
Normal file
BIN
introduction/_images/docker-on-linux.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
@@ -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)。
|
||||
|
||||

|
||||

|
||||
|
||||
> `runc` 是一个 Linux 命令行工具,用于根据 [OCI容器运行时规范](https://github.com/opencontainers/runtime-spec) 创建和运行容器。
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
当创建一个 Docker 容器的时候,同时会创建了一对 `veth pair` 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 `eth0`;另一端在本地并被挂载到 `docker0` 网桥,名称以 `veth` 开头(例如 `vethAQI2QT`)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
|
||||
|
||||

|
||||
|
||||
|
||||
## 用户自定义网络
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: '3'
|
||||
|
||||
|
||||
services:
|
||||
registry:
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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` 区分开来。
|
||||
|
||||
`Swarm mode` 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 `Swarm` 集群具备与 Mesos、Kubernetes 竞争的实力。
|
||||
`Swarm mode` 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。
|
||||
|
||||
> **定位说明**:Swarm mode 适合小型团队和简单的容器编排场景,具有学习成本低、配置简单的优势。对于大规模生产部署、复杂的微服务架构,建议使用 [Kubernetes](../kubernetes/README.md),它拥有更丰富的生态系统和更强大的扩展能力。
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version: "3"
|
||||
|
||||
|
||||
services:
|
||||
wordpress:
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
|
||||
使用 `Swarm` 集群之前需要了解以下几个概念。
|
||||
|
||||
> [!NOTE]
|
||||
> 虽然 Swarm 是 Docker 引擎内置的集群管理工具,但在大规模生产环境中,Kubernetes 已经成为容器编排的事实标准。如果您主要是为了学习容器编排,建议重点关注 Kubernetes 章节。
|
||||
|
||||
## 节点
|
||||
|
||||
运行 Docker 的主机可以主动初始化一个 `Swarm` 集群或者加入一个已存在的 `Swarm` 集群,这样这个运行 Docker 的主机就成为一个 `Swarm` 集群的节点 (`node`) 。
|
||||
|
||||
@@ -1,11 +1,51 @@
|
||||
# 基本架构
|
||||
|
||||
Docker 采用了 `C/S` 架构,包括客户端和服务端。Docker 守护进程 (`Daemon`)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。
|
||||
Docker 采用了 `C/S`(客户端/服务端)架构,包括客户端和服务端。Docker 守护进程(`Daemon`)作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。
|
||||
|
||||
客户端和服务端既可以运行在一个机器上,也可通过 `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