Logo

site iconHiFeng

主要分享Linux、VPS相关的信息。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

HiFeng RSS 预览

PowerDNS 权威服务器基于 LUA Records 实现 CNAME Flattening

2026-03-04 12:14:07

1. 背景与问题

在 DNS 中,CNAME 记录不能设置在 zone apex(根域名)上,例如 example.com 本身不能是 CNAME,只有子域名如 www.example.com 可以。这是 DNS 标准的限制。

CNAME Flattening 是一种技术手段,允许在根域名上实现类似 CNAME 的效果,即将根域名指向另一个域名,并动态解析出真实 IP 返回给客户端。

PowerDNS 提供了 ALIAS 记录类型来解决这个问题,但 ALIAS 类型存在一个缺陷:不支持 DNSSEC live-signing(实时签名)。

使用 LUA Records 可以同时解决 CNAME Flattening 和 DNSSEC 签名两个问题

2. 环境要求

在开始之前,请确认以下条件:

•PowerDNS Authoritative Server 4.x 及以上版本

•编译时包含 lua-records 支持(运行 pdns_server --version 确认 Features 中包含 lua-records)

•使用 gmysql 或其他数据库后端

•DNSSEC 使用 live-signing 模式(不是预签名模式)

验证 LUA records 支持:

pdns_server --version

输出的 Features 字段中应包含 lua-records。

3. PowerDNS 配置

3.1 启用 LUA Records

编辑 PowerDNS 配置文件(通常是 /etc/powerdns/pdns.conf 或 /etc/powerdns/pdns.d/ 目录下的配置文件),添加以下配置:

enable-lua-records=yes

同时确保配置了 resolver,LUA records 解析目标域名时需要用到:

resolver=8.8.8.8:53

重启 PowerDNS 使配置生效:

systemctl restart pdns

3.2 完整配置示例

以下是一份包含 LUA records 的完整配置示例:

launch=gmysql
gmysql-host=localhost
gmysql-user=root
gmysql-dbname=powerdns
gmysql-password=yourpassword
gmysql-dnssec=yes
enable-lua-records=yes
resolver=8.8.8.8:53
local-address=0.0.0.0 ::
local-port=53

4. 创建 Zone 并添加 LUA 记录

4.1 创建 Zone

使用 pdnsutil 创建 zone(如果已存在可跳过):

pdnsutil create-zone example.com ns1.example.com

4.2 添加 LUA CNAME 记录

使用 pdnsutil 在根域名上添加 LUA 类型的 CNAME 记录:

pdnsutil add-record example.com @ LUA "CNAME \";return 'target.example.net.'\""

实际命令示例(将 example.com 指向 hicairo.com):

pdnsutil add-record example.com @ LUA "CNAME \";return 'hicairo.com.'\""

注意:LUA 记录中的域名需要用单引号包裹,作为 Lua 字符串返回。末尾的点(.)表示绝对域名,建议保留。

4.3 验证记录

查看 zone 中的所有记录:

pdnsutil list-zone example.com

预期输出应包含:

example.com  3600  IN  LUA  CNAME ";return 'hicairo.com.'"

5. 启用 DNSSEC

5.1 对 Zone 签名

使用 pdnsutil 对 zone 启用 DNSSEC:

pdnsutil secure-zone example.com

更新 NSEC 排序信息:

pdnsutil rectify-zone example.com

5.2 查看签名信息

查看 zone 的 DNSSEC 详情,包括 DS 记录(需要提交到上级域):

pdnsutil show-zone example.com

输出示例:

ID = 1 (CSK), flags = 257, tag = 52822, algo = 13, bits = 256  Active  Published
DS = example.com. IN DS 52822 13 2 99ebc97b...

注意:需要将 DS 记录提交到域名注册商,才能完成 DNSSEC 信任链的建立。

6. 测试验证

6.1 测试 CNAME 查询

直接查询权威服务器:

dig @127.0.0.1 example.com CNAME

预期返回:

example.com.  3600  IN  CNAME  hicairo.com.

6.2 测试 A 记录查询

查询 A 记录,递归解析器会自动跟随 CNAME 解析出 IP:

