File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -16,10 +16,10 @@ icon: simple/python
1616
1717!!! note "特点"
1818
19- - 社区生态完善,有大量的第三方库 ,例如 Django、Flask、numpy、pandas 等。
19+ - 社区生态完善,有大量的第三方库和框架 ,例如 Django、Flask、numpy、pandas 等。
2020 - 语法简洁,易于学习,适合初学者。
2121 - 「年长但恰逢新春」, 即没有 C++ 那样的历史包袱,也没有新型语言那样的不稳定性、不成熟性。
22- - 类型检查不严格,但是也有完整的类型检查工具 ( mypy)。
22+ - 类型检查不严格,但是也有完整的类型检查工具,如久经考验的 mypy 和新时代工具 [ty](https://docs.astral.sh/ty/ )。
2323
2424参考资料:
2525
Original file line number Diff line number Diff line change @@ -209,7 +209,7 @@ getent -s files hosts example.com
209209 ```
210210
211211 不过,如果 `/etc/hosts` 里面忘写了/忘改了对应的条目,那么就可能会出现非预期的行为。例如,如果忘记添加 `localhost`,那么有些程序就可能会因为无法解析 `localhost` 而出现问题。
212-
212+
213213 systemd-hostnamed 服务则负责管理系统的主机名——静态的主机名(static hostname)仍然在 `/etc/hostname` 中,用户可读的主机名(pretty hostname,比如说 "Xiao Ming's Computer" 或者 "我的电脑" 这种有空格、特殊字符,甚至汉字的名字)等存储在 `/etc/machine-info` 中,同时其也会记录从网络(例如 DHCP)获取的主机名(transient hostname)。而 `myhostname` 模块就是 systemd-hostnamed 提供的 NSS 模块,确保系统主机名总是可以被正确解析,请看下面的例子:
214214
215215 ```console
@@ -245,6 +245,13 @@ glibc 的 `getaddrinfo()` 默认根据 RFC 3484 的规则对返回的结果进
245245
246246RFC 3484 的排序包含两者:源地址选择(source address selection)和目的地址选择(destination address selection)。这里只涉及目的地址选择。目的地址选择具体的规则可以阅读 RFC 的[ 第 6 节] ( https://www.rfc-editor.org/rfc/rfc3484#section-6 ) 。其中需要了解的是 [ Policy Table(第 2.1 节)] ( https://www.rfc-editor.org/rfc/rfc3484#section-2.1 ) ,它是一个最长匹配的前缀表,对每个在表中的前缀定义了优先级(Precedence)和标签(Label),这些值会影响排序结果。` gai.conf ` 配置的其实就是这个表。
247247
248+ 简而言之,RFC 3484 规定的地址选择顺序是:
249+
250+ 1 . 避免不可用的地址、避免不匹配的 scope、避免 deprecated 的地址;
251+ 2 . 优先选择具有相同 Label 的源地址和目的地址;
252+ 3 . 优先选择 Precedence 较高的目的地址(数值越大则优先级越高);
253+ 4 . 其他规则,如原生 IPv4 地址优先于 6to4 / Teredo、最长前缀匹配原则等。
254+
248255最常见需要修改 ` gai.conf ` 的情况是希望优先使用 IPv4 地址。在进行目的地址选择时,IPv4 地址会映射到 ` ::ffff:0:0/96 ` 前缀(例如 ` 1.1.1.1 ` 会映射到 ` ::ffff:101:101 ` ),而默认情况它的优先级是 10,比其他的 IPv6 地址都要低。因此如果希望优先使用 IPv4 地址,可以添加如下配置:
249256
250257``` text title="/etc/gai.conf"
Original file line number Diff line number Diff line change @@ -1022,10 +1022,10 @@ Docker 会在 filter 表的 `FORWARD` 链中添加这样的规则:
10221022
10231023#### IPv6
10241024
1025- Docker 默认未开启 IPv6, 并且在比较老的版本中,配置 IPv6 会比较麻烦。
1025+ 在 Docker 27.0 版本以前,IPv6 默认是不开启的; 并且在比较老的版本中,配置 IPv6 会比较麻烦。
10261026一个重要的原因是:Docker 对 IPv4 的策略是配置 NAT 网络,但在 IPv6 的设计中,NAT 不是很「原教旨主义」(毕竟 IPv6 的地址多得用不完,为什么还要有状态的 NAT 呢?)。这就导致了在之前,Docker 中配置可用的 IPv6 就需要:
10271027
1028- - 要么每个容器一个公网 IPv6 地址(否则容器无法连接外部的 IPv6 网络)。要这么做的前提是得知道自己能控制的 IPv6 段,并且容器打开的所有端口都会暴露在公网上。
1028+ - 要么每个容器一个公网 IPv6 地址(否则容器无法连接外部的 IPv6 网络)。要这么做的前提是得知道自己能控制的 IPv6 段,并且容器打开的所有端口都会暴露在公网上(除非配置了防火墙) 。
10291029- 使用[ 第三方的方案] ( https://github.com/robbertkl/docker-ipv6nat ) 帮忙做 IPv6 NAT,同时给容器分配 IPv6 的 ULA(Unique Local Address)地址段(目前可以分配 fd00::/8 内的地址段)。
10301030
10311031不过好消息是,目前 Docker 添加了对 IPv6 NAT 的实验性支持,尽管默认的 bridge 网络的 IPv6 支持(基于 ip6tables)[ 在 27.0 版本后才默认打开] ( https://docs.docker.com/engine/release-notes/27/#ipv6 ) 。如果正在使用 27.0 之前的版本,参考[ 对应的文档] ( https://docs.docker.com/config/daemon/ipv6/ ) [ ^ ipv6-docaddr ] ,一个配置 daemon.json 的例子如下:
@@ -1062,6 +1062,11 @@ PING mirrors.ustc.edu.cn(2001:da8:d800:95::110 (2001:da8:d800:95::110)) 56 data
1062106264 bytes from 2001:da8:d800:95::110 (2001:da8:d800:95::110): icmp_seq=1 ttl=62 time=2.42 ms
10631063```
10641064
1065+ !!! warning "IPv6 与 IPv4 的优先级"
1066+
1067+ 由于 RFC 3848 对 IPv6 公网地址(Global Unique Address)和 ULA 规定了不同的优先级,为容器分配 ULA 时,容器内的应用程序仍然可能优先使用 IPv4。
1068+ 此问题在 [DNS](../../network-service/dns.md##addr-sort-and-gai-conf) 一页有更详细的介绍。
1069+
10651070!!! note "ip6tables"
10661071
10671072 注意在以上配置(旧版本手工启用,或者新版本默认)的情况下,系统的 ip6tables 配置会被 Docker 管理。在某些环境下,这可能会干扰系统管理员做的其他配置。如果你已经设置了 `"iptables": false`,那么很有可能你也会需要设置 `"ip6tables": false`。
You can’t perform that action at this time.
0 commit comments