19 Commits

Author SHA1 Message Date
Baohua Yang
8bdb8406f9 Fix words 2026-01-10 22:39:51 -08:00
Baohua Yang
e08a34bcdf Merge networks 2026-01-02 16:57:09 -08:00
Baohua Yang
6e6d31d1d6 Merge networks 2026-01-02 16:55:39 -08:00
yeasy
5c3841dc98 GitBook: No commit message 2025-12-17 10:37:56 +00:00
Baohua Yang
61a71f3c25 Comment out unavailable gitee figures 2025-11-24 15:00:01 -08:00
Baohua Yang
39207f57cf Update docker book intro to v4 2025-11-24 13:27:16 -08:00
Baohua Yang
3a9d4bff61 Merge pull request #549 from CNAHYZ/patch-1
Update figure's path
2024-12-25 19:49:09 -08:00
intfoo
4bc29c0300 Update overview.md 修复图片地址问题 2024-12-25 16:20:30 +08:00
Kang Huaishuai
65bc905920 Update registry mirror 2024-11-23 23:23:50 +08:00
Baohua Yang
1b7d941fcd Merge pull request #548 from trevanlye/patch-1
Add go init
2024-11-20 10:17:28 -08:00
Baohua Yang
e0ff3d315a Merge pull request #542 from upbeat-backbone-bose/master
Update django version
2024-11-20 10:16:04 -08:00
trevanlye
09de77b543 Update README.md
we need 'go mod init first' before 'go get'
2024-11-11 11:05:23 +08:00
debian-go
344fc8bd3c Merge branch 'yeasy:master' into master 2024-11-08 11:42:06 +08:00
Baohua Yang
7ec5772432 Merge pull request #546 from liangbinfudan/master
ubuntu.md update #545
2024-09-26 16:38:42 -07:00
Hugo Dock
355dd3b051 Update ubuntu.md
The relationships among Ubuntu LTS versions have been described, and the relevant scripts have been modified slightly
2024-09-19 13:09:38 +08:00
Baohua Yang
ca011164c2 Merge pull request #543 from my-vegetable-has-exploded/debian11
Add suggestion for gpg in debian11
2024-07-30 14:02:19 -07:00
yi wang
0f2956a646 Update debian.md 2024-07-29 22:25:02 +08:00
debian-go
da7991660e Merge pull request #1 from upbeat-backbone-bose/dependabot/pip/compose/demo/django/pip-062e67ef1e
Update django requirement from <3.0,>=2.0 to >=5.0.6,<6.0 in /compose/demo/django in the pip group across 1 directory
2024-07-09 10:26:30 +08:00
dependabot[bot]
391c6364a0 Update django requirement
Updates the requirements on [django](https://github.com/django/django) to permit the latest version.

Updates `django` to 5.0.6
- [Commits](https://github.com/django/django/compare/2.0...5.0.6)

---
updated-dependencies:
- dependency-name: django
  dependency-type: direct:production
  dependency-group: pip
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-09 02:26:13 +00:00
111 changed files with 692 additions and 1393 deletions

BIN
.gitbook/assets/ECS.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
.gitbook/assets/docker.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 660 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

View File

@@ -1,12 +1,12 @@
# 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%20v20.10-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%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]
**v1.3.0**
**v1.4.0**
| 语言 | - |
| :------------- | :--- |
| [简体中文](https://github.com/yeasy/docker_practice) | [阅读](https://vuepress.mirror.docker-practice.com/) |
| 语言 | - |
| :----------------------------------------------- | :------------------------------------------------- |
| [简体中文](https://github.com/yeasy/docker_practice) | [阅读](https://vuepress.mirror.docker-practice.com/) |
[Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker可以让应用的部署、测试和分发都变得前所未有的高效和轻松
@@ -22,6 +22,7 @@ Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初
* [修订记录](CHANGELOG.md)
* [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)
<!--
## 微信小程序
<p align="center">
@@ -29,14 +30,16 @@ Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初
</p>
<p align="center"><strong>微信扫码 随时随地阅读~</strong></p>
-->
## 技术交流
<!--
<p align="center">
<img width="200" src="https://docker_practice.gitee.io/pic/dpsig-wechat.jpg">
</p>
<p align="center"><strong>微信扫码 加入群聊~ 或者微信添加 <code>dpsigs</code> 邀请入群</strong></p>
-->
欢迎加入 Docker 技术交流 QQ 分享 Docker 资源交流 Docker 技术
@@ -49,18 +52,20 @@ Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初
* QQ VII 已满252403484
* QQ VIII已满544818750
* QQ IX 已满571502246
* QQ X 可加145983035
* QQ X 已满145983035
建议前往 [Github Discussions](https://github.com/yeasy/docker_practice/discussions) 进行技术交流。
>如果有容器技术相关的疑问请通过 [Issues](https://github.com/yeasy/docker_practice/issues/new/choose) 来提出。
## 进阶学习
[![](https://github.com/yeasy/docker_practice/raw/master/_images/docker_primer3.png)][1]
[![](https://github.com/yeasy/docker_practice/raw/master/_images/docker_primer4.jpg)][1]
[Docker 技术入门与实战][1]第三版已经面世介绍最新容器技术栈欢迎大家阅读使用并反馈建议
[Docker 技术入门与实战][1]已更新到第 4 讲解最新容器技术栈知识欢迎大家阅读并反馈建议
* [京东图书][1]
* [China-Pub](http://product.china-pub.com/8052127)
* [天猫图书](https://detail.tmall.com/item.htm?id=997383773726&skuId=6143496614475)
## 鼓励项目
@@ -70,4 +75,4 @@ Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初
<p align="center"><strong>欢迎鼓励项目一杯 coffee~</strong></p>
[1]: https://union-click.jd.com/jdc?e=&p=JF8AANADIgZlGF0VAxUDVBJdHDISBFAfWRcCGzcRRANLXSJeEF4aVwkMGQ1eD0kdSVJKSQVJHBIEUB9ZFwIbGAxeB0gyS34PbFlHVHNkI0MQEAoIcSxyBWFLRAtZK1olABYHXR9eHAoQN2UbXCVQfN_jrYOwsw7T_5SOnZUiBmUbXBYBFwBVG14UBBAAZRxbHDJJUjscCEEHEQ4FSA4VBhBQZStrFjIiN1UrWCVAfARQT1gQA0cFAEwOEAcRDlMTDEALQAFTEwwRUhMAUR1cJQATBlES
[1]: https://item.jd.com/10200902362001.html

View File

@@ -6,6 +6,7 @@
* [Docker 简介](introduction/README.md)
* [什么是 Docker](introduction/what.md)
* [为什么要用 Docker](introduction/why.md)
* [基本概念](basic_concept/README.md)
* [镜像](basic_concept/image.md)
* [容器](basic_concept/container.md)
@@ -18,7 +19,7 @@
* [Raspberry Pi](install/raspberry-pi.md)
* [Linux 离线安装](install/offline.md)
* [macOS](install/mac.md)
* [Windows 10](install/windows.md)
* [Windows 10/11](install/windows.md)
* [镜像加速器](install/mirror.md)
* [开启实验特性](install/experimental.md)
* [使用镜像](image/README.md)
@@ -45,7 +46,6 @@
* [参考文档](image/dockerfile/references.md)
* [Dockerfile 多阶段构建](image/multistage-builds/README.md)
* [实战多阶段构建 Laravel 镜像](image/multistage-builds/laravel.md)
* [构建多种系统架构支持的 Docker 镜像](image/manifest.md)
* [其它制作镜像的方式](image/other.md)
* [实现原理](image/internal.md)
* [操作容器](container/README.md)
@@ -63,27 +63,15 @@
* [数据管理](data_management/README.md)
* [数据卷](data_management/volume.md)
* [挂载主机目录](data_management/bind-mounts.md)
* [使用网络](network/README.md)
* [外部访问容器](network/port_mapping.md)
* [容器互联](network/linking.md)
* [网络配置](network/README.md)
* [配置 DNS](network/dns.md)
* [高级网络配置](advanced_network/README.md)
* [快速配置指南](advanced_network/quick_guide.md)
* [容器访问控制](advanced_network/access_control.md)
* [端口映射实现](advanced_network/port_mapping.md)
* [配置 docker0 网桥](advanced_network/docker0.md)
* [自定义网桥](advanced_network/bridge.md)
* [工具和示例](advanced_network/example.md)
* [编辑网络配置文件](advanced_network/config_file.md)
* [配置 HTTP/HTTPS 网络代理](advanced_network/http_https_proxy.md)
* [实例创建一个点到点连接](advanced_network/ptp.md)
* [外部访问容器](network/port_mapping.md)
* [Docker Buildx](buildx/README.md)
* [BuildKit](buildx/buildkit.md)
* [使用 buildx 构建镜像](buildx/buildx.md)
* [使用 buildx 构建多种系统架构支持的 Docker 镜像](buildx/multi-arch-images.md)
* [Docker Compose](compose/README.md)
* [简介](compose/introduction.md)
* [Compose v2](compose/v2.md)
* [安装与卸载](compose/install.md)
* [使用](compose/usage.md)
* [命令说明](compose/commands.md)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

BIN
_images/docker_primer4.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

View File

@@ -1,15 +0,0 @@
# 高级网络配置
>注意本章属于 `Docker` 高级配置如果您是初学者您可以暂时跳过本章节直接学习 [Docker Compose](../compose) 一节
本章将介绍 Docker 的一些高级网络配置和选项
Docker 启动时会自动在主机上创建一个 `docker0` 虚拟网桥实际上是 Linux 的一个 bridge可以理解为一个软件交换机它会在挂载到它的网口之间进行转发
同时Docker 随机分配一个本地未占用的私有网段 [RFC1918](https://datatracker.ietf.org/doc/html/rfc1918) 中定义)中的一个地址给 `docker0` 接口。比如典型的 `172.17.42.1`,掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一个同一网段(`172.17.0.0/16`)的地址。
当创建一个 Docker 容器的时候同时会创建了一对 `veth pair` 接口当数据包发送到一个接口时另外一个接口也可以收到相同的数据包这对接口一端在容器内 `eth0`另一端在本地并被挂载到 `docker0` 网桥名称以 `veth` 开头例如 `vethAQI2QT`通过这种方式主机可以跟容器通信容器之间也可以相互通信Docker 就创建了在主机和所有容器之间一个虚拟共享网络
![Docker 网络](./_images/network.png)
接下来的部分将介绍在一些场景中Docker 所有的网络定制配置以及通过 Linux 命令来调整补充甚至替换 Docker 默认的网络配置

View File

@@ -1,56 +0,0 @@
# 容器访问控制
容器的访问控制主要通过 Linux 上的 `iptables` 防火墙来进行管理和实现`iptables` Linux 上默认的防火墙软件在大部分发行版中都自带
## 容器访问外部网络
容器要想访问外部网络需要本地系统的转发支持在Linux 系统中检查转发是否打开
```bash
$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
```
如果为 0说明没有开启转发则需要手动打开
```bash
$sysctl -w net.ipv4.ip_forward=1
```
如果在启动 Docker 服务的时候设定 `--ip-forward=true`, Docker 就会自动设定系统的 `ip_forward` 参数为 1
## 容器之间访问
容器之间相互访问需要两方面的支持
* 容器的网络拓扑是否已经互联默认情况下所有容器都会被连接到 `docker0` 网桥上
* 本地系统的防火墙软件 -- `iptables` 是否允许通过
### 访问所有端口
当启动 Docker 服务 dockerd的时候默认会添加一条转发策略到本地主机 iptables FORWARD 链上策略为通过`ACCEPT`还是禁止`DROP`取决于配置`--icc=true`缺省值还是 `--icc=false`当然如果手动指定 `--iptables=false` 则不会添加 `iptables` 规则
可见默认情况下不同容器之间是允许网络互通的如果为了安全考虑可以在 `/etc/docker/daemon.json` 文件中配置 `{"icc": false}` 来禁止它
### 访问指定端口
在通过 `-icc=false` 关闭网络访问后还可以通过 `--link=CONTAINER_NAME:ALIAS` 选项来访问容器的开放端口
例如在启动 Docker 服务时可以同时使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问并让 Docker 可以修改系统中的 `iptables` 规则
此时系统中的 `iptables` 规则可能是类似
```bash
$ sudo iptables -nL
...
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0
...
```
之后启动容器`docker run`时使用 `--link=CONTAINER_NAME:ALIAS` 选项Docker 会在 `iptable` 中为 两个容器分别添加一条 `ACCEPT` 规则允许相互访问开放的端口取决于 `Dockerfile` 中的 `EXPOSE` 指令
当添加了 `--link=CONTAINER_NAME:ALIAS` 选项后添加了 `iptables` 规则
```bash
$ sudo iptables -nL
...
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80
ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
DROP all -- 0.0.0.0/0 0.0.0.0/0
```
注意`--link=CONTAINER_NAME:ALIAS` 中的 `CONTAINER_NAME` 目前必须是 Docker 分配的名字或使用 `--name` 参数指定的名字主机名则不会被识别

View File

@@ -1,45 +0,0 @@
# 自定义网桥
除了默认的 `docker0` 网桥用户也可以指定网桥来连接各个容器
在启动 Docker 服务的时候使用 `-b BRIDGE``--bridge=BRIDGE` 来指定使用的网桥
如果服务已经运行那需要先停止服务并删除旧的网桥
```bash
$ sudo systemctl stop docker
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0
```
然后创建一个网桥 `bridge0`
```bash
$ sudo brctl addbr bridge0
$ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up
```
查看确认网桥创建并启动
```bash
$ ip addr show bridge0
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever
```
Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容即可将 Docker 默认桥接到创建的网桥上
```json
{
"bridge": "bridge0",
}
```
启动 Docker 服务
新建一个容器可以看到它已经桥接到了 `bridge0`
可以继续用 `brctl show` 命令查看桥接的信息另外在容器中可以使用 `ip addr` `ip route` 命令来查看 IP 地址配置和路由信息

View File

@@ -1,5 +0,0 @@
# 编辑网络配置文件
Docker 1.2.0 开始支持在运行中的容器里编辑 `/etc/hosts`, `/etc/hostname` `/etc/resolv.conf` 文件
但是这些修改是临时的只在运行的容器中保留容器终止或重启后并不会被保存下来也不会被 `docker commit` 提交

View File

@@ -1,37 +0,0 @@
# 配置 docker0 网桥
Docker 服务默认会创建一个 `docker0` 网桥其上有一个 `docker0` 内部接口它在内核层连通了其他的物理或虚拟网卡这就将所有容器和本地主机都放到同一个物理网络
Docker 默认指定了 `docker0` 接口 IP 地址和子网掩码让主机和容器之间可以通过网桥相互通信它还给出了 MTU接口允许接收的最大传输单元通常是 1500 Bytes或宿主主机网络路由上支持的默认值这些值都可以在服务启动的时候进行配置
* `--bip=CIDR` IP 地址加掩码格式例如 192.168.1.5/24
* `--mtu=BYTES` 覆盖默认的 Docker mtu 配置
也可以在配置文件中配置 DOCKER_OPTS然后重启服务
由于目前 Docker 网桥是 Linux 网桥用户可以使用 `brctl show` 来查看网桥和端口连接信息
```bash
$ sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.3a1d7362b4ee no veth65f9
vethdda6
```
*`brctl` 命令在 DebianUbuntu 中可以使用 `sudo apt-get install bridge-utils` 来安装
每次创建一个新容器的时候Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口使用本地主机上 `docker0` 接口的 IP 作为所有容器的默认网关
```bash
$ sudo docker run -i -t --rm base /bin/bash
$ ip addr show eth0
24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 32:6f:e0:35:57:91 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::306f:e0ff:fe35:5791/64 scope link
valid_lft forever preferred_lft forever
$ ip route
default via 172.17.42.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3
```

View File

@@ -1,9 +0,0 @@
# 工具和示例
在介绍自定义网络拓扑之前你可能会对一些外部工具和例子感兴趣
## pipework
Jérôme Petazzoni 编写了一个叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 脚本,可以帮助用户在比较复杂的场景中完成容器的连接。
## playground
Brandon Rhodes 创建了一个提供完整的 Docker 容器网络拓扑管理的 [Python库](https://github.com/brandon-rhodes/fopnp/tree/m/playground)包括路由、NAT 防火墙;以及一些提供 `HTTP` `SMTP` `POP` `IMAP` `Telnet` `SSH` `FTP` 的服务器。

View File

@@ -1 +0,0 @@

View File

@@ -1,74 +0,0 @@
# 配置 HTTP/HTTPS 网络代理
使用Docker的过程中因为网络原因通常需要使用 HTTP/HTTPS 代理来加速镜像拉取构建和使用下面是常见的三种场景
## dockerd 设置网络代理
"docker pull" 命令是由 dockerd 守护进程执行 dockerd 守护进程是由 systemd 管理因此如果需要在执行 "docker pull" 命令时使用 HTTP/HTTPS 代理需要通过 systemd 配置
- dockerd 创建配置文件夹
```
sudo mkdir -p /etc/systemd/system/docker.service.d
```
- dockerd 创建 HTTP/HTTPS 网络代理的配置文件文件路径是 /etc/systemd/system/docker.service.d/http-proxy.conf 并在该文件中添加相关环境变量
```
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080/"
Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
```
- 刷新配置并重启 docker 服务
```
sudo systemctl daemon-reload
sudo systemctl restart docker
```
## docker 容器设置网络代理
在容器运行阶段如果需要使用 HTTP/HTTPS 代理可以通过更改 docker 客户端配置或者指定环境变量的方式
- 更改 docker 客户端配置创建或更改 ~/.docker/config.json并在该文件中添加相关配置
```
{
"proxies":
{
"default":
{
"httpProxy": "http://proxy.example.com:8080/",
"httpsProxy": "http://proxy.example.com:8080/",
"noProxy": "localhost,127.0.0.1,.example.com"
}
}
}
```
- 指定环境变量运行 "docker run" 命令时指定相关环境变量
| 环境变量 | docker run 示例 |
| -------- | ---------------- |
| HTTP_PROXY | --env HTTP_PROXY="http://proxy.example.com:8080/" |
| HTTPS_PROXY | --env HTTPS_PROXY="http://proxy.example.com:8080/" |
| NO_PROXY | --env NO_PROXY="localhost,127.0.0.1,.example.com" |
## docker build 过程设置网络代理
在容器构建阶段如果需要使用 HTTP/HTTPS 代理可以通过指定 "docker build" 的环境变量或者在 Dockerfile 中指定环境变量的方式
- 使用 "--build-arg" 指定 "docker build" 的相关环境变量
```
docker build \
--build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
--build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" .
```
- Dockerfile 中指定相关环境变量
| 环境变量 | Dockerfile 示例 |
| -------- | ---------------- |
| HTTP_PROXY | ENV HTTP_PROXY="http://proxy.example.com:8080/" |
| HTTPS_PROXY | ENV HTTPS_PROXY="http://proxy.example.com:8080/" |
| NO_PROXY | ENV NO_PROXY="localhost,127.0.0.1,.example.com" |

View File

@@ -1,57 +0,0 @@
# 映射容器端口到宿主主机的实现
默认情况下容器可以主动访问到外部网络的连接但是外部网络无法访问到容器
## 容器访问外部实现
容器所有到外部网络的连接源地址都会被 NAT 成本地系统的 IP 地址这是使用 `iptables` 的源地址伪装操作实现的
查看主机的 NAT 规则
```bash
$ sudo iptables -t nat -nL
...
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
...
```
其中上述规则将所有源地址在 `172.17.0.0/16` 网段目标地址为其他网段外部网络的流量动态伪装为从系统网卡发出MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址
## 外部访问容器实现
容器允许外部访问可以在 `docker run` 时候通过 `-p` `-P` 参数来启用
不管用那种办法其实也是在本地的 `iptable` nat 表中添加相应的规则
使用 `-P`
```bash
$ iptables -t nat -nL
...
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80
```
使用 `-p 80:80`
```bash
$ iptables -t nat -nL
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
```
注意
* 这里的规则映射了 `0.0.0.0`意味着将接受主机来自所有接口的流量用户可以通过 `-p IP:host_port:container_port` `-p IP::port` 来指定允许访问容器的主机上的 IP接口等以制定更严格的规则
* 如果希望永久绑定到某个固定的 IP 地址可以在 Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容
```json
{
"ip": "0.0.0.0"
}
```

View File

@@ -1,45 +0,0 @@
# 示例创建一个点到点连接
默认情况下Docker 会将所有容器连接到由 `docker0` 提供的虚拟子网中
用户有时候需要两个容器之间可以直连通信而不用通过主机网桥进行桥接
解决办法很简单创建一对 `peer` 接口分别放到两个容器中配置成点到点链路类型即可
首先启动 2 个容器
```bash
$ docker run -i -t --rm --net=none base /bin/bash
root@1f1f4c1f931a:/#
$ docker run -i -t --rm --net=none base /bin/bash
root@12e343489d2f:/#
```
找到进程号然后创建网络命名空间的跟踪文件
```bash
$ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
2989
$ docker inspect -f '{{.State.Pid}}' 12e343489d2f
3004
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
$ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
```
创建一对 `peer` 接口然后配置路由
```bash
$ sudo ip link add A type veth peer name B
$ sudo ip link set A netns 2989
$ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
$ sudo ip netns exec 2989 ip link set A up
$ sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A
$ sudo ip link set B netns 3004
$ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
$ sudo ip netns exec 3004 ip link set B up
$ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B
```
现在这 2 个容器就可以相互 ping 并成功建立连接点到点链路不需要子网和子网掩码
此外也可以不指定 `--net=none` 来创建点到点链路这样容器还可以通过原先的网络来通信
利用类似的办法可以创建一个只跟主机通信的容器但是一般情况下更推荐使用 `--icc=false` 来关闭容器之间的通信

View File

@@ -1,26 +0,0 @@
# 快速配置指南
下面是一个跟 Docker 网络相关的命令列表
其中有些命令选项只有在 Docker 服务启动的时候才能配置而且不能马上生效
* `-b BRIDGE` `--bridge=BRIDGE` 指定容器挂载的网桥
* `--bip=CIDR` 定制 docker0 的掩码
* `-H SOCKET...` `--host=SOCKET...` Docker 服务端接收命令的通道
* `--icc=true|false` 是否支持容器之间进行通信
* `--ip-forward=true|false` 请看下文容器之间的通信
* `--iptables=true|false` 是否允许 Docker 添加 iptables 规则
* `--mtu=BYTES` 容器网络中的 MTU
下面2个命令选项既可以在启动服务时指定也可以在启动容器时指定 Docker 服务启动的时候指定则会成为默认值后面执行 `docker run` 时可以覆盖设置的默认值
* `--dns=IP_ADDRESS...` 使用指定的DNS服务器
* `--dns-search=DOMAIN...` 指定DNS搜索域
最后这些选项只有在 `docker run` 执行时使用因为它是针对容器的特性内容
* `-h HOSTNAME` `--hostname=HOSTNAME` 配置容器主机名
* `--link=CONTAINER_NAME:ALIAS` 添加到另一个容器的连接
* `--net=bridge|none|container:NAME_or_ID|host` 配置容器的桥接模式
* `-p SPEC` `--publish=SPEC` 映射容器端口到宿主主机
* `-P or --publish-all=true|false` 映射容器所有端口到宿主主机

View File

@@ -118,7 +118,7 @@ RUN apt-get update && apt-get install -y \
`apt-get update` 放在一条单独的 `RUN` 声明中会导致缓存问题以及后续的 `apt-get install` 失败比如假设你有一个 `Dockerfile` 文件
```docker
FROM ubuntu:18.04
FROM ubuntu:24.04
RUN apt-get update
@@ -128,7 +128,7 @@ RUN apt-get install -y curl
构建镜像后所有的层都在 Docker 的缓存中假设你后来又修改了其中的 `apt-get install` 添加了一个包
```docker
FROM ubuntu:18.04
FROM ubuntu:24.04
RUN apt-get update

View File

@@ -1,4 +1,4 @@
# 客户端命令(docker)
# 客户端命令 - docker
## 客户端命令选项
@@ -63,7 +63,8 @@
* `wait`阻塞直到一个容器终止然后输出它的退出符
## 一张图总结 Docker 的命令
![Docker 命令总结](../_images/cmd_logic.png)
![Docker 命令总结](../../.gitbook/assets/cmd_logic.png)
## 参考

View File

@@ -1,4 +1,4 @@
# 常见问题总结
# 附录一常见问题总结
## 镜像相关
@@ -19,20 +19,15 @@
整体原则上尽量保持镜像功能的明确和内容的精简要点包括
* 尽量选取满足需求但较小的基础系统镜像例如大部分时候可以选择 `alpine` 镜像仅有不足六兆大小
* 清理编译生成文件安装包的缓存等临时文件
* 安装各个软件时候要指定准确的版本号并避免引入不需要的依赖
* 从安全角度考虑应用要尽量使用系统的库和依赖
* 如果安装应用时候需要配置一些特殊的环境变量在安装后要还原不需要保持的变量值
* 使用 Dockerfile 创建镜像时候要添加 .dockerignore 文件或使用干净的工作目录
更多内容请查看 [Dockerfile 最佳实践](../best_practices.md)
### 碰到网络问题无法 pull 镜像命令行指定 http_proxy 无效
### 碰到网络问题无法 pull 镜像命令行指定 http\_proxy 无效
Docker 配置文件中添加 `export http_proxy="http://<PROXY_HOST>:<PROXY_PORT>"`之后重启 Docker 服务即可
@@ -61,6 +56,7 @@ docker inspect --format '{{ .State.Pid }}' <CONTAINER ID or NAME>
### 如何获取某个容器的 IP 地址
可以使用
```bash
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <CONTAINER ID or NAME>
```
@@ -84,16 +80,15 @@ $ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
* 创建镜像时 `Dockerfile` 要通过 `EXPOSE` 指定正确的开放端口
* 容器启动时指定 `PublishAllPort = true`
### 可以在一个容器中同时运行多个应用进程么
一般并不推荐在同一个容器内运行多个应用进程如果有类似需求可以通过一些额外的进程管理机制比如 `supervisord` 来管理所运行的进程可以参考 https://docs.docker.com/config/containers/multi-service_container/ 。
一般并不推荐在同一个容器内运行多个应用进程如果有类似需求可以通过一些额外的进程管理机制比如 `supervisord` 来管理所运行的进程可以参考 https://docs.docker.com/config/containers/multi-service\_container/ 。
### 如何控制容器占用系统资源CPU内存的份额
在使用 `docker create` 命令创建容器或使用 `docker run` 创建并启动容器的时候可以使用 -c|--cpu-shares[=0] 参数来调整容器使用 CPU 的权重使用 -m|--memory[=MEMORY] 参数来调整容器使用内存的大小
在使用 `docker create` 命令创建容器或使用 `docker run` 创建并启动容器的时候可以使用 -c|--cpu-shares\[=0] 参数来调整容器使用 CPU 的权重使用 -m|--memory\[=MEMORY] 参数来调整容器使用内存的大小
## 仓库相关
@@ -109,14 +104,13 @@ $ docker run --network=my-net --ip=172.25.3.3 -itd --name=my-container busybox
使用 `systemd` 的系统 Ubuntu 16.04Centos 的配置文件在 `/etc/docker/daemon.json`
### 如何更改 Docker 的默认存储位置
Docker 的默认存储位置是 `/var/lib/docker`如果希望将 Docker 的本地文件存储到其他分区可以使用 Linux 软连接的方式来完成或者在启动 daemon 时通过 `-g` 参数指定或者修改配置文件 `/etc/docker/daemon.json` "data-root" 可以使用 `docker system info | grep "Root Dir"` 查看当前使用的存储位置
例如如下操作将默认存储位置迁移到 /storage/docker
```sh
```
[root@s26 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 50G 5.3G 42G 12% /
@@ -138,9 +132,7 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
这是因为系统默认没有开启对内存和 swap 使用的统计功能引入该功能会带来性能的下降要开启该功能可以采取如下操作
* 编辑 `/etc/default/grub` 文件Ubuntu 系统为例配置 `GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"`
* 更新 grub`$ sudo update-grub`
* 重启系统即可
## Docker 与虚拟化
@@ -148,6 +140,7 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
### Docker LXCLinux Container有何不同
LXC 利用 Linux 上相关技术实现了容器Docker 则在如下的几个方面进行了改进
* 移植性通过抽象容器配置容器可以实现从一个平台移植到另一个平台
* 镜像系统基于 OverlayFS 的镜像系统为容器的分发带来了很多的便利同时共同的镜像层只需要存储一份实现高效率的存储
* 版本管理类似于Git的版本管理理念用户可以更方便的创建管理镜像文件
@@ -159,7 +152,6 @@ lrwxrwxrwx. 1 root root 15 11月 17 13:43 docker -> /storage/docker
两者的定位完全不同
* Vagrant 类似 Boot2Docker一款运行 Docker 的最小内核是一套虚拟机的管理环境Vagrant 可以在多种系统上和虚拟机软件中运行可以在 WindowsMac 等非 Linux 平台上为 Docker 提供支持自身具有较好的包装性和移植性
* 原生的 Docker 自身只能运行在 Linux 平台上但启动和运行的性能都比虚拟机要快往往更适合快速开发和部署应用的场景
简单说Vagrant 适合用来管理虚拟机 Docker 适合用来管理应用环境

View File

@@ -14,19 +14,29 @@
$ docker run --name mongo -d mongo
```
使用其他应用连接到容器可以用
使用其他应用连接到容器首先创建网络
```bash
$ docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo
$ docker network create my-mongo-net
```
然后启动 MongoDB 容器
```bash
$ docker run --name some-mongo -d --network my-mongo-net mongo
```
最后启动应用容器
```bash
$ docker run --name some-app -d --network my-mongo-net application-that-uses-mongo
```
或者通过 `mongo`
```bash
$ docker run -it --rm \
--link some-mongo:mongo \
--network my-mongo-net \
mongo \
sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
sh -c 'exec mongo "some-mongo:27017/test"'
```
```
## Dockerfile

View File

@@ -16,19 +16,31 @@ $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
之后就可以使用其它应用来连接到该容器
首先创建网络
```bash
$ docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql
$ docker network create my-mysql-net
```
然后启动 MySQL 容器
```bash
$ docker run --name some-mysql -d --network my-mysql-net -e MYSQL_ROOT_PASSWORD=mysecretpassword mysql
```
最后启动应用容器
```bash
$ docker run --name some-app -d --network my-mysql-net application-that-uses-mysql
```
或者通过 `mysql` 命令行连接
```bash
$ docker run -it --rm \
--link some-mysql:mysql \
--network my-mysql-net \
mysql \
sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
sh -c 'exec mysql -hsome-mysql -P3306 -uroot -pmysecretpassword'
```
## Dockerfile
请到 https://github.com/docker-library/docs/tree/master/mysql 查看

View File

@@ -22,19 +22,28 @@ $ docker run --name some-redis -d -p 6379:6379 redis redis-server --appendonly y
默认数据存储位置在 `VOLUME/data`可以使用 `--volumes-from some-volume-container` `-v /docker/host/dir:/data` 将数据存放到本地
使用其他应用连接到容器可以用
使用其他应用连接到容器首先创建网络
```bash
$ docker run --name some-app --link some-redis:redis -d application-that-uses-redis
$ docker network create my-redis-net
```
然后启动 redis 容器
```bash
$ docker run --name some-redis -d --network my-redis-net redis
```
最后启动应用容器
```bash
$ docker run --name some-app -d --network my-redis-net application-that-uses-redis
```
或者通过 `redis-cli`
```bash
$ docker run -it --rm \
--link some-redis:redis \
--network my-redis-net \
redis \
sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"'
sh -c 'exec redis-cli -h some-redis'
```
## Dockerfile

View File

@@ -10,15 +10,28 @@
启动容器需要 MySQL 的支持默认端口为 `80`
首先创建网络
```bash
$ docker run --name some-wordpress --link some-mysql:mysql -d wordpress
$ docker network create my-wordpress-net
```
启动 MySQL 容器
```bash
$ docker run --name some-mysql -d --network my-wordpress-net -e MYSQL_ROOT_PASSWORD=mysecretpassword mysql
```
启动 WordPress 容器
```bash
$ docker run --name some-wordpress -d --network my-wordpress-net -e WORDPRESS_DB_HOST=some-mysql -e WORDPRESS_DB_PASSWORD=mysecretpassword wordpress
```
启动 WordPress 容器时可以指定的一些环境变量包括
* `WORDPRESS_DB_USER` 缺省为 `root`
* `WORDPRESS_DB_PASSWORD` 缺省为连接 mysql 容器的环境变量 `MYSQL_ROOT_PASSWORD` 的值
* `WORDPRESS_DB_NAME` 缺省为 `wordpress`
* `WORDPRESS_DB_HOST`: MySQL 服务的主机名
* `WORDPRESS_DB_USER`: MySQL 数据库的用户名
* `WORDPRESS_DB_PASSWORD`: MySQL 数据库的密码
* `WORDPRESS_DB_NAME`: WordPress 要使用的数据库名
## Dockerfile

View File

@@ -20,7 +20,8 @@
## 技术交流
* Docker 邮件列表 https://groups.google.com/forum/#!forum/docker-user
* Docker IRC 频道https://chat.freenode.net#docker
* Docker 社区 Slackhttps://dockercommunity.slack.com/
* Docker Community Discord: https://discord.gg/docker
* Docker Twitter 主页https://twitter.com/docker
## 其它

View File

@@ -1,8 +1,9 @@
# 基本概念
**Docker** 包括三个基本概念
* **镜像**`Image`
* **容器**`Container`
* **仓库**`Repository`
**Docker** 包括三个基本概念
* **镜像**`Image`Docker 镜像是一个特殊的文件系统除了提供容器运行时所需的程序资源配置等文件外还包含了一些为运行时准备的一些配置参数如匿名卷环境变量用户等镜像不包含任何动态数据其内容在构建之后也不会被改变
* **容器**`Container`镜像`Image`和容器`Container`的关系就像是面向对象程序设计中的 `` `实例` 一样镜像是静态的定义容器是镜像运行时的实体容器可以被创建启动停止删除暂停等
* **仓库**`Repository`镜像构建完成后可以很容易的在当前宿主机上运行但是如果需要在其它服务器上使用这个镜像我们就需要一个集中的存储分发镜像的服务Docker Registry 就是这样的服务
理解了这三个概念就理解了 **Docker** 的整个生命周期

View File

@@ -1,6 +1,6 @@
# Docker 镜像
我们都知道操作系统分为 **内核** **用户空间**对于 `Linux` 而言内核启动后会挂载 `root` 文件系统为其提供用户空间支持 **Docker 镜像**`Image`就相当于是一个 `root` 文件系统比如官方镜像 `ubuntu:18.04` 就包含了完整的一套 Ubuntu 18.04 最小系统的 `root` 文件系统
我们都知道操作系统分为 **内核** **用户空间**对于 `Linux` 而言内核启动后会挂载 `root` 文件系统为其提供用户空间支持 **Docker 镜像**`Image`就相当于是一个 `root` 文件系统比如官方镜像 `ubuntu:24.04` 就包含了完整的一套 Ubuntu 24.04 最小系统的 `root` 文件系统
**Docker 镜像** 是一个特殊的文件系统除了提供容器运行时所需的程序资源配置等文件外还包含了一些为运行时准备的一些配置参数如匿名卷环境变量用户等镜像 **不包含** 任何动态数据其内容在构建之后也不会被改变

View File

@@ -6,7 +6,7 @@
通常一个仓库会包含同一个软件不同版本的镜像而标签就常用于对应该软件的各个版本我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像如果不给出标签将以 `latest` 作为默认标签
[Ubuntu 镜像](https://hub.docker.com/_/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`16.04`, `18.04`。我们可以通过 `ubuntu:16.04`,或者 `ubuntu:18.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。
[Ubuntu 镜像](https://hub.docker.com/_/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`22.04`, `24.04`。我们可以通过 `ubuntu:22.04`,或者 `ubuntu:24.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。
仓库名经常以 *两段式路径* 形式出现比如 `jwilder/nginx-proxy`前者往往意味着 Docker Registry 多用户环境下的用户名后者则往往是对应的软件名但这并非绝对取决于所使用的具体 Docker Registry 的软件或服务

View File

@@ -145,9 +145,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` 环境变量即可使用
设置 `COMPOSE_DOCKER_CLI_BUILD=1` `DOCKER_BUILDKIT=1` 环境变量即可使用
## 官方文档

View File

@@ -1,38 +1,62 @@
# 使用 buildx 构建多种系统架构支持的 Docker 镜像
# 构建多种系统架构支持的 Docker 镜像
在之前的版本中构建多种系统架构支持的 Docker 镜像要想使用统一的名字必须使用 [`$ docker manifest`](../image/manifest.md) 命令
Docker 镜像可以支持多种系统架构这意味着你可以在 `x86_64``arm64` 等不同架构的机器上运行同一个镜像这是通过一个名为 "manifest list"或称为 "fat manifest"的文件来实现的
Docker 19.03+ 版本中可以使用 `$ docker buildx build` 命令使用 `BuildKit` 构建镜像该命令支持 `--platform` 参数可以同时构建支持多种系统架构的 Docker 镜像大大简化了构建步骤
## Manifest List 是什么
## 新建 `builder` 实例
Manifest list 是一个包含了多个指向不同架构镜像的 manifest 的文件当你拉取一个支持多架构的镜像时Docker 会自动根据你当前的系统架构选择并拉取对应的镜像
Docker for Linux 不支持构建 `arm` 架构镜像我们可以运行一个新的容器让其支持该特性Docker 桌面版无需进行此项设置
例如官方的 `hello-world` 镜像就支持多种架构你可以使用 `docker manifest inspect` 命令来查看它的 manifest list
```bash
$ docker run --rm --privileged tonistiigi/binfmt:latest --install all
$ docker manifest inspect hello-world
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 525,
"digest": "sha256:80852a401a974d9e923719a948cc5335a0a4435be8778b475844a7153a2382e5",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 525,
"digest": "sha256:3adea81344be1724b383d501736c3852939b33b3903d02474373700b25e5d6e3",
"platform": {
"architecture": "arm",
"os": "linux",
"variant": "v5"
}
},
// ... more architectures
]
}
```
由于 Docker 默认的 `builder` 实例不支持同时指定多个 `--platform`我们必须首先创建一个新的 `builder` 实例同时由于国内拉取镜像较缓慢我们可以使用配置了 [镜像加速地址](https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md) 的 [`dockerpracticesig/buildkit:master`](https://github.com/docker-practice/buildx) 镜像替换官方镜像。
## 使用 `docker buildx` 构建多架构镜像
> 如果你有私有的镜像加速器可以基于 https://github.com/docker-practice/buildx 构建自己的 buildkit 镜像并使用它
Docker 19.03+ 版本中`docker buildx` 是推荐的用于构建多架构镜像的工具它使用 `BuildKit` 作为后端可以大大简化构建过程
### 新建 `builder` 实例
首先你需要创建一个新的 `builder` 实例因为它支持同时为多个平台构建
```bash
# 适用于国内环境
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master
# 适用于腾讯云环境(腾讯云主机、coding.net 持续集成)
$ docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master-tencent
# $ docker buildx create --name mybuilder --driver docker-container
$ docker buildx use mybuilder
$ docker buildx create --name mybuilder --use
$ docker buildx inspect --bootstrap
```
## 构建镜像
### 构建和推送
新建 Dockerfile 文件
使用 `docker buildx build` 命令并指定 `--platform` 参数可以同时构建支持多种架构的镜像`--push` 参数会将构建好的镜像和 manifest list 推送到 Docker 仓库
```docker
```dockerfile
# Dockerfile
FROM --platform=$TARGETPLATFORM alpine
RUN uname -a > /os.txt
@@ -40,87 +64,58 @@ RUN uname -a > /os.txt
CMD cat /os.txt
```
使用 `$ docker buildx build` 命令构建镜像注意将 `myusername` 替换为自己的 Docker Hub 用户名
`--push` 参数表示将构建好的镜像推送到 Docker 仓库
```bash
$ docker buildx build --platform linux/arm,linux/arm64,linux/amd64 -t myusername/hello . --push
# 查看镜像信息
$ docker buildx imagetools inspect myusername/hello
$ docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t your-username/multi-arch-image . --push
```
在不同架构运行该镜像可以得到该架构的信息
构建完成后你就可以在不同架构的机器上拉取并运行 `your-username/multi-arch-image` 这个镜像了
```bash
# arm
$ docker run -it --rm myusername/hello
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 armv7l Linux
### 架构相关的构建参数
# arm64
$ docker run -it --rm myusername/hello
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 aarch64 Linux
`Dockerfile` 你可以使用一些预定义的构建参数来根据目标平台定制构建过程
# amd64
$ docker run -it --rm myusername/hello
Linux buildkitsandbox 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 Linux
```
* `TARGETPLATFORM`: 构建镜像的目标平台例如 `linux/amd64`
* `TARGETOS`: 目标平台的操作系统例如 `linux`
* `TARGETARCH`: 目标平台的架构例如 `amd64`
* `TARGETVARIANT`: 目标平台的变种例如 `v7`
* `BUILDPLATFORM`: 构建环境的平台
* `BUILDOS`: 构建环境的操作系统
* `BUILDARCH`: 构建环境的架构
* `BUILDVARIANT`: 构建环境的变种
## 架构相关变量
例如你可以这样编写 `Dockerfile` 来拷贝特定架构的二进制文件
`Dockerfile` 支持如下架构相关的变量
**TARGETPLATFORM**
构建镜像的目标平台例如 `linux/amd64`, `linux/arm/v7`, `windows/amd64`
**TARGETOS**
`TARGETPLATFORM` OS 类型例如 `linux`, `windows`
**TARGETARCH**
`TARGETPLATFORM` 的架构类型例如 `amd64`, `arm`
**TARGETVARIANT**
`TARGETPLATFORM` 的变种该变量可能为空例如 `v7`
**BUILDPLATFORM**
构建镜像主机平台例如 `linux/amd64`
**BUILDOS**
`BUILDPLATFORM` OS 类型例如 `linux`
**BUILDARCH**
`BUILDPLATFORM` 的架构类型例如 `amd64`
**BUILDVARIANT**
`BUILDPLATFORM` 的变种该变量可能为空例如 `v7`
### 使用举例
例如我们要构建支持 `linux/arm/v7` `linux/amd64` 两种架构的镜像假设已经生成了两个平台对应的二进制文件
* `bin/dist-linux-arm`
* `bin/dist-linux-amd64`
那么 `Dockerfile` 可以这样书写
```docker
```dockerfile
FROM scratch
# 使用变量必须申明
ARG TARGETOS
ARG TARGETARCH
COPY bin/dist-${TARGETOS}-${TARGETARCH} /dist
ENTRYPOINT ["dist"]
ENTRYPOINT ["/dist"]
```
## 使用 `docker manifest` (底层工具)
`docker manifest` 是一个更底层的命令可以用来创建检查和推送 manifest list虽然 `docker buildx` 在大多数情况下更方便但了解 `docker manifest` 仍然有助于理解其工作原理
### 创建 manifest list
```bash
# 首先,为每个架构构建并推送镜像
$ docker buildx build --platform linux/amd64 -t your-username/my-app:amd64 . --push
$ docker buildx build --platform linux/arm64 -t your-username/my-app:arm64 . --push
# 然后,创建一个 manifest list将它们组合在一起
$ docker manifest create your-username/my-app:latest \
--amend your-username/my-app:amd64 \
--amend your-username/my-app:arm64
# 最后,推送 manifest list
$ docker manifest push your-username/my-app:latest
```
### 检查 manifest list
你可以使用 `docker manifest inspect` 来查看一个 manifest list 的详细信息如上文所示

View File

@@ -86,11 +86,11 @@ $ git push origin master
打开我们部署好的 `Drone` 网站或者 Drone Cloud即可看到构建结果
![](./_images/drone-build.png)
![](../../../.gitbook/assets/drone-build.png)
当然我们也可以把构建结果上传到 GitHubDocker Registry云服务商提供的对象存储或者生产环境中
本书 GitBook 也使用 Drone 进行 CI/CD具体配置信息请查看本书根目录 [`.drone.yml`](https://github.com/yeasy/docker_practice/blob/master/.drone.yml) 文件
本书 GitBook 也使用 Drone 进行 CI/CD具体配置信息请查看本书根目录 [`.drone.yml`](../../../.drone.yml) 文件
## 参考链接

View File

@@ -2,7 +2,7 @@
## 简介
![Alpine Linux 操作系统](./_images/alpinelinux-logo.png)
![Alpine Linux 操作系统](../../.gitbook/assets/alpinelinux-logo.png)
`Alpine` 操作系统是一个面向安全的轻型 `Linux` 发行版它不同于通常 `Linux` 发行版`Alpine` 采用了 `musl libc` `busybox` 以减小系统的体积和运行时资源消耗但功能上比 `busybox` 又完善的多因此得到开源社区越来越多的青睐在保持瘦身的同时`Alpine` 还提供了自己的包管理工具 `apk`可以通过 `https://pkgs.alpinelinux.org/packages` 网站上查询包信息也可以直接通过 `apk` 命令直接查询和安装各种软件
@@ -65,5 +65,5 @@ RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories
* `Alpine` 官网https://www.alpinelinux.org/
* `Alpine` 官方仓库https://github.com/alpinelinux
* `Alpine` 官方镜像https://hub.docker.com/_/alpine/
* `Alpine` 官方镜像https://hub.docker.com/\_/alpine/
* `Alpine` 官方镜像仓库https://github.com/gliderlabs/docker-alpine

View File

@@ -2,7 +2,7 @@
## 简介
![Busybox - Linux 瑞士军刀](./_images/busybox-logo.png)
![Busybox - Linux 瑞士军刀](../../.gitbook/assets/busybox-logo.png)
`BusyBox` 是一个集成了一百多个最常用 Linux 命令和工具 `cat``echo``grep``mount``telnet` 的精简工具箱它只需要几 MB 的大小很方便进行各种快速验证被誉为Linux 系统的瑞士军刀
@@ -111,5 +111,5 @@ tmpfs on /sys/firmware type tmpfs (ro,relatime)
* `Busybox` 官网https://busybox.net/
* `Busybox` 官方仓库https://git.busybox.net/busybox/
* `Busybox` 官方镜像https://hub.docker.com/_/busybox/
* `Busybox` 官方镜像https://hub.docker.com/\_/busybox/
* `Busybox` 官方仓库https://github.com/docker-library/busybox

View File

@@ -1,15 +1,17 @@
# CentOS/Fedora
# CentOS Fedora
## CentOS 系统简介
`CentOS` `Fedora` 都是基于 `Redhat` 的常见 Linux 分支`CentOS` 是目前企业级服务器的常用操作系统`Fedora` 则主要面向个人桌面用户
![CentOS 操作系统](./_images/centos-logo.png)
![CentOS 操作系统](../../.gitbook/assets/centos-logo.png)
CentOSCommunity Enterprise Operating System中文意思是社区企业操作系统它是基于 `Red Hat Enterprise Linux` 源代码编译而成由于 `CentOS` `Redhat Linux` 源于相同的代码基础所以很多成本敏感且需要高稳定性的公司就使用 `CentOS` 来替代商业版 `Red Hat Enterprise Linux``CentOS` 自身不包含闭源软件
### 使用 CentOS 官方镜像
**注意CentOS 8 已于 2021 12 31 日停止维护EOL对于新部署推荐使用 CentOS Stream Rocky LinuxAlmaLinux 等替代发行版**
使用 `docker run` 直接运行 `CentOS 7` 镜像并登录 `bash`
```bash
@@ -25,7 +27,7 @@ CentOS Linux release 7.9.2009 (Core)
## Fedora 系统简介
![Fedora 操作系统](./_images/fedora-logo.png)
![Fedora 操作系统](../../.gitbook/assets/fedora-logo.png)
`Fedora` `Fedora Project` 社区开发红帽公司赞助的 `Linux` 发行版它的目标是创建一套新颖多功能并且自由和开源的操作系统`Fedora` 的功能对于用户而言它是一套功能完备的可以更新的免费操作系统而对赞助商 `Red Hat` 而言它是许多新技术的测试平台被认为可用的技术最终会加入到 `Red Hat Enterprise Linux`
@@ -33,7 +35,6 @@ CentOS Linux release 7.9.2009 (Core)
使用 `docker run` 命令直接运行 `Fedora` 官方镜像并登录 `bash`
```bash
$ docker run -it fedora bash
Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora
@@ -41,16 +42,16 @@ latest: Pulling from library/fedora
Digest: sha256:64a02df6aac27d1200c2572fe4b9949f1970d05f74d367ce4af994ba5dc3669e
Status: Downloaded newer image for fedora:latest
[root@196ca341419b /]# cat /etc/redhat-release
Fedora release 24 (Twenty Four)
```
Fedora release 39 (Thirty Nine)
## 相关资源
* `Fedora` 官网https://getfedora.org/
* `Fedora` 官方仓库https://github.com/fedora-infra
* `Fedora` 官方镜像https://hub.docker.com/_/fedora/
* `Fedora` 官方镜像https://hub.docker.com/\_/fedora/
* `Fedora` 官方镜像仓库https://github.com/fedora-cloud/docker-brew-fedora
* `CentOS` 官网https://www.centos.org
* `CentOS` 官方仓库https://github.com/CentOS
* `CentOS` 官方镜像https://hub.docker.com/_/centos/
* `CentOS` 官方镜像https://hub.docker.com/\_/centos/
* `CentOS` 官方镜像仓库https://github.com/CentOS/CentOS-Dockerfiles

View File

@@ -1,10 +1,10 @@
# Debian/Ubuntu
# Debian Ubuntu
`Debian` `Ubuntu` 都是目前较为流行的 **Debian ** 的服务器操作系统十分适合研发场景`Docker Hub` 上提供了官方镜像国内各大容器云服务也基本都提供了相应的支持
## Debian 系统简介
![Debian 操作系统](./_images/debian-logo.png)
![Debian 操作系统](../../.gitbook/assets/debian-logo.png)
`Debian` 是由 `GPL` 和其他自由软件许可协议授权的自由软件组成的操作系统 **Debian 计划Debian Project** 组织维护**Debian 计划** 是一个独立的分散的组织 `3000` 人志愿者组成接受世界多个非盈利组织的资金支持`Software in the Public Interest` 提供支持并持有商标作为保护机构`Debian` 以其坚守 `Unix` 和自由软件的精神以及其给予用户的众多选择而闻名现时 `Debian` 包括了超过 `25,000` 个软件包并支持 `12` 个计算机系统结构
@@ -26,7 +26,7 @@ Debian GNU/Linux 8
## Ubuntu 系统简介
![Ubuntu 操作系统](./_images/ubuntu-logo.jpg)
![Ubuntu 操作系统](../../.gitbook/assets/ubuntu-logo.jpg)
`Ubuntu` 是一个以桌面应用为主的 `GNU/Linux` 操作系统其名称来自非洲南部祖鲁语或豪萨语的ubuntu一词官方译名友帮拓另有吾帮托乌班图有奔头乌斑兔等译名`Ubuntu` 意思是人性以及我的存在是因为大家的存在是非洲传统的一种价值观类似华人社会的仁爱思想 `Ubuntu` 基于 `Debian` 发行版和 `GNOME/Unity` 桌面环境 `Debian` 的不同在于它每 6 个月会发布一个新版本 2 年推出一个长期支持 **Long Term SupportLTS** 版本一般支持 3 年时间
@@ -145,9 +145,9 @@ root@7d93de07bf76:/# curl 127.0.0.1
* `Debian` 官网https://www.debian.org/
* `Neuro Debian` 官网http://neuro.debian.net/
* `Debian` 官方仓库https://github.com/Debian
* `Debian` 官方镜像https://hub.docker.com/_/debian/
* `Debian` 官方镜像https://hub.docker.com/\_/debian/
* `Debian` 官方镜像仓库https://github.com/tianon/docker-brew-debian/
* `Ubuntu` 官网https://ubuntu.com
* `Ubuntu` 官方仓库https://github.com/ubuntu
* `Ubuntu` 官方镜像https://hub.docker.com/_/ubuntu/
* `Ubuntu` 官方镜像https://hub.docker.com/\_/ubuntu/
* `Ubuntu` 官方镜像仓库https://github.com/tianon/docker-brew-ubuntu-core

View File

@@ -1,11 +1,11 @@
# 阿里云
![阿里云](./_images/aliyun-logo.png)
![阿里云](../.gitbook/assets/aliyun-logo.png)
[阿里云](https://www.aliyun.com?source=5176.11533457&userCode=8lx5zmtu&type=copy) 创立于 2009 年,是中国较早的云计算平台。阿里云致力于提供安全、可靠的计算和数据处理能力。
[阿里云](https://www.aliyun.com/?source=5176.11533457\&userCode=8lx5zmtu\&type=copy) 创立于 2009 年,是中国较早的云计算平台。阿里云致力于提供安全、可靠的计算和数据处理能力。
[阿里云](https://www.aliyun.com?source=5176.11533457&userCode=8lx5zmtu&type=copy) 的客户群体中,活跃着微博、虎牙、魅族、优酷等一大批明星互联网公司。在天猫双 11 全球狂欢节等极富挑战的应用场景中,阿里云保持着良好的运行纪录。
[阿里云](https://www.aliyun.com/?source=5176.11533457\&userCode=8lx5zmtu\&type=copy) 的客户群体中,活跃着微博、虎牙、魅族、优酷等一大批明星互联网公司。在天猫双 11 全球狂欢节等极富挑战的应用场景中,阿里云保持着良好的运行纪录。
[阿里云容器服务 Kubernetes ACK](https://www.aliyun.com/product/kubernetes?source=5176.11533457&userCode=8lx5zmtu&type=copy) 提供了高性能、可伸缩的容器应用管理服务,支持在一组云服务器上通过 Docker 容器来进行应用生命周期管理。容器服务极大简化了用户对容器管理集群的搭建工作,无缝整合了阿里云虚拟化、存储、网络和安全能力。容器服务提供了多种应用发布方式和流水线般的持续交付能力,原生支持微服务架构,助力用户无缝上云和跨云管理。
[阿里云容器服务 Kubernetes ACK](https://www.aliyun.com/product/kubernetes?source=5176.11533457\&userCode=8lx5zmtu\&type=copy) 提供了高性能、可伸缩的容器应用管理服务,支持在一组云服务器上通过 Docker 容器来进行应用生命周期管理。容器服务极大简化了用户对容器管理集群的搭建工作,无缝整合了阿里云虚拟化、存储、网络和安全能力。容器服务提供了多种应用发布方式和流水线般的持续交付能力,原生支持微服务架构,助力用户无缝上云和跨云管理。
![](https://img.alicdn.com/tps/TB10yjtPpXXXXacXXXXXXXXXXXX-1531-1140.png)

View File

@@ -1,6 +1,6 @@
# 亚马逊云
![AWS](./_images/aws-logo.jpg)
![AWS](../.gitbook/assets/aws-logo.jpg)
[AWS](https://www.amazonaws.cn),即 Amazon Web Services是亚马逊Amazon公司的 IaaS 和 PaaS 平台服务。AWS 提供了一整套基础设施和应用程序服务使用户几乎能够在云中运行一切应用程序从企业应用程序和大数据项目到社交游戏和移动应用程序。AWS 面向用户提供包括弹性计算、存储、数据库、应用程序在内的一整套云计算服务,能够帮助企业降低 IT 投入成本和维护成本。
@@ -8,4 +8,4 @@
2015 AWS 正式发布了 EC2 容器服务(ECS)ECS 的目的是让 Docker 容器变的更加简单它提供了一个集群和编排的层用来控制主机上的容器部署以及部署之后的集群内的容器的生命周期管理ECS 是诸如 Docker SwarmKubernetesMesos 等工具的替代它们工作在同一个层除了作为一个服务来提供这些工具和 ECS 不同的地方在于前者需要用户自己来部署和管理 ECS 作为服务来提供的
![AWS 容器服务](./_images/ECS.jpg)
![AWS 容器服务](../.gitbook/assets/ECS.jpg)

View File

@@ -1,7 +1,22 @@
# 简介
目前与容器相关的云计算主要分为种类型
随着容器技术的普及目前主流的云计算服务商都提供了成熟的容器服务与容器相关的云计算服务主要分为以下几种类型
一种是传统的 IaaS 服务商提供对容器相关的服务包括镜像下载容器托管等
## 1. 容器编排托管服务 (Managed K8s)
另一种是直接基于容器技术对外提供容器云服务所谓 Container as a ServiceCaaS
这是目前最主流的形式云厂商托管 Kubernetes 的控制平面Master节点用户只需管理工作节点Worker Node
* **优势**降低了 Kubernetes 集群的维护成本高可用性由厂商保证
* **典型服务**AWS EKS, Azure AKS, Google GKE, 阿里云 ACK, 腾讯云 TKE
## 2. 容器实例服务 (Serverless Containers)
这一类服务通常被称为 CaaS (Container as a Service)用户无需管理底层服务器EC2/CVM只需提供镜像和配置即可运行容器
* **优势**极致的弹性按秒计费零运维
* **典型服务**AWS Fargate, Azure Container Instances, Google Cloud Run, 阿里云 ECI
## 3. 镜像仓库服务 (Container Registry)
提供安全可靠的私有 Docker 镜像存储服务通常与云厂商的 CI/CD 流水线深度集成
* **典型服务**AWS ECR, Azure ACR, Google GCR/GAR, 阿里云 ACR
本章将介绍如何在几个主流云平台上使用 Docker Kubernetes 服务

View File

@@ -1,11 +1,11 @@
# 腾讯云
![腾讯云](./_images/qcloud-logo.jpg)
![腾讯云](../.gitbook/assets/qcloud-logo.jpg)
[腾讯云](https://cloud.tencent.com/act/cps/redirect?redirect=1040&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console) 在架构方面经过多年积累,并且有着多年对海量互联网服务的经验。不管是社交、游戏还是其他领域,都有多年的成熟产品来提供产品服务。腾讯在云端完成重要部署,为开发者及企业提供云服务、云数据、云运营等整体一站式服务方案。
[腾讯云](https://cloud.tencent.com/act/cps/redirect?redirect=1040\&cps_key=3a5255852d5db99dcd5da4c72f05df61\&from=console) 在架构方面经过多年积累,并且有着多年对海量互联网服务的经验。不管是社交、游戏还是其他领域,都有多年的成熟产品来提供产品服务。腾讯在云端完成重要部署,为开发者及企业提供云服务、云数据、云运营等整体一站式服务方案。
具体包括 [云服务器](https://cloud.tencent.com/act/cps/redirect?redirect=1001&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[云存储](https://cloud.tencent.com/act/cps/redirect?redirect=1020&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[云数据库](https://cloud.tencent.com/act/cps/redirect?redirect=1003&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console)、[视频与CDN](https://cloud.tencent.com/act/cps/redirect?redirect=1019&cps_key=3a5255852d5db99dcd5da4c72f05df61&from=console) 和 [域名注册](https://dnspod.cloud.tencent.com) 等基础云服务腾讯云分析MTA、腾讯云推送信鸽等腾讯整体大数据能力以及 QQ互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。
具体包括 [云服务器](https://cloud.tencent.com/act/cps/redirect?redirect=1001\&cps_key=3a5255852d5db99dcd5da4c72f05df61\&from=console)、[云存储](https://cloud.tencent.com/act/cps/redirect?redirect=1020\&cps_key=3a5255852d5db99dcd5da4c72f05df61\&from=console)、[云数据库](https://cloud.tencent.com/act/cps/redirect?redirect=1003\&cps_key=3a5255852d5db99dcd5da4c72f05df61\&from=console)、[视频与CDN](https://cloud.tencent.com/act/cps/redirect?redirect=1019\&cps_key=3a5255852d5db99dcd5da4c72f05df61\&from=console) 和 [域名注册](https://dnspod.cloud.tencent.com) 等基础云服务腾讯云分析MTA、腾讯云推送信鸽等腾讯整体大数据能力以及 QQ互联、QQ 空间、微云、微社区等云端链接社交体系。这些正是腾讯云可以提供给这个行业的差异化优势,造就了可支持各种互联网使用场景的高品质的腾讯云技术平台。
[腾讯云容器服务 TKE](https://cloud.tencent.com/act/cps/redirect?redirect=10058&cps_key=3a5255852d5db99dcd5da4c72f05df61) 是高度可扩展的高性能容器管理服务,用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务,将无需安装、运维、扩展用户的集群管理基础设施,只需进行简单的 API 调用,便可启动和停止 Docker 应用程序,查询集群的完整状态,以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放,满足业务或应用程序的特定要求。
[腾讯云容器服务 TKE](https://cloud.tencent.com/act/cps/redirect?redirect=10058\&cps_key=3a5255852d5db99dcd5da4c72f05df61) 是高度可扩展的高性能容器管理服务,用户可以在托管的云服务器实例集群上轻松运行应用程序。使用该服务,将无需安装、运维、扩展用户的集群管理基础设施,只需进行简单的 API 调用,便可启动和停止 Docker 应用程序,查询集群的完整状态,以及使用各种云服务。用户可以根据用户的资源需求和可用性要求在用户的集群中安排容器的置放,满足业务或应用程序的特定要求。
![](https://mc.qcloudimg.com/static/img/0581dbeb97c869bbe6e62025dbc592d7/image.png)

View File

@@ -4,12 +4,12 @@
对于 Compose 来说大部分命令的对象既可以是项目本身也可以指定为项目中的服务或者容器如果没有特别的说明命令对象将是项目这意味着项目中所有的服务都会受到命令影响
执行 `docker-compose [COMMAND] --help` 或者 `docker-compose help [COMMAND]` 可以查看具体某个命令的使用格式
执行 `docker compose [COMMAND] --help` 或者 `docker compose help [COMMAND]` 可以查看具体某个命令的使用格式
`docker-compose` 命令的基本的使用格式是
`docker compose` 命令的基本的使用格式是
```bash
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
```
## 命令选项
@@ -26,13 +26,13 @@ docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
### `build`
格式为 `docker-compose build [options] [SERVICE...]`
格式为 `docker compose build [options] [SERVICE...]`
构建重新构建项目中的服务容器
服务容器一旦构建后将会带上一个标记名例如对于 web 项目中的一个 db 容器可能是 web_db
可以随时在项目目录下运行 `docker-compose build` 来重新构建服务
可以随时在项目目录下运行 `docker compose build` 来重新构建服务
选项包括
@@ -64,19 +64,19 @@ docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
### `kill`
格式为 `docker-compose kill [options] [SERVICE...]`
格式为 `docker compose kill [options] [SERVICE...]`
通过发送 `SIGKILL` 信号来强制停止服务容器
支持通过 `-s` 参数来指定发送的信号例如通过如下指令发送 `SIGINT` 信号
```bash
$ docker-compose kill -s SIGINT
$ docker compose kill -s SIGINT
```
### `logs`
格式为 `docker-compose logs [options] [SERVICE...]`
格式为 `docker compose logs [options] [SERVICE...]`
查看服务容器的输出默认情况下docker-compose 将对不同的服务输出使用不同的颜色来区分可以通过 `--no-color` 来关闭颜色
@@ -84,13 +84,13 @@ $ docker-compose kill -s SIGINT
### `pause`
格式为 `docker-compose pause [SERVICE...]`
格式为 `docker compose pause [SERVICE...]`
暂停一个服务容器
### `port`
格式为 `docker-compose port [options] SERVICE PRIVATE_PORT`
格式为 `docker compose port [options] SERVICE PRIVATE_PORT`
打印某个容器端口所映射的公共端口
@@ -102,7 +102,7 @@ $ docker-compose kill -s SIGINT
### `ps`
格式为 `docker-compose ps [options] [SERVICE...]`
格式为 `docker compose ps [options] [SERVICE...]`
列出项目中目前的所有容器
@@ -112,7 +112,7 @@ $ docker-compose kill -s SIGINT
### `pull`
格式为 `docker-compose pull [options] [SERVICE...]`
格式为 `docker compose pull [options] [SERVICE...]`
拉取服务依赖的镜像
@@ -126,7 +126,7 @@ $ docker-compose kill -s SIGINT
### `restart`
格式为 `docker-compose restart [options] [SERVICE...]`
格式为 `docker compose restart [options] [SERVICE...]`
重启项目中的服务
@@ -136,9 +136,9 @@ $ docker-compose kill -s SIGINT
### `rm`
格式为 `docker-compose rm [options] [SERVICE...]`
格式为 `docker compose rm [options] [SERVICE...]`
删除所有停止状态的服务容器推荐先执行 `docker-compose stop` 命令来停止容器
删除所有停止状态的服务容器推荐先执行 `docker compose stop` 命令来停止容器
选项
@@ -147,14 +147,14 @@ $ docker-compose kill -s SIGINT
* `-v` 删除容器所挂载的数据卷
### `run`
格式为 `docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]`
格式为 `docker compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]`
在指定服务上执行一个命令
例如
```bash
$ docker-compose run ubuntu ping docker.com
$ docker compose run ubuntu ping docker.com
```
将会启动一个 ubuntu 服务容器并执行 `ping docker.com` 命令
@@ -172,7 +172,7 @@ $ docker-compose run ubuntu ping docker.com
如果不希望自动启动关联的容器可以使用 `--no-deps` 选项例如
```bash
$ docker-compose run --no-deps web python manage.py shell
$ docker compose run --no-deps web python manage.py shell
```
将不会启动 web 容器所关联的其它容器
@@ -201,14 +201,14 @@ $ docker-compose run --no-deps web python manage.py shell
### `scale`
格式为 `docker-compose scale [options] [SERVICE=NUM...]`
格式为 `docker compose scale [options] [SERVICE=NUM...]`
设置指定服务运行的容器个数
通过 `service=num` 的参数来设置数量例如
```bash
$ docker-compose scale web=3 db=2
$ docker compose scale web=3 db=2
```
将启动 3 个容器运行 web 服务2 个容器运行 db 服务
@@ -221,15 +221,15 @@ $ docker-compose scale web=3 db=2
### `start`
格式为 `docker-compose start [SERVICE...]`
格式为 `docker compose start [SERVICE...]`
启动已经存在的服务容器
### `stop`
格式为 `docker-compose stop [options] [SERVICE...]`
格式为 `docker compose stop [options] [SERVICE...]`
停止已经处于运行状态的容器但不删除它通过 `docker-compose start` 可以再次启动这些容器
停止已经处于运行状态的容器但不删除它通过 `docker compose start` 可以再次启动这些容器
选项
@@ -241,13 +241,13 @@ $ docker-compose scale web=3 db=2
### `unpause`
格式为 `docker-compose unpause [SERVICE...]`
格式为 `docker compose unpause [SERVICE...]`
恢复处于暂停状态中的服务
### `up`
格式为 `docker-compose up [options] [SERVICE...]`
格式为 `docker compose up [options] [SERVICE...]`
该命令十分强大它将尝试自动完成包括构建镜像重新创建服务启动服务并关联服务相关容器的一系列操作
@@ -255,13 +255,13 @@ $ docker-compose scale web=3 db=2
可以说大部分时候都可以直接通过该命令来启动一个项目
默认情况`docker-compose up` 启动的容器都在前台控制台将会同时打印所有容器的输出信息可以很方便进行调试
默认情况`docker compose up` 启动的容器都在前台控制台将会同时打印所有容器的输出信息可以很方便进行调试
当通过 `Ctrl-C` 停止命令时所有容器将会停止
如果使用 `docker-compose up -d`将会在后台启动并运行所有的容器一般推荐生产环境下使用该选项
如果使用 `docker compose up -d`将会在后台启动并运行所有的容器一般推荐生产环境下使用该选项
默认情况如果服务容器已经存在`docker-compose up` 将会尝试停止容器然后重新创建保持使用 `volumes-from` 挂载的卷以保证新启动的服务匹配 `docker-compose.yml` 文件的最新内容如果用户不希望容器被停止并重新创建可以使用 `docker-compose up --no-recreate`这样将只会启动处于停止状态的容器而忽略已经运行的服务如果用户只想重新部署某个服务可以使用 `docker-compose up --no-deps -d <SERVICE_NAME>` 来重新创建服务并后台停止旧服务启动新服务并不会影响到其所依赖的服务
默认情况如果服务容器已经存在`docker compose up` 将会尝试停止容器然后重新创建保持使用 `volumes-from` 挂载的卷以保证新启动的服务匹配 `docker-compose.yml` 文件的最新内容如果用户不希望容器被停止并重新创建可以使用 `docker compose up --no-recreate`这样将只会启动处于停止状态的容器而忽略已经运行的服务如果用户只想重新部署某个服务可以使用 `docker compose up --no-deps -d <SERVICE_NAME>` 来重新创建服务并后台停止旧服务启动新服务并不会影响到其所依赖的服务
选项
@@ -281,7 +281,7 @@ $ docker-compose scale web=3 db=2
### `version`
格式为 `docker-compose version`
格式为 `docker compose version`
打印版本信息

View File

@@ -5,7 +5,7 @@
默认的模板文件名称为 `docker-compose.yml`格式为 YAML 格式
```yaml
version: "3"
version: "3" # 在 Compose V2 中version 字段已成为可选,且推荐不再使用。
services:
webapp:
@@ -306,7 +306,7 @@ labels:
## `links`
>注意不推荐使用该指令
>注意不推荐使用该指令容器之间应通过 Docker 网络networks进行互联
## `logging`

View File

@@ -1,2 +1,2 @@
Django>=2.0,<3.0
Django>=5.0.6,<6.0
psycopg2>=2.7,<3.0

View File

@@ -49,10 +49,10 @@ services:
查看 [`docker-compose.yml` 章节](compose_file.md) 了解更多详细的工作机制
现在我们就可以使用 `docker-compose run` 命令启动一个 `Django` 应用了
现在我们就可以使用 `docker compose run` 命令启动一个 `Django` 应用了
```bash
$ docker-compose run web django-admin startproject django_example .
$ docker compose run web django-admin startproject django_example .
```
由于 web 服务所使用的镜像并不存在所以 Compose 会首先使用 `Dockerfile` web 服务构建一个镜像接着使用这个镜像在容器里运行 `django-admin startproject django_example` 指令
@@ -85,10 +85,10 @@ DATABASES = {
}
```
这些信息是在 [postgres](https://hub.docker.com/_/postgres/) 镜像固定设置好的。然后,运行 `docker-compose up`
这些信息是在 [postgres](https://hub.docker.com/_/postgres/) 镜像固定设置好的。然后,运行 `docker compose up`
```bash
$ docker-compose up
$ docker compose up
django_db_1 is up-to-date
Creating django_web_1 ...
@@ -113,8 +113,8 @@ web_1 | Quit the server with CONTROL-C.
这个 `Django` 应用已经开始在你的 Docker 守护进程里监听着 `8000` 端口了打开 `127.0.0.1:8000` 即可看到 `Django` 欢迎页面
你还可以在 Docker 上运行其它的管理命令例如对于同步数据库结构这种事在运行完 `docker-compose up` 在另外一个终端进入文件夹运行以下命令即可
你还可以在 Docker 上运行其它的管理命令例如对于同步数据库结构这种事在运行完 `docker compose up` 在另外一个终端进入文件夹运行以下命令即可
```bash
$ docker-compose run web python manage.py syncdb
$ docker compose run web python manage.py syncdb
```

View File

@@ -1,59 +1,46 @@
# 安装与卸载
`Compose` Docker 官方的开源项目负责实现对 Docker 容器集群的快速编排
`v2` 版本开始`Compose` 作为 `docker` 的子命令存在例如 `docker compose up`
`Compose` 支持 LinuxmacOSWindows 10 三大平台
`Compose` 可以通过 Python 的包管理工具 `pip` 进行安装也可以直接下载编译好的二进制文件使用甚至能够直接在 Docker 容器中运行
`Docker Desktop for Mac/Windows` 自带 `docker-compose` 二进制文件安装 Docker 之后可以直接使用
```bash
$ docker-compose --version
docker-compose version 1.27.4, build 40524192
```
`Docker Desktop for Mac/Windows` 自带 `docker compose` 命令
Linux 系统请使用以下介绍的方法安装
## 二进制包
## Linux
Linux 的也安装十分简单 [官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可
Linux 你可以通过下载 `docker-compose` 二进制包来安装
[官方 GitHub Release](https://github.com/docker/compose/releases) 处直接下载编译好的二进制文件即可。
例如 Linux 64 位系统上直接下载对应的二进制包
```bash
$ sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 国内用户可以使用以下方式加快下载
$ sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ 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
```
## PIP 安装
** `x86_64` 架构的 Linux 建议按照上边的方法下载二进制包进行安装如果您计算机的架构是 `ARM` (例如树莓派)再使用 `pip` 安装
这种方式是将 Compose 当作一个 Python 应用来从 pip 源中安装
执行安装命令
之后执行
```bash
$ sudo pip install -U docker-compose
$ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
```
可以看到类似如下输出说明安装成功
## 测试安装
```bash
Collecting docker-compose
Downloading docker-compose-1.27.4.tar.gz (149kB): 149kB downloaded
...
Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
$ docker compose version
Docker Compose version v2.29.1
```
## bash 补全命令
```bash
$ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
$ curl -L https://raw.githubusercontent.com/docker/compose/v2.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
```
## 卸载
@@ -61,11 +48,5 @@ $ curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/comple
如果是二进制包方式安装的删除二进制文件即可
```bash
$ sudo rm /usr/local/bin/docker-compose
```
如果是通过 `pip` 安装的则执行如下命令即可删除
```bash
$ sudo pip uninstall docker-compose
```
$ rm $DOCKER_CONFIG/cli-plugins/docker-compose
```

View File

@@ -47,10 +47,10 @@ services:
- "3000:3000"
```
所有文件就绪后我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了
所有文件就绪后我们就可以通过使用 `docker compose run` 命令生成应用的骨架了
```bash
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle
$ docker compose run web rails new . --force --database=postgresql --skip-bundle
```
`Compose` 会先使用 `Dockerfile` web 服务创建一个镜像接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令一旦这个命令运行完后应该就可以看一个崭新的应用已经生成了
@@ -73,7 +73,7 @@ gem 'therubyracer', platforms: :ruby
现在我们已经有一个新的 `Gemfile` 文件需要再重新创建镜像这个会步骤会改变 Dockerfile 文件本身所以需要重建一次
```bash
$ docker-compose build
$ docker compose build
```
应用现在就可以启动了但配置还未完成Rails 默认读取的数据库目标是 `localhost` 我们需要手动指定容器的 `db` 同样的还需要把用户名修改成和 postgres 镜像预定的一致
@@ -97,7 +97,7 @@ test:
现在就可以启动应用了
```bash
$ docker-compose up
$ docker compose up
```
如果一切正常你应该可以看到 PostgreSQL 的输出几秒后可以看到这样的重复信息
@@ -111,7 +111,7 @@ myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=
最后 我们需要做的是创建数据库打开另一个终端运行
```bash
$ docker-compose run web rake db:create
$ docker compose run web rake db:create
```
这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了

View File

@@ -68,7 +68,67 @@ services:
### 运行 compose 项目
```bash
$ docker-compose up
$ docker compose up
```
此时访问本地 `5000` 端口每次刷新页面计数就会加 1
按下 `Ctrl-C` 停止项目
### 后台运行
```bash
$ docker compose up -d
```
### 停止
```bash
$ docker compose stop
```
### 进入服务
```bash
$ docker compose exec redis sh
/data # redis-cli
127.0.0.1:6379> get hits
"9"
```
### 查看日志
```bash
$ docker compose logs -f
```
### 构建镜像
```bash
$ docker compose build
```
### 启动服务
```bash
$ docker compose start
```
### 运行一次性命令
```bash
$ docker compose run web python app.py
```
### 验证 `docker-compose.yml`
```bash
$ docker compose config
```
### 删除项目
```bash
$ docker compose down
```

View File

@@ -1,7 +0,0 @@
# Compose V2
目前 Docker 官方用 GO 语言 [重写](https://github.com/docker/compose-cli) 了 Docker Compose并将其作为了 docker cli 的子命令,称为 `Compose V2`。你可以参照官方文档安装,然后将熟悉的 `docker-compose` 命令替换为 `docker compose`,即可使用 Docker Compose。
## 官方文档
* [Compose V2 beta](https://docs.docker.com/compose/cli-command/)

View File

@@ -48,4 +48,4 @@ volumes:
## 构建并运行项目
运行 `docker-compose up -d` Compose 就会拉取镜像再创建我们所需要的镜像然后启动 `wordpress` 和数据库容器 接着浏览器访问 `127.0.0.1:8000` 端口就能看到 `WordPress` 安装界面了
运行 `docker compose up -d` Compose 就会拉取镜像再创建我们所需要的镜像然后启动 `wordpress` 和数据库容器 接着浏览器访问 `127.0.0.1:8000` 端口就能看到 `WordPress` 安装界面了

View File

@@ -1,9 +1,8 @@
# Docker 数据管理
# 数据管理
![](./_images/types-of-mounts.png)
![](../.gitbook/assets/types-of-mounts.png)
这一章介绍如何在 Docker 内部以及容器之间管理数据在容器中管理数据主要有两种方式
* 数据卷Volumes
* 挂载主机目录 (Bind mounts)

View File

@@ -119,7 +119,7 @@ networks:
subnet: 172.16.238.0/24
```
使用 `docker-compose up` 启动集群之后使用 `docker exec` 命令登录到任一节点测试 `etcd` 集群
使用 `docker compose up` 启动集群之后使用 `docker exec` 命令登录到任一节点测试 `etcd` 集群
```bash
/ # etcdctl member list

View File

@@ -1,281 +0,0 @@
# 使用 etcdctl v2
`etcdctl` 是一个命令行客户端它能提供一些简洁的命令供用户直接跟 `etcd` 服务打交道而无需基于 `HTTP API` 方式这在某些情况下将很方便例如用户对服务进行测试或者手动修改数据库内容我们也推荐在刚接触 `etcd` 时通过 `etcdctl` 命令来熟悉相关的操作这些操作跟 `HTTP API` 实际上是对应的
`etcd` 项目二进制发行包中已经包含了 `etcdctl` 工具没有的话可以从 [github.com/etcd-io/etcd/releases](https://github.com/etcd-io/etcd/releases) 下载。
`etcdctl` 支持如下的命令大体上分为数据库操作和非数据库操作两类后面将分别进行解释
```
$ etcdctl -h
NAME:
etcdctl - A simple command line client for etcd.
USAGE:
etcdctl [global options] command [command options] [arguments...]
VERSION:
2.0.0-rc.1
COMMANDS:
backup backup an etcd directory
mk make a new key with a given value
mkdir make a new directory
rm remove a key
rmdir removes the key if it is an empty directory or a key-value pair
get retrieve the value of a key
ls retrieve a directory
set set the value of a key
setdir create a new or existing directory
update update an existing key with a given value
updatedir update an existing directory
watch watch a key for changes
exec-watch watch a key for changes and exec an executable
member member add, remove and list subcommands
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--debug output cURL commands which can be used to reproduce the request
--no-sync don't synchronize cluster information before sending request
--output, -o 'simple' output response in the given format (`simple` or `json`)
--peers, -C a comma-delimited list of machine addresses in the cluster (default: "127.0.0.1:4001")
--cert-file identify HTTPS client using this SSL certificate file
--key-file identify HTTPS client using this SSL key file
--ca-file verify certificates of HTTPS-enabled servers using this CA bundle
--help, -h show help
--version, -v print the version
```
## 数据库操作
数据库操作围绕对键值和目录的 CRUD 符合 REST 风格的一套操作Create完整生命周期的管理
etcd 在键的组织上采用了层次化的空间结构类似于文件系统中目录的概念用户指定的键可以为单独的名字 `testkey`此时实际上放在根目录 `/` 下面也可以为指定目录结构 `cluster1/node2/testkey`则将创建相应的目录结构
*CRUD Create, Read, Update, Delete是符合 REST 风格的一套 API 操作*
### set
指定某个键的值例如
```bash
$ etcdctl set /testdir/testkey "Hello world"
Hello world
```
支持的选项包括
```bash
--ttl '0' 该键值的超时时间(单位为秒),不配置(默认为 0则永不超时
--swap-with-value value 若该键现在的值是 value则进行设置操作
--swap-with-index '0' 若该键现在的索引值是指定索引,则进行设置操作
```
### get
获取指定键的值例如
```bash
$ etcdctl set testkey hello
hello
$ etcdctl update testkey world
world
```
当键不存在时则会报错例如
```bash
$ etcdctl get testkey2
Error: 100: Key not found (/testkey2) [1]
```
支持的选项为
```bash
--sort 对结果进行排序
--consistent 将请求发给主节点,保证获取内容的一致性
```
### update
当键存在时更新值内容例如
```bash
$ etcdctl set testkey hello
hello
$ etcdctl update testkey world
world
```
当键不存在时则会报错例如
```bash
$ etcdctl update testkey2 world
Error: 100: Key not found (/testkey2) [1]
```
支持的选项为
```bash
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
```
### rm
删除某个键值例如
```bash
$ etcdctl rm testkey
```
当键不存在时则会报错例如
```bash
$ etcdctl rm testkey2
Error: 100: Key not found (/testkey2) [8]
```
支持的选项为
```bash
--dir 如果键是个空目录或者键值对则删除
--recursive 删除目录和所有子键
--with-value 检查现有的值是否匹配
--with-index '0' 检查现有的 index 是否匹配
```
### mk
如果给定的键不存在则创建一个新的键值例如
```bash
$ etcdctl mk /testdir/testkey "Hello world"
Hello world
```
当键存在的时候执行该命令会报错例如
```bash
$ etcdctl set testkey "Hello world"
Hello world
$ ./etcdctl mk testkey "Hello world"
Error: 105: Key already exists (/testkey) [2]
```
支持的选项为
```bash
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
```
### mkdir
如果给定的键目录不存在则创建一个新的键目录例如
```bash
$ etcdctl mkdir testdir
```
当键目录存在的时候执行该命令会报错例如
```bash
$ etcdctl mkdir testdir
$ etcdctl mkdir testdir
Error: 105: Key already exists (/testdir) [7]
```
支持的选项为
```bash
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
```
### setdir
创建一个键目录无论存在与否
支持的选项为
```bash
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
```
### updatedir
更新一个已经存在的目录
支持的选项为
```bash
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
```
### rmdir
删除一个空目录或者键值对
若目录不空会报错
```bash
$ etcdctl set /dir/testkey hi
hi
$ etcdctl rmdir /dir
Error: 108: Directory not empty (/dir) [13]
```
### ls
列出目录默认为根目录下的键或者子目录默认不显示子目录中内容
例如
```bash
$ ./etcdctl set testkey 'hi'
hi
$ ./etcdctl set dir/test 'hello'
hello
$ ./etcdctl ls
/testkey
/dir
$ ./etcdctl ls dir
/dir/test
```
支持的选项包括
```bash
--sort 将输出结果排序
--recursive 如果目录下有子目录,则递归输出其中的内容
-p 对于输出为目录,在最后添加 `/` 进行区分
```
## 非数据库操作
### backup
备份 etcd 的数据
支持的选项包括
```bash
--data-dir etcd 的数据目录
--backup-dir 备份到指定路径
```
### watch
监测一个键值的变化一旦键值发生更新就会输出最新的值并退出
例如用户更新 testkey 键值为 Hello world
```bash
$ etcdctl watch testkey
Hello world
```
支持的选项包括
```bash
--forever 一直监测,直到用户按 `CTRL+C` 退出
--after-index '0' 在指定 index 之前一直监测
--recursive 返回所有的键值和子键值
```
### exec-watch
监测一个键值的变化一旦键值发生更新就执行给定命令
例如用户更新 testkey 键值
```bash
$ etcdctl exec-watch testkey -- sh -c 'ls'
default.etcd
Documentation
etcd
etcdctl
etcd-migrate
README-etcdctl.md
README.md
```
支持的选项包括
```bash
--after-index '0' 在指定 index 之前一直监测
--recursive 返回所有的键值和子键值
```
### member
通过 listaddremove 命令列出添加删除 etcd 实例到 etcd 集群中
例如本地启动一个 etcd 服务实例后可以用如下命令进行查看
```bash
$ etcdctl member list
ce2a822cea30bfca: name=default peerURLs=http://localhost:2380,http://localhost:7001 clientURLs=http://localhost:2379,http://localhost:4001
```
## 命令选项
* `--debug` 输出 cURL 命令显示执行命令的时候发起的请求
* `--no-sync` 发出请求之前不同步集群信息
* `--output, -o 'simple'` 输出内容的格式 (`simple` 为原始信息`json` 为进行json格式解码易读性好一些)
* `--peers, -C` 指定集群中的同伴信息用逗号隔开 (默认为: "127.0.0.1:4001")
* `--cert-file` HTTPS 下客户端使用的 SSL 证书文件
* `--key-file` HTTPS 下客户端使用的 SSL 密钥文件
* `--ca-file` 服务端使用 HTTPS 使用 CA 文件进行验证
* `--help, -h` 显示帮助命令信息
* `--version, -v` 打印版本信息

View File

@@ -1,6 +1,6 @@
# 什么是 etcd
# 简介
![](./_images/etcd_logo.png)
![](../.gitbook/assets/etcd_logo.png)
`etcd` `CoreOS` 团队于 2013 6 月发起的开源项目它的目标是构建一个高可用的分布式键值`key-value`数据库基于 `Go` 语言实现我们知道在分布式系统中各种服务的配置信息的管理分享服务的发现是一个很基本同时也是很重要的问题`CoreOS` 项目就希望基于 `etcd` 来解决这一问题
@@ -9,17 +9,14 @@
受到 [Apache ZooKeeper](https://zookeeper.apache.org/) 项目和 [doozer](https://github.com/ha/doozerd) 项目的启发,`etcd` 在设计的时候重点考虑了下面四个要素:
* 简单具有定义良好面向用户的 `API` ([gRPC](https://github.com/grpc/grpc))
* 安全支持 `HTTPS` 方式的访问
* 快速支持并发 `10 k/s` 的写操作
* 可靠支持分布式结构基于 `Raft` 的一致性算法
*Apache ZooKeeper 是一套知名的分布式系统中进行同步和一致性管理的工具*
_Apache ZooKeeper 是一套知名的分布式系统中进行同步和一致性管理的工具_
*doozer 是一个一致性分布式数据库*
_doozer 是一个一致性分布式数据库_
*[Raft](https://raft.github.io/) 是一套通过选举主节点来实现分布式系统一致性的算法,相比于大名鼎鼎的 Paxos 算法,它的过程更容易被人理解,由 Stanford 大学的 Diego Ongaro 和 John Ousterhout 提出。更多细节可以参考 [raftconsensus.github.io](http://raftconsensus.github.io)。*
[_Raft_](https://raft.github.io/) _是一套通过选举主节点来实现分布式系统一致性的算法,相比于大名鼎鼎的 Paxos 算法,它的过程更容易被人理解,由 Stanford 大学的 Diego Ongaro 和 John Ousterhout 提出。更多细节可以参考_ [_raftconsensus.github.io_](http://raftconsensus.github.io)_。_
一般情况下用户使用 `etcd` 可以在多个节点上启动多个实例并添加它们为一个集群同一个集群中的 `etcd` 实例将会保持彼此信息的一致性

View File

@@ -57,7 +57,7 @@ RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
既然 `RUN` 就像 Shell 脚本一样可以执行命令那么我们是否就可以像 Shell 脚本一样把每个命令对应一个 RUN 比如这样
```docker
FROM debian:stretch
FROM debian:bookworm
RUN apt-get update
RUN apt-get install -y gcc libc6-dev make wget
@@ -78,7 +78,7 @@ RUN make -C /usr/src/redis install
上面的 `Dockerfile` 正确的写法应该是这样
```docker
FROM debian:stretch
FROM debian:bookworm
RUN set -x; buildDeps='gcc libc6-dev make wget' \
&& apt-get update \

View File

@@ -1,6 +1,6 @@
# 利用 commit 理解镜像构成
>注意如果您是初学者您可以暂时跳过后面的内容直接学习 [容器](../container) 一节
> 注意如果您是初学者您可以暂时跳过后面的内容直接学习 [容器](../container/) 一节
注意 `docker commit` 命令除了学习之外还有一些特殊的应用场合比如被入侵后保存现场等但是不要使用 `docker commit` 定制镜像定制镜像应该使用 `Dockerfile` 来完成如果你想要定制镜像请查看下一小节
@@ -16,11 +16,11 @@ $ docker run --name webserver -d -p 80:80 nginx
这条命令会用 `nginx` 镜像启动一个容器命名为 `webserver`并且映射了 80 端口这样我们可以用浏览器去访问这个 `nginx` 服务器
如果是在本机运行的 Docker那么可以直接访问`http://localhost` 如果是在虚拟机云服务器上安装的 Docker则需要将 `localhost` 换为虚拟机地址或者实际云服务器地址
如果是在本机运行的 Docker那么可以直接访问`http://localhost` 如果是在虚拟机云服务器上安装的 Docker则需要将 `localhost` 换为虚拟机地址或者实际云服务器地址
直接用浏览器访问的话我们会看到默认的 Nginx 欢迎页面
![](./_images/images-mac-example-nginx.png)
![](../.gitbook/assets/images-mac-example-nginx.png)
现在假设我们非常不喜欢这个欢迎页面我们希望改成欢迎 Docker 的文字我们可以使用 `docker exec` 命令进入容器修改其内容
@@ -37,7 +37,7 @@ exit
现在我们再刷新浏览器的话会发现内容被改变了
![](./_images/images-create-nginx-docker.png)
![](../.gitbook/assets/images-create-nginx-docker.png)
我们修改了容器的文件也就是改动了容器的存储层我们可以通过 `docker diff` 命令看到具体的改动

View File

@@ -1,162 +0,0 @@
# 构建多种系统架构支持的 Docker 镜像 -- docker manifest 命令详解
我们知道使用镜像创建一个容器该镜像必须与 Docker 宿主机系统架构一致例如 `Linux x86_64` 架构的系统中只能使用 `Linux x86_64` 的镜像创建容器
> WindowsmacOS 除外其使用了 [binfmt_misc](https://docs.docker.com/docker-for-mac/multi-arch/) 提供了多种架构支持,在 Windows、macOS 系统上 (x86_64) 可以运行 arm 等其他架构的镜像。
例如我们在 `Linux x86_64` 中构建一个 `username/test` 镜像
```docker
FROM alpine
CMD echo 1
```
构建镜像后推送到 Docker Hub之后我们尝试在树莓派 `Linux arm64v8` 中使用这个镜像
```bash
$ docker run -it --rm username/test
```
可以发现这个镜像根本获取不到
要解决这个问题通常采用的做法是通过镜像名区分不同系统架构的镜像例如在 `Linux x86_64` `Linux arm64v8` 分别构建 `username/test` `username/arm64v8-test` 镜像运行时使用对应架构的镜像即可
这样做显得很繁琐那么有没有一种方法让 Docker 引擎根据系统架构自动拉取对应的镜像呢
我们发现在 `Linux x86_64` `Linux arm64v8` 架构的计算机中分别使用 `golang:alpine` 镜像运行容器 `$ docker run golang:alpine go version` 容器能够正常的运行
这是什么原因呢
原因就是 `golang:alpine` 官方镜像有一个 [`manifest` 列表 (`manifest list`)](https://docs.docker.com/registry/spec/manifest-v2-2/)。
当用户获取一个镜像时Docker 引擎会首先查找该镜像是否有 `manifest` 列表如果有的话 Docker 引擎会按照 Docker 运行环境系统及架构查找出对应镜像例如 `golang:alpine`如果没有的话会直接获取镜像例如上例中我们构建的 `username/test`
我们可以使用 `$ docker manifest inspect golang:alpine` 查看这个 `manifest` 列表的结构
```bash
$ docker manifest inspect golang:alpine
```
```json
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1365,
"digest": "sha256:5e28ac423243b187f464d635bcfe1e909f4a31c6c8bce51d0db0a1062bec9e16",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1365,
"digest": "sha256:2945c46e26c9787da884b4065d1de64cf93a3b81ead1b949843dda1fcd458bae",
"platform": {
"architecture": "arm",
"os": "linux",
"variant": "v7"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1365,
"digest": "sha256:87fff60114fd3402d0c1a7ddf1eea1ded658f171749b57dc782fd33ee2d47b2d",
"platform": {
"architecture": "arm64",
"os": "linux",
"variant": "v8"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1365,
"digest": "sha256:607b43f1d91144f82a9433764e85eb3ccf83f73569552a49bc9788c31b4338de",
"platform": {
"architecture": "386",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1365,
"digest": "sha256:25ead0e21ed5e246ce31e274b98c09aaf548606788ef28eaf375dc8525064314",
"platform": {
"architecture": "ppc64le",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1365,
"digest": "sha256:69f5907fa93ea591175b2c688673775378ed861eeb687776669a48692bb9754d",
"platform": {
"architecture": "s390x",
"os": "linux"
}
}
]
}
```
可以看出 `manifest` 列表中包含了不同系统架构所对应的镜像 `digest` 这样 Docker 就可以在不同的架构中使用相同的 `manifest` (例如 `golang:alpine`) 获取对应的镜像
下面介绍如何使用 `$ docker manifest` 命令创建并推送 `manifest` 列表到 Docker Hub
## 构建镜像
首先在 `Linux x86_64` 构建 `username/x8664-test` 镜像并在 `Linux arm64v8` 中构建 `username/arm64v8-test` 镜像构建好之后推送到 Docker Hub
## 创建 `manifest` 列表
```bash
# $ docker manifest create MANIFEST_LIST MANIFEST [MANIFEST...]
$ docker manifest create username/test \
username/x8664-test \
username/arm64v8-test
```
当要修改一个 `manifest` 列表时可以加入 `-a` `--amend` 参数
## 设置 `manifest` 列表
```bash
# $ docker manifest annotate [OPTIONS] MANIFEST_LIST MANIFEST
$ docker manifest annotate username/test \
username/x8664-test \
--os linux --arch x86_64
$ docker manifest annotate username/test \
username/arm64v8-test \
--os linux --arch arm64 --variant v8
```
这样就配置好了 `manifest` 列表
## 查看 `manifest` 列表
```bash
$ docker manifest inspect username/test
```
## 推送 `manifest` 列表
最后我们可以将其推送到 Docker Hub
```bash
$ docker manifest push username/test
```
## 测试
我们在 `Linux x86_64` `Linux arm64v8` 中分别执行 `$ docker run -it --rm username/test` 命令发现可以正确的执行
## 官方博客
详细了解 `manifest` 可以阅读官方博客
* https://www.docker.com/blog/multi-arch-all-the-things/

View File

@@ -35,7 +35,8 @@ WORKDIR /go/src/github.com/go/helloworld/
COPY app.go .
RUN go get -d -v github.com/go-sql-driver/mysql \
RUN go mod init helloworld \
&& go get -d -v github.com/go-sql-driver/mysql \
&& CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . \
&& cp /go/src/github.com/go/helloworld/app /root

View File

@@ -16,17 +16,17 @@ $ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
比如
```bash
$ docker pull ubuntu:18.04
$ docker pull ubuntu:24.04
18.04: Pulling from library/ubuntu
92dc2a97ff99: Pull complete
be13a9d27eb8: Pull complete
c8299583700a: Pull complete
Digest: sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9c4361e321b26
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
Status: Downloaded newer image for ubuntu:24.04
docker.io/library/ubuntu:24.04
```
上面的命令中没有给出 Docker 镜像仓库地址因此将会从 Docker Hub `docker.io`获取镜像而镜像名称是 `ubuntu:18.04`因此将会获取官方镜像 `library/ubuntu` 仓库中标签为 `18.04` 的镜像`docker pull` 命令的输出结果最后一行给出了镜像的完整名称 `docker.io/library/ubuntu:18.04`
上面的命令中没有给出 Docker 镜像仓库地址因此将会从 Docker Hub `docker.io`获取镜像而镜像名称是 `ubuntu:24.04`因此将会获取官方镜像 `library/ubuntu` 仓库中标签为 `24.04` 的镜像`docker pull` 命令的输出结果最后一行给出了镜像的完整名称 `docker.io/library/ubuntu:24.04`
从下载过程中可以看到我们之前提及的分层存储的概念镜像是由多层存储所构成下载也是一层层的去下载并非单一文件下载过程中给出了每一层的 ID 的前 12 并且下载结束后给出该镜像完整的 `sha256` 的摘要以确保下载一致性
@@ -36,33 +36,33 @@ docker.io/library/ubuntu:18.04
## 运行
有了镜像后我们就能够以这个镜像为基础启动并运行一个容器以上面的 `ubuntu:18.04` 为例如果我们打算启动里面的 `bash` 并且进行交互式操作的话可以执行下面的命令
有了镜像后我们就能够以这个镜像为基础启动并运行一个容器以上面的 `ubuntu:24.04` 为例如果我们打算启动里面的 `bash` 并且进行交互式操作的话可以执行下面的命令
```bash
$ docker run -it --rm ubuntu:18.04 bash
$ docker run -it --rm ubuntu:24.04 bash
root@e7009c6ce357:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
VERSION="24.04 LTS (Noble Numbat)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
PRETTY_NAME="Ubuntu 24.04 LTS"
VERSION_ID="24.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
VERSION_CODENAME=noble
UBUNTU_CODENAME=noble
```
`docker run` 就是运行容器的命令具体格式我们会在 [容器](../container) 一节进行详细讲解我们这里简要的说明一下上面用到的参数
* `-it`这是两个参数一个是 `-i`交互式操作一个是 `-t` 终端我们这里打算进入 `bash` 执行一些命令并查看返回结果因此我们需要交互式终端
* `--rm`这个参数是说容器退出后随之将其删除默认情况下为了排障需求退出的容器并不会立即删除除非手动 `docker rm`我们这里只是随便执行个命令看看结果不需要排障和保留结果因此使用 `--rm` 可以避免浪费空间
* `ubuntu:18.04`这是指用 `ubuntu:18.04` 镜像为基础来启动容器
* `ubuntu:24.04`这是指用 `ubuntu:24.04` 镜像为基础来启动容器
* `bash`放在镜像名后的是 **命令**这里我们希望有个交互式 Shell因此用的是 `bash`
进入容器后我们可以在 Shell 下操作执行任何所需的命令这里我们执行了 `cat /etc/os-release`这是 Linux 常用的查看当前系统版本的命令从返回的结果可以看到容器内是 `Ubuntu 18.04.1 LTS` 系统
进入容器后我们可以在 Shell 下操作执行任何所需的命令这里我们执行了 `cat /etc/os-release`这是 Linux 常用的查看当前系统版本的命令从返回的结果可以看到容器内是 `Ubuntu 24.04 LTS` 系统
最后我们通过 `exit` 退出了这个容器

View File

@@ -6,7 +6,7 @@
### 系统要求
Docker 支持 64 位版本 CentOS 7/8并且要求内核版本不低于 3.10 CentOS 7 满足最低内核的要求但由于内核版本比较低部分功能 `overlay2` 存储层驱动无法使用并且部分功能可能不太稳定
Docker 支持 64 位版本 CentOS 7/8/9以及 Rocky Linux/AlmaLinux 8/9并且要求内核版本不低于 3.10 CentOS 7 满足最低内核的要求但由于内核版本比较低部分功能 `overlay2` 存储层驱动无法使用并且部分功能可能不太稳定对于 CentOS 8 及更高版本以及 Rocky Linux/AlmaLinux推荐使用 `dnf` 包管理器
### 卸载旧版本
@@ -22,7 +22,9 @@ $ sudo yum remove docker \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
docker-engine \
docker-ce-cli \
containerd.io
```
## 使用 yum 安装
@@ -30,7 +32,7 @@ $ sudo yum remove docker \
执行以下命令安装依赖包
```bash
$ sudo yum install -y yum-utils
$ sudo dnf install -y dnf-utils
```
鉴于国内网络问题强烈建议使用国内源官方源请在注释中查看
@@ -38,14 +40,14 @@ $ sudo yum install -y yum-utils
执行下面的命令添加 `yum` 软件源
```bash
$ sudo yum-config-manager \
$ sudo dnf config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
$ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/dnf.repos.d/docker-ce.repo
# 官方源
# $ sudo yum-config-manager \
# $ sudo dnf config-manager \
# --add-repo \
# https://download.docker.com/linux/centos/docker-ce.repo
```
@@ -53,15 +55,15 @@ $ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.r
如果需要测试版本的 Docker 请执行以下命令
```bash
$ sudo yum-config-manager --enable docker-ce-test
$ sudo dnf config-manager --enable docker-ce-test
```
### 安装 Docker
更新 `yum` 软件源缓存并安装 `docker-ce`
更新 `dnf` 软件源缓存并安装 `docker-ce`
```bash
$ sudo yum install docker-ce docker-ce-cli containerd.io
$ sudo dnf install docker-ce docker-ce-cli containerd.io
```
## CentOS8 额外设置

View File

@@ -65,7 +65,7 @@ $ echo \
```
>以上命令会添加稳定版本的 Docker APT 如果需要测试版本的 Docker 请将 stable 改为 test
>以上命令会添加稳定版本的 Docker APT 如果需要测试版本的 Docker 请将 stable 改为 test Debian11可能不使用`/etc/apt/keyrings/` 如gpg错误可以考虑更换为`/etc/apt/trusted.gpg.d` [issue 15727](https://github.com/docker/docs/issues/15727)。
### 安装 Docker

View File

@@ -1,8 +1,8 @@
# macOS 安装 Docker
# macOS
## 系统要求
[Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS 必须是 10.15 或更高版本, Catalina、Big Sur 或者 Monterey建议升级到最新版本的 macOS
[Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS Monterey 12.0 或更高版本,建议升级到最新版本的 macOS如 Sonoma 或 Ventura
## 安装
@@ -22,27 +22,27 @@ $ brew install --cask docker
如同 macOS 其它软件一样安装也非常简单双击下载的 `.dmg` 文件然后将那只叫 [Moby](https://www.docker.com/blog/call-me-moby-dock/) 的鲸鱼图标拖拽到 `Application` 文件夹即可(其间需要输入用户密码)。
![](./_images/install-mac-dmg.png)
![](../.gitbook/assets/install-mac-dmg.png)
## 运行
从应用中找到 Docker 图标并点击运行
![](./_images/install-mac-apps.png)
![](../.gitbook/assets/install-mac-apps.png)
运行之后会在右上角菜单栏看到多了一个鲸鱼图标这个图标表明了 Docker 的运行状态
![](./_images/install-mac-menubar.png)
![](../.gitbook/assets/install-mac-menubar.png)
每次点击鲸鱼图标会弹出操作菜单
![](./_images/install-mac-menu.png)
![](../.gitbook/assets/install-mac-menu.png)
之后你可以在终端通过命令检查安装后的 Docker 版本
```bash
$ docker --version
Docker version 20.10.0, build 7287ab3
Docker version 27.2.1, build 9e34c9b
```
如果 `docker version``docker info` 都正常的话可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/)
@@ -51,9 +51,9 @@ Docker version 20.10.0, build 7287ab3
$ docker run -d -p 80:80 --name webserver nginx
```
服务运行后可以访问 <http://localhost>,如果看到了 "Welcome to nginx!",就说明 Docker Desktop for Mac 安装成功了。
服务运行后可以访问 [http://localhost](http://localhost),如果看到了 "Welcome to nginx!",就说明 Docker Desktop for Mac 安装成功了。
![](./_images/install-mac-example-nginx.png)
![](../.gitbook/assets/install-mac-example-nginx.png)
要停止 Nginx 服务器并删除执行下面的命令

View File

@@ -1,16 +1,16 @@
# 镜像加速器
国内从 Docker Hub 拉取镜像有时会遇到困难此时可以配置镜像加速器国内很多云服务商都提供了国内加速器服务例如
国内从 Docker Hub 拉取镜像有时会遇到困难此时可以配置镜像加速器~~国内很多云服务商都提供了国内加速器服务例如~~
* [阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 左侧镜像工具 -> 镜像加速器 -> 复制加速器地址)](https://cr.console.aliyun.com/cn-hangzhou/instances)
* [网易云加速器 `https://hub-mirror.c.163.com`](https://www.163yun.com/help/documents/56918246390157312)
* [百度云加速器 `https://mirror.baidubce.com`](https://cloud.baidu.com/doc/CCE/s/Yjxppt74z#%E4%BD%BF%E7%94%A8dockerhub%E5%8A%A0%E9%80%9F%E5%99%A8)
**由于镜像服务可能出现宕机建议同时配置多个镜像各个镜像站测试结果请到 [docker-practice/docker-registry-cn-mirror-test](https://github.com/docker-practice/docker-registry-cn-mirror-test/actions) 查看。**
> 国内各大云服务商腾讯云阿里云百度云均提供了 Docker 镜像加速服务建议根据运行 Docker 的云平台选择对应的镜像加速服务具体请参考本页最后一小节
本节我们以 [网易云](https://www.163yun.com/) 镜像服务 `https://hub-mirror.c.163.com` 为例进行介绍。
本节我们以 [AtomHub 可信镜像中心](https://hub.atomgit.com/) 镜像服务 `https://hub.atomgit.com` 为例进行介绍。
> `hub.atomgit.com` 仅包含部分官方镜像可以满足初学者的使用
## Ubuntu 16.04+Debian 8+CentOS 7+
@@ -29,8 +29,7 @@ $ systemctl cat docker | grep '\-\-registry\-mirror'
```json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
"https://hub.atomgit.com"
]
}
```
@@ -46,13 +45,12 @@ $ sudo systemctl restart docker
## Windows 10
对于使用 `Windows 10` 的用户在任务栏托盘 Docker 图标内右键菜单选择 `Settings`打开配置窗口后在左侧导航菜单选择 `Docker Engine`在右侧像下边一样编辑 json 文件之后点击 `Apply & Restart` 保存后 Docker 就会重启并应用配置的镜像地址了
对于使用 `Windows 10` 的用户在任务栏托盘 Docker 图标内右键菜单选择 `Change settings`打开配置窗口后在左侧导航菜单选择 `Docker Engine`在右侧像下边一样编辑 json 文件之后点击 `Apply & Restart` 保存后 Docker 就会重启并应用配置的镜像地址了
```json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
"https://hub.atomgit.com"
]
}
```
@@ -64,8 +62,7 @@ $ sudo systemctl restart docker
```json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
"https://hub.atomgit.com"
]
}
```
@@ -76,7 +73,7 @@ $ sudo systemctl restart docker
```bash
Registry Mirrors:
https://hub-mirror.c.163.com/
https://hub.atomgit.com/
```
## `k8s.gcr.io` 镜像
@@ -100,6 +97,8 @@ $ docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/xxx
* https://dockerhub.azk8s.cn **已转为私有**
* https://reg-mirror.qiniu.com
* https://registry.docker-cn.com
* https://hub-mirror.c.163.com
* https://mirror.baidubce.com
建议 **watch页面右上角** [镜像测试](https://github.com/docker-practice/docker-registry-cn-mirror-test) 这个 GitHub 仓库,我们会在此更新各个镜像地址的状态。

View File

@@ -1,14 +1,12 @@
# 离线部署Docker
# Linux 离线安装
[TOC]
\[TOC]
生产环境中一般都是没有公网资源的本文介绍如何在生产服务器上离线部署`Docker`
括号内的字母表示该操作需要在哪些服务器上执行
<img src="_images/image-20200412202617411.png" alt="Docker-offile-install-top" style="zoom:30%;" />
![Docker-offile-install-top](../.gitbook/assets/image-20200412202617411.png)
## Centos7 离线安装Docker
@@ -16,7 +14,7 @@
推荐这种方式是因为在生产环境种一般会选定某个指定的文档软件版本使用
#### 查询可用的软件版本(A)
#### 查询可用的软件版本(A)
```bash
#下载清华的镜像源文件
@@ -77,28 +75,32 @@ Background downloading packages, then exiting:
Total 118 MB/s | 87 MB 00:00:00
exiting because "Download Only" specified
```
#### 复制到目标服务器之后进入文件夹安装(C-N)
* 离线安装时必须使用rpm命令不检查依赖的方式安装
```bash
rpm -Uvh *.rpm --nodeps --force
```
#### 锁定软件版本(C-N)
##### 下载锁定版本软件
**下载锁定版本软件**
可参考下文的网络源搭建
```bash
sudo yum install yum-plugin-versionlock
```
##### 锁定软件版本
**锁定软件版本**
```bash
sudo yum versionlock add docker
```
##### 查看锁定列表
**查看锁定列表**
```bash
sudo yum versionlock list
@@ -110,7 +112,7 @@ Loaded plugins: fastestmirror, versionlock
versionlock list done
```
##### 锁定后无法再更新
**锁定后无法再更新**
```bash
sudo yum install docker-ce
@@ -121,7 +123,7 @@ Package 3:docker-ce-24.0.4-1.el7.x86_64 already installed and latest version
Nothing to do
```
##### 解锁指定软件
**解锁指定软件**
```bash
sudo yum versionlock delete docker-ce
@@ -133,14 +135,12 @@ Deleting versionlock for: 3:docker-ce-24.0.4-1.el7.*
versionlock deleted: 1
```
##### 解锁所有软件
**解锁所有软件**
```bash
sudo yum versionlock delete all
```
### YUM 本地源服务器搭建安装Docker
#### 挂载 ISO 镜像搭建本地 File AB
@@ -170,8 +170,6 @@ yum clean all
yum install createrepo -y
```
#### 根据本地文件搭建BASE网络源B
```bash
@@ -245,5 +243,3 @@ sudo yum makecache fast
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
```

View File

@@ -6,23 +6,30 @@
### 系统要求
Docker 支持以下版本的 [Ubuntu](https://ubuntu.com/server) 操作系统:
Docker 支持诸多版本的 [Ubuntu](https://ubuntu.com/server) 操作系统。但是较旧的版本上将不会有Docker新版本的持续更新以截至2024年中的几个 Ubuntu LTSLong Term Support长期支持版本为例
* Ubuntu Hirsute 21.04
* Ubuntu Groovy 20.10
* Ubuntu Focal 20.04 (LTS)
* Ubuntu Bionic 18.04 (LTS)
* 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
Docker 可以安装在 64 位的 x86 平台或 ARM 平台Ubuntu 发行版中LTSLong-Term-Support长期支持版本会获得 5 年的升级维护支持这样的版本会更稳定因此在生产环境中推荐使用 LTS 版本
Ubuntu LTS 版本上目前 Docker 支持 amd64arm64armhfppc64els390x 5 平台而非 LTS 版本支持的平台通常较少同时LTS 版本会获得 5 年的升级维护支持这样的系统会获得更长期的安全保障因此在生产环境中推荐使用 LTS 版本
### 卸载旧版本
旧版本的 Docker 称为 `docker` 或者 `docker-engine`使用以下命令卸载旧版本
```bash
$ sudo apt-get remove docker \
docker-engine \
docker.io
$ for pkg in docker \
docker-engine \
docker.io \
docker-doc \
podman-docker \
containerd \
runc;
do
sudo apt remove $pkg;
done
```
## 使用 APT 安装
@@ -30,9 +37,9 @@ $ sudo apt-get remove docker \
由于 `apt` 源使用 HTTPS 以确保软件下载过程中不被篡改因此我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书
```bash
$ sudo apt-get update
$ sudo apt update
$ sudo apt-get install \
$ sudo apt install \
apt-transport-https \
ca-certificates \
curl \
@@ -73,9 +80,9 @@ $ echo \
更新 apt 软件包缓存并安装 `docker-ce`
```bash
$ sudo apt-get update
$ sudo apt update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ sudo apt install docker-ce docker-ce-cli containerd.io
```
## 使用脚本自动安装

View File

@@ -1,4 +1,4 @@
# Windows 10 安装 Docker
# Windows 10/11
## 系统要求
@@ -12,13 +12,13 @@
下载好之后双击 `Docker Desktop Installer.exe` 开始安装
**使用 [winget](https://docs.microsoft.com/zh-cn/windows/package-manager/) 安装**
**使用** [**winget**](https://docs.microsoft.com/zh-cn/windows/package-manager/) **安装**
```powershell
$ winget install Docker.DockerDesktop
```
## WSL2 运行 Docker
## WSL2 运行 Docker
若你的 Windows 版本为 Windows 10 专业版或家庭版 v1903 及以上版本可以使用 WSL2 运行 Docker具体请查看 [Docker Desktop WSL 2 backend](https://docs.docker.com/docker-for-windows/wsl/)。
@@ -26,11 +26,11 @@ $ winget install Docker.DockerDesktop
Windows 搜索栏输入 **Docker** 点击 **Docker Desktop** 开始运行
![](./_images/install-win-docker-app-search.png)
![](../.gitbook/assets/install-win-docker-app-search.png)
Docker 启动之后会在 Windows 任务栏出现鲸鱼图标
![](./_images/install-win-taskbar-circle.png)
![](../.gitbook/assets/install-win-taskbar-circle.png)
等待片刻当鲸鱼图标静止时说明 Docker 启动成功之后你可以打开 PowerShell 使用 Docker

View File

@@ -2,8 +2,22 @@
本章将带领你进入 **Docker** 的世界
什么是 **Docker**
## 本章内容
用它会带来什么样的好处
* [什么是 Docker](what.md)
* 介绍 Docker 的起源发展历程以及其背后的核心技术Cgroups, Namespaces, UnionFS
* 了解 Docker 是如何改变软件交付方式的
* [为什么要用 Docker](why.md)
* 对比传统虚拟机技术阐述 Docker 在启动速度资源利用率交付效率等方面的巨大优势
* 探讨 Docker DevOps微服务架构中的关键作用
## 学习目标
通过本章的学习你将能够
1. 理解 Docker 的核心概念与架构
2. 明白 Docker 解决了现代软件开发与运维中的哪些痛点
3. 建立起对容器技术的初步认知为后续的实战操作打下基础
好吧让我们带着问题开始这神奇之旅

View File

@@ -1,6 +1,6 @@
# 什么是 Docker
**Docker** 最初是 `dotCloud` 公司创始人 [Solomon Hykes](https://github.com/shykes) 在法国期间发起的一个公司内部项目,它是基于 `dotCloud` 公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源][docker-soft],主要项目代码在 [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`。
@@ -16,8 +16,6 @@
下面的图片比较了 **Docker** 和传统虚拟化方式的不同之处传统虚拟机技术是虚拟出一套硬件后在其上运行一个完整操作系统在该系统上再运行所需应用进程而容器内的应用进程直接运行于宿主的内核容器内没有自己的内核而且也没有进行硬件虚拟因此容器要比传统虚拟机更为轻便
![传统虚拟化](./_images/virtualization.png)
![传统虚拟化](../.gitbook/assets/virtualization.png)
![Docker](./_images/docker.png)
[docker-soft]:https://en.wikipedia.org/wiki/Docker_(software)
![Docker](../.gitbook/assets/docker.png)

View File

@@ -1,6 +1,6 @@
# 基本概念
![](./_images/kubernetes_design.jpg)
![](../.gitbook/assets/kubernetes_design.jpg)
* 节点`Node`一个节点是一个运行 Kubernetes 中的主机
* 容器组`Pod`一个 Pod 对应于由若干容器组成的一个容器组同个组内的容器共享一个存储卷(volume)
@@ -59,15 +59,15 @@ Kubernetes 校验节点可用依赖于 ID。在当前的版本中有两个接
### 节点控制
Kubernetes 主节点中节点控制器是用来管理节点的组件主要包含
* 集群范围内节点同步
* 单节点生命周期管理
节点控制有一个同步轮询主要监听所有云平台的虚拟实例会根据节点状态创建和删除可以通过 `--node_sync_period`标志来控制该轮询如果一个实例已经创建节点控制将会为其创建一个结构同样的如果一个节点被删除节点控制也会删除该结构 Kubernetes 启动时可用通过 `--machines`标记来显示指定节点同样可以使用 `kubectl` 来一条一条的添加节点两者是相同的通过设置 `--sync_nodes=false`标记来禁止集群之间的节点同步你也可以使用 api/kubectl 命令行来增删节点
节点控制有一个同步轮询主要监听所有云平台的虚拟实例会根据节点状态创建和删除可以通过 `--node_sync_period`标志来控制该轮询如果一个实例已经创建节点控制将会为其创建一个结构同样的如果一个节点被删除节点控制也会删除该结构 Kubernetes 启动时可用通过 `--machines`标记来显示指定节点同样可以使用 `kubectl` 来一条一条的添加节点两者是相同的通过设置 `--sync_nodes=false`标记来禁止集群之间的节点同步你也可以使用 api/kubectl 命令行来增删节点
## 容器组
Kubernetes 使用的最小单位是容器组容器组是创建调度管理的最小单位
一个容器组使用相同的 Docker 容器并共享卷挂载点一个容器组是一个特定应用的打包集合包含一个或多个容器
Kubernetes 使用的最小单位是容器组容器组是创建调度管理的最小单位 一个容器组使用相同的 Docker 容器并共享卷挂载点一个容器组是一个特定应用的打包集合包含一个或多个容器
和运行的容器类似一个容器组被认为只有很短的运行周期容器组被调度到一组节点运行直到容器的生命周期结束或者其被删除如果节点死掉运行在其上的容器组将会被删除而不是重新调度也许在将来的版本中会添加容器组的移动
@@ -133,50 +133,56 @@ Kubernetes 校验节点可用依赖于 ID。在当前的版本中有两个接
举例如下
* 容器组状态 `running` 1 容器容器正常退出
* 记录完成事件
* 如果重启策略为
* 始终重启容器容器组保持 `running`
* 失败时容器组变为 `succeeded`
* 从不容器组变为 `succeeded`
* 记录完成事件
* 如果重启策略为
* 始终重启容器容器组保持 `running`
* 失败时容器组变为 `succeeded`
* 从不容器组变为 `succeeded`
* 容器组状态 `running`有1容器容器异常退出
* 记录失败事件
* 如果重启策略为
* 始终重启容器容器组保持 `running`
* 失败时重启容器容器组保持 `running`
* 从不容器组变为 `failed`
* 记录失败事件
* 如果重启策略为
* 始终重启容器容器组保持 `running`
* 失败时重启容器容器组保持 `running`
* 从不容器组变为 `failed`
* 容器组状态 `running`有2容器有1容器异常退出
* 记录失败事件
* 如果重启策略为
* 始终重启容器容器组保持 `running`
* 失败时重启容器容器组保持 `running`
* 从不容器组保持 `running`
* 当有2容器退出
* 记录失败事件
* 如果重启策略为
* 始终重启容器容器组保持 `running`
* 失败时重启容器容器组保持 `running`
* 从不容器组变为 `failed`
* 容器组状态 `running`容器内存不足
* 标记容器错误中断
* 记录内存不足事件
* 记录失败事件
* 如果重启策略为
* 始终重启容器容器组保持 `running`
* 失败时重启容器容器组保持 `running`
* 从不容器组保持 `running`
* 当有2容器退出
* 记录失败事件
* 如果重启策略为
* 始终重启容器容器组保持 `running`
* 失败时重启容器容器组保持 `running`
* 从不记录错误事件容器组变为 `failed`
* 始终重启容器容器组保持 `running`
* 失败时重启容器容器组保持 `running`
* 从不容器组变为 `failed`
* 容器组状态 `running`容器内存不足
* 标记容器错误中断
* 记录内存不足事件
* 如果重启策略为
* 始终重启容器容器组保持 `running`
* 失败时重启容器容器组保持 `running`
* 从不记录错误事件容器组变为 `failed`
* 容器组状态 `running`一块磁盘死掉
* 杀死所有容器
* 记录事件
* 容器组变为 `failed`
* 如果容器组运行在一个控制器下容器组将会在其他地方重新创建
* 杀死所有容器
* 记录事件
* 容器组变为 `failed`
* 如果容器组运行在一个控制器下容器组将会在其他地方重新创建
* 容器组状态 `running`对应的节点段溢出
* 节点控制器等到超时
* 节点控制器标记容器组 `failed`
* 如果容器组运行在一个控制器下容器组将会在其他地方重新创建
* 节点控制器等到超时
* 节点控制器标记容器组 `failed`
* 如果容器组运行在一个控制器下容器组将会在其他地方重新创建
## Replication Controllers
## 服务
##
## 标签
## 接口权限
## web界面
## 命令行操作

View File

@@ -1,9 +1,11 @@
# 基本架构
# 架构设计
任何优秀的项目都离不开优秀的架构设计本小节将介绍 Kubernetes 在架构方面的设计考虑
## 基本考虑
如果让我们自己从头设计一套容器管理平台有如下几个方面是很容易想到的
* 分布式架构保证扩展性
* 逻辑集中式的控制平面 + 物理分布式的运行平面
* 一套资源调度系统管理哪个容器该分配到哪个节点上
@@ -13,7 +15,7 @@
下面这张图完整展示了 Kubernetes 的运行原理
![Kubernetes 架构](./_images/k8s_architecture.png)
![Kubernetes 架构](../.gitbook/assets/k8s_architecture.png)
可见Kubernetes 首先是一套分布式系统由多个节点组成节点分为两类一类是属于管理平面的主节点/控制节点Master Node一类是属于运行平面的工作节点Worker Node
@@ -22,6 +24,7 @@
从这张图上我们没有能发现 Kubernetes 中对于控制平面的分布式实现但是由于数据后端自身就是一套分布式的数据库 Etcd因此可以很容易扩展到分布式实现
## 控制平面
### 主节点服务
主节点上需要提供如下的管理服务
@@ -31,6 +34,7 @@
* `controller-manager` 负责管理控制器包括 endpoint-controller刷新服务和 pod 的关联信息 replication-controller维护某个 pod 的复制为配置的数值
### Etcd
这里 Etcd 即作为数据后端又作为消息中间件
通过 Etcd 来存储所有的主节点上的状态信息很容易实现主节点的分布式扩展
@@ -38,7 +42,8 @@
组件可以自动的去侦测 Etcd 中的数值变化来获得通知并且获得更新后的数据来执行相应的操作
## 工作节点
* kubelet 是工作节点执行操作的 agent负责具体的容器生命周期管理根据从数据库中获取的信息来管理容器并上报 pod 运行状态等
* kube-proxy 是一个简单的网络访问代理同时也是一个 Load Balancer它负责将访问到某个服务的请求具体分配给工作节点上的 Pod同一类标签
![Proxy 代理对服务的请求](./_images/kube-proxy.png)
![Proxy 代理对服务的请求](../.gitbook/assets/kube-proxy.png)

View File

@@ -1,6 +1,6 @@
# 项目简介
# 简介
![](./_images/kubernetes_logo.png)
![](../.gitbook/assets/kubernetes_logo.png)
Kubernetes Google 团队发起的开源项目它的目标是管理跨多个主机的容器提供基本的部署维护以及应用伸缩主要实现语言为 Go 语言Kubernetes

Some files were not shown because too many files have changed in this diff Show More