dig @8.8.8.8 example.com A

预期返回 CNAME 记录以及目标域名的 A 记录(IP 地址)。

6.3 测试 DNSSEC 签名

使用 +dnssec 参数验证签名:

dig @127.0.0.1 example.com CNAME +dnssec

预期返回中应包含 RRSIG 记录:

example.com.  3600  IN  CNAME  hicairo.com.
example.com.  3600  IN  RRSIG  CNAME 13 2 3600 ...

通过公网 DNS(如 8.8.8.8)验证,响应 flags 中应包含 ad(Authenticated Data)标志,表示 DNSSEC 验证通过:

dig @8.8.8.8 example.com CNAME +dnssec
;; flags: qr rd ra ad;

7. LUA Records 语法说明

7.1 基本格式

LUA records 的存储格式为:

LUA  <DNS类型>  "<Lua代码>"

其中 Lua 代码需要用双引号包裹,代码本身返回一个字符串作为 DNS 记录的内容。

7.2 固定 CNAME 示例

将域名固定指向另一个域名:

LUA  CNAME  ";return 'target.example.net.'"

7.3 与 ALIAS 类型的区别

特性

ALIAS 类型

LUA 类型

CNAME Flattening

支持

支持

DNSSEC live-signing

不支持

支持

zone apex 使用

支持

支持

灵活性

固定指向

可编程,支持条件逻辑

PowerDNS 版本要求

4.x+

4.x+

8. 常见问题

8.1 查询返回 SERVFAIL

检查 LUA 代码语法是否正确,查看 PowerDNS 日志:

journalctl -fu pdns.service

日志中会显示 Lua record reported 错误信息,根据提示修正 Lua 代码。

8.2 A 记录查询只返回 CNAME 不返回 IP

这是正常行为。PowerDNS 作为权威服务器返回 CNAME,客户端的递归解析器会自动继续解析目标域名的 A 记录。使用 8.8.8.8 等公共递归解析器测试可以看到完整结果。

8.3 DNSSEC 验证失败

确认已执行以下步骤:

•pdnsutil secure-zone 对 zone 签名

•pdnsutil rectify-zone 更新 NSEC 排序

•DS 记录已提交到域名注册商

•等待 DS 记录在全球 DNS 传播(通常需要几小时到 24 小时)

9. 总结

使用 LUA Records 实现 CNAME Flattening 的优势:

•完全支持 DNSSEC live-signing,解决了 ALIAS 类型的历史遗留问题

•只需要 gmysql 单后端,无需额外的 HTTP 后端服务

•配置简单,只需一条 LUA 记录即可实现

•支持复杂的条件逻辑(如按地理位置返回不同的目标域名)

关键命令速查:

# 添加 LUA CNAME 记录
pdnsutil add-record example.com @ LUA "CNAME \";return 'target.example.net.'\""

# 启用 DNSSEC
pdnsutil secure-zone example.com
pdnsutil rectify-zone example.com

# 验证
dig @127.0.0.1 example.com CNAME +dnssec



本文出处:HiFeng's Blog
本文链接:https://www.hicairo.com/post/83.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!

将 HiDNS 免费域名托管到 gcore.com

2025-03-29 16:22:22

HiDNS 是一个免费的三级域名申请平台,只要你不进行滥用,原则上可以永久免费。将 HiDNS 域名托管到 Gcore ,可以使用 Gcore 的 CDN 服务,同时由于 Gcore 的 DNS 支持 CNAME Flattening,可以解决在根域设置 CNAME 记录的问题。

1、登录 HiDNS 域名的管理面板,点击“名稱伺服器”,填入 Gcore 的 NS 服务器地址后,点击“提交”按钮。

Gcore 的 NS 服务器地址为:
ns1.gcorelabs.net
ns2.gcdn.services

01.webp

2、登录 Gcore 的管理面板,首先点击左侧菜单中的“Managed DNS”按钮,然后点击右侧面板中的“添加区域”。

02.webp

3、以 example.hidns.co 为例,输入域名后点击“Create Zone”按钮。

03.webp

4、点击“确认”按钮。

04.webp

5、再次点击“确认”按钮。

05.webp

6、出现以下界面,说明域名已经成功托管到 Gcore,您可以点击“添加”按钮,添加 A / AAAA / CNAME 记录等。

06.webp

7、有关 CNAME 记录。由于 RFC 1034 & RFC 2181 规定 CNAME 不能与其他记录共存,但根域必须有 SOA(Start of Authority)和 NS(Name Server)记录,以便 DNS 解析系统正常工作,如果在根域设置 CNAME,就无法再设置 NS 和 SOA,会导致整个 DNS 解析失败。因此我们发现传统 DNS 服务提供商,均不支持在根域上设置 CNAME 记录。Gocre 采用了 CNAME Flattening 机制,很好的解决了在根域上设置 CNAME 的问题。例如我们想为 example.hidns.co 设置指向 example.github.io 的 CNAME 记录,就可以使用 Gocre 来实现。

同上一步,点击“添加”按钮后,然后将类型选择为“CNAME”,在内容文本框内填入“example.github.io”最后点击“添加”按钮即可。

注意:如果添加 CNAME 记录失败,请检查是否已经存在 A / AAAA 记录,删除即可。

07.webp


以下为非必须的操作



8、开启 DNSSEC ,解决传统 DNS 存在的安全问题。在 Gcore 的管理面板里打开“接口模式”按钮,然后打开“DNSSEC”按钮,这时弹出的菜单询问“Are you sure you want to enable DNSSEC?”,点击“Yes,enable”按钮。

08.webp

9、点击 DS record 后面的“COPY”按钮,将 copy 出来的内容粘贴到一个记事本文件中。

09.webp

example.hidns.co. 3600 IN DS 1036 13 2 3E6CBD9ACC39A930AA29843BBF6B7B222D2470C2937667CF519BA3B70A1009C1
1036 13 2 3E6CBD9ACC39A930AA29843BBF6B7B222D2470C2937667CF519BA3B70A1009C1

10、再次登录 HiDNS 域名的管理面板,为 example.hidns.co 新建一条 DS 记录。如下图,Type 选择“DS”,Name 输入“@”,Value输入“1036 13 2 3E6CBD9ACC39A930AA29843BBF6B7B222D2470C2937667CF519BA3B70A1009C1”,最后点击后面的“加号”。

注意:在添加DS记录时,我们去掉了上一步copy出来内容中的前段部分“example.hidns.co. 3600 IN DS ”。

10.webp

11、验证 example.hidns.co 是否开启 DNSSEC 成功。

root@hcss-ecs-c37d:~# dig @8.8.8.8 example.hidns.co +dnssec
; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> @8.8.8.8 example.hidns.co +dnssec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52677
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 512
;; QUESTION SECTION:
;example.hidns.co.              IN      A
;; ANSWER SECTION:
example.hidns.co.       600     IN      CNAME   example.github.io.
example.hidns.co.       600     IN      RRSIG   CNAME 13 3 600 20250331093148 20250329043148 37058 example.hidns.co. tzHTSQ5bXz+92T4DSJmUdYvLd6EY0FVqfjCoouQ+6ydvQc+DvVEcoCjM CRbuSRFOd6xeDo9gp3+KxI5djBFSuA==
example.github.io.      3600    IN      A       185.199.110.153
example.github.io.      3600    IN      A       185.199.109.153
example.github.io.      3600    IN      A       185.199.111.153
example.github.io.      3600    IN      A       185.199.108.153
;; Query time: 628 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Sat Mar 29 15:31:48 CST 2025
;; MSG SIZE  rcvd: 252

我们可以看到,dig 的返回结果中包含了 RRSIG 记录,这表明 DNSSEC 已经生效,并且返回的 CNAME 记录也经过了签名。说明 DNSSEC 已成功启用。


本文出处:HiFeng's Blog
本文链接:https://www.hicairo.com/post/82.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!

在 Ubuntu 22.04 上配置 MySQL 数据库同步(主从复制)

2025-02-21 11:45:34

这篇教程我将带领大家在 Ubuntu 22.04 上配置 MySQL 数据库的同步,实现 MySQL 数据库一主一从复制,我们将采用 GTID 模式进行配置。

GTID(Global Transaction Identifier,全球事务标识符)模式是 MySQL 5.6 引入的一个重要特性,相比传统的基于日志位置的复制方式,GTID 模式具有以下优点:

简化复制配置:GTID 模式不需要手动记录二进制日志的文件名和位置,复制配置更加简洁。

事务一致性:每个事务都有唯一的 GTID,能够确保主从服务器之间的事务一致性。

自动故障转移:当主服务器发生故障时,可以更容易地选择新的主服务器并自动恢复复制。

避免数据丢失:GTID 模式避免了传统复制中可能出现的数据丢失问题,确保主从之间的同步更为可靠。

1. 在主从服务器上分别安装 MySQL

首先,更新系统并安装 MySQL 服务:

sudo apt update
sudo apt upgrade -y
sudo apt install mysql-server mysql-client

安装完毕后,你可以通过以下命令查看 MySQL 的版本:

mysql -V

2. 主服务器配置

主服务器是所有数据写入的地方,以下是配置主服务器的步骤。

2.1 编辑 MySQL 配置文件

打开 MySQL 配置文件进行修改:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 部分添加或修改以下设置:

[mysqld]
server-id=1                         # 主服务器唯一 ID
log-bin=mysql-bin                   # 启用二进制日志
gtid_mode=ON                        # 启用 GTID 模式
enforce-gtid-consistency=ON         # 强制 GTID 一致性
log-slave-updates=ON                # 允许从库更新记录到 binlog
binlog-format=ROW                   # 使用行格式的 binlog(推荐)
binlog_expire_logs_seconds=604800   # 设置 binlog 的过期时间为 7 天
innodb_buffer_pool_size=6G          # 设置 InnoDB 存储引擎的缓冲池大小,建议设置为服务器总内存的 50%-70%
binlog-do-db=mydatabase             # 仅记录指定数据库的操作到 binlog
bind-address=0.0.0.0                # 允许外部连接

2.2 重启 MySQL 服务

配置完成后,重启 MySQL 服务以使设置生效:

sudo systemctl restart mysql

2.3 创建复制用户

登录 MySQL,并创建用于复制的用户:

mysql -u root -p

在 MySQL 中执行以下命令:

CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;

3. 从服务器配置

从服务器将从主服务器接收数据并进行同步,以下是配置从服务器的步骤。

3.1 编辑 MySQL 配置文件

打开从服务器的 MySQL 配置文件并进行修改:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 部分添加或修改以下设置:

[mysqld]
server-id=2                              # 从服务器唯一 ID
log-bin=mysql-bin                        # 启用二进制日志
gtid_mode=ON                             # 启用 GTID 模式
enforce-gtid-consistency=ON              # 强制 GTID 一致性
log-slave-updates=ON                     # 允许从库更新记录到 binlog
binlog-format=ROW                        # 使用行格式的 binlog
binlog_expire_logs_seconds=604800        # 设置 binlog 的过期时间为 7 天
relay_log=relay-bin                      # 设置中继日志
relay_log_recovery=ON                    # 启用中继日志恢复
binlog-do-db=mydatabase                  # 仅记录指定数据库的操作到 binlog

3.2 重启 MySQL 服务

配置完成后,重启 MySQL 服务以使设置生效:

sudo systemctl restart mysql

3.3 配置复制

登录 MySQL,并配置从服务器的复制:

mysql -u root -p

停止当前的复制任务(如果有):

STOP SLAVE;

配置从服务器复制任务,使用主服务器的 IP、复制用户和密码,并启用 GTID 自动定位:

CHANGE MASTER TO
    MASTER_HOST='master_server_ip',
    MASTER_USER='slave',
    MASTER_PASSWORD='your_password',
    MASTER_AUTO_POSITION=1;  # 启用 GTID 自动定位

3.4 启动复制

启动复制任务:

START SLAVE;

3.5 检查复制状态

使用以下命令检查复制状态,确保以下两项为 Yes

SHOW SLAVE STATUS\G;
.....
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.....

4. 数据同步验证

在主服务器上创建需要同步的数据库:

mysql -uroot -p
CREATE DATABASE mydatabase;

在从服务器上验证数据库是否同步:

mysql -uroot -p
SHOW DATABASES;

5. 防火墙配置(以 UFW 为例)

配置主服务器的防火墙仅允许从服务器通过 3306 端口连接到主服务器。修改主服务器的防火墙配置:

sudo ufw allow from <slave_ip> to any port 3306 proto tcp

UFW 的详细使用方法请参考:https://www.hicairo.com/post/80.html

6. 备份与恢复

6.1 在主服务器上备份数据库

使用 mysqldump 备份数据库:

mysqldump -uroot -p mydatabase --triggers --routines --events --source-data=2 --set-gtid-purged=ON > mydatabase.sql

6.2 在从服务器上恢复数据库

使用 scp 将备份的数据库下载到从服务器:

scp root@master_server_ip:/root/mydatabase.sql ./

在从服务器上恢复数据库:

mysql -uroot -p mydatabase < mydatabase.sql

检查 GTID 设置:确保目标服务器的 GTID 设置与主服务器一致,特别是在恢复后,检查 gtid_modeenforce-gtid-consistency 设置:

SHOW VARIABLES LIKE 'gtid%';

6.3 重新配置从服务器

 参考 3.3-3.5 配置复制


本文出处:HiFeng's Blog
本文链接:https://www.hicairo.com/post/81.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!

Ubuntu 操作系统中使用 UFW 配置防火墙

2025-02-20 10:09:46

1. 什么是 UFW?

UFW (Uncomplicated Firewall) 是 Ubuntu 提供的一个简化的防火墙管理工具,基于 iptables,旨在让防火墙配置变得更加简单易用。

2. 安装 UFW

在大多数 Ubuntu 版本中,UFW 已经默认安装。你可以通过以下命令确认是否已安装:

sudo ufw status

如果未安装,可以通过以下命令进行安装:

sudo apt update
sudo apt install ufw

3. 设置默认防火墙规则

在启用 UFW 之前,建议先设置默认规则,避免意外断开 SSH 连接:

# 默认拒绝所有传入连接
sudo ufw default deny incoming

# 默认允许所有传出连接
sudo ufw default allow outgoing

# 允许 SSH (22端口),避免开启防火墙后无法连接服务器
sudo ufw allow 22/tcp

4. 启用和禁用 UFW

# 启用 UFW
sudo ufw enable

# 禁用 UFW
sudo ufw disable

⚠️ 注意:在远程服务器上启用防火墙前,务必确保已允许 SSH 端口,否则可能会被锁在服务器外面!

5. 检查 UFW 状态

sudo ufw status

6. UFW 基本命令

# 允许其他常用端口 (示例: 80 端口用于 HTTP, 443 端口用于 HTTPS)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 拒绝特定端口
sudo ufw deny 23

# 查看 UFW 详细状态
sudo ufw status verbose

# 以编号形式显示所有规则
sudo ufw status numbered

# 删除编号为 3 的规则
sudo ufw delete 3

# 删除规则(非编号方式)
sudo ufw delete allow 80

# 重置 UFW 所有规则
sudo ufw reset

7. UFW 复杂规则示例

# 仅允许特定 IP 通过 TCP 协议访问指定端口 (例如 MySQL 3306 端口)
sudo ufw allow from 192.168.1.100 to any port 3306 proto tcp

# 允许特定 IP 通过 UDP 协议访问指定端口 (例如 1194 端口,用于 OpenVPN)
sudo ufw allow from 192.168.1.100 to any port 1194 proto udp

# 开放一个端口范围 (例如 10000 到 20000 端口,用于 VoIP 或游戏服务器)
sudo ufw allow 10000:20000/tcp

# 限制 SSH (防止暴力破解)
sudo ufw limit ssh

# 细化限制:每 IP 每 30 秒最多 6 次连接,超过则拒绝 (默认规则)
sudo ufw limit 22/tcp

# 你也可以为其他服务设置类似的连接限制,例如 HTTP 服务
sudo ufw limit 80/tcp

8. 防火墙日志

# 启用日志(建议在排查问题时使用)
sudo ufw logging on

# 查看 UFW 日志
sudo tail -f /var/log/ufw.log



本文出处:HiFeng's Blog
本文链接:https://www.hicairo.com/post/80.html
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA许可协议。转载请注明出处!

Debian 12 / Ubuntu 24.04 安装 Docker 以及 Docker Compose 教程

2024-11-22 10:54:14

  本文将指导如何在 Debian 12 和 Ubuntu 24.04 下安装 Docker 以及 Docker Compose。

  PS:本文同时适用于 Debian 11 以及 Ubuntu 20.04, Ubuntu 22.04。

一、什么是 Docker?

  Docker 是一种容器化技术,可以在服务器上快速搭建容器并在不污染宿主机的情况下运行软件,而不再需要安装配置各种环境。开源 Docker 社区致力于改进这类技术,并免费提供给所有用户,使之获益。

二、什么是 Docker Compose?

  传统模式下运维人员需要运行 docker run 来启动各种容器,一旦容器过多,就无法一次性记住所有的运行参数和命令,这时候我们可以使用 Docker Compose 来解决这个问题。

  Docker Compose 是一个用于在单个主机上定义和运行多个 Docker 容器的工具。它使用 YAML 文件来配置应用程序的服务,然后使用一个命令就可以创建并启动所有服务。使用 Docker Compose 可以大大简化 Docker 容器的管理和部署,特别是对于具有多个互相依赖的容器的复杂应用。

三、使用官方源安装 Docker

以下操作需要在 root 用户下完成,请使用 sudo -isu root 切换到 root 用户进行操作。

首先,安装一些必要的软件包:

apt update
apt upgrade -y
apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates

然后加入 Docker 的 GPG 公钥和 apt 源:

# Debian
curl -sSL https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://download.docker.com/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

# Ubuntu
curl -sSL https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

国内机器可以用清华 TUNA 的国内源:

# Debian
curl -sS https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

# Ubuntu
curl -sS https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

然后更新系统后即可安装 Docker CE 和 Docker Compose 插件:

apt update
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

此时可以使用 docker version 命令检查是否安装成功:

root@debian ~ # docker version
Client: Docker Engine - Community
 Version:           26.1.4
 API version:       1.45
 Go version:        go1.21.11
 Git commit:        5650f9b
 Built:             Wed Jun  5 11:29:22 2024
 OS/Arch:           linux/amd64
 Context:           default
Server: Docker Engine - Community
 Engine:
  Version:          26.1.4
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       de5c9cf
  Built:            Wed Jun  5 11:29:22 2024
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          1.6.33
  GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

如果需要某个特定用户可以用 Docker rootless 模式运行 Docker,那么可以把这个用户也加入 docker 组,比如我们把 www-data 用户加进去:

apt install docker-ce-rootless-extras
sudo usermod -aG docker www-data

四、安装 Docker Compose

因为我们已经安装了 docker-compose-plugin,所以 Docker 目前已经自带 docker compose 命令,基本上可以替代 docker-compose

root@debian ~ # docker compose version
Docker Compose version v2.27.1

如果某些镜像或命令不兼容,则我们还可以单独安装 Docker Compose,

我们可以使用 Docker 官方发布的 Github 直接安装最新版本:

curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

此时可以使用 docker-compose version 命令检查是否安装成功:

root@debian ~ # docker-compose version
Docker Compose version v2.27.1

五、修改 Docker 配置

以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘 (泪的教训):

cat > /etc/docker/daemon.json << EOF
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "20m",
        "max-file": "3"
    },
    "ipv6": true,
    "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
    "experimental":true,
    "ip6tables":true
}
EOF

然后重启 Docker 服务:

systemctl restart docker

  好了,我们已经安装好了 Docker 和 Docker Compose,然后就可以开始愉快的安装各种软件,限于篇幅,我们不再赘述,今后慢慢介绍安装各种 Docker 软件的方法。


来源:烧饼博客
链接:https://u.sb/debian-install-docker/