包含关键字 Docker 的文章

留几块老硬盘,偶尔通电可以看到过去的自己在忙碌什么。

因为酷Q ,我第一次接触到了Docker和基于Openbox窗口管理器和Wine 的Linux下Windows服务软件运行方案。

我是中国境内较早一批接触并实用AI chat模型的非计科高中生。​

那时候腾讯还在ai.qq.com持续测试传统NLP 算法的chat模型,即便效果远不能与现在的LLM相比拟,这些现在可以称为古董的早期产品还是给当时的我还有其他朋友带来了极大的震撼。

​那年,眺望世界已经不能依靠原版shadowsocks实现,新的替代者是Trojan

那年,Discuz是境内主流论坛服务软件。

​那年,Python有了一个国产IDE NovalIDE。

​那年,SSH 还是XShell Plus的天下。

​那年,PanDownload 和无私分享的cookies拯救无数被百度云盘困住的用户。

那年,PCL替代不掉难忘的旋律

那年,联机侠跨越时空提前挤占了网易的用户空间

​那年,我第一次玩孤岛危机2 大型开放世界FPS游戏。

那年,第一次体验COD 4颠覆性游戏制作水平

​那年,激活Windows只需要启动AAct 。

​那年,酷Q与论坛还在,开发可用易语言。

​互联网有记忆,我们也有,缺少的记忆欢迎补全。

1715c9acf6c279e26c65d630e231db0b287961398.jpg@1192w.avif
973053ab9bfeb8112155c52978effeac287961398.jpg@1192w.avif

42649056ca50e152d420b8fb8719a629287961398.jpg@1192w.avif
e52abe4c30a77790415c74c558367d4f287961398.jpg@1192w.avif

4ab5298d29abbe8e47f1960e3d0cee88287961398.jpg@1192w.avif
5bb47573d20444291f514df3ddf01b87287961398.jpg@1192w.webp
9be485c31783efa40b4f2d22559797fa287961398.jpg@1192w.avif

92d5bc74ea253b57d26af73859553cdf287961398.jpg@1192w.webp
20200821180808.png
20200821180856.png

这是困扰我许久的问题,但是一直没有时间解决,我已经无法忍受这种局面今天务必解决。

错误日志

通过podman logs -f 命令可以看到关键报错如下

[error][2025-11-27 20:26:34][0a5900036928433ebea500015475dab0][/work/utils/send/send.go:80][email protected]%!(EXTRA string=域名mx记录查询失败,检查邮箱是否存在!)
[debug][2025-11-27 20:26:34][/work/utils/smtp/smtp.go:415]SendMail, ,smtp.gmail.com:25 ,[email protected] ,linuxuser.site ,[[email protected]] 
[info][2025-11-27 20:26:36][0a5900036928433ebea500015475dab0][/work/utils/send/send.go:135]SMTP STARTTLS on 25 Send Error. dial tcp: lookup smtp.gmail.com: i/o timeout
[info][2025-11-27 20:26:38][0a5900036928433ebea500015475dab0][/work/utils/send/send.go:142]SMTPS on 587 Send Error. dial tcp: lookup smtp.gmail.com: i/o timeout
[info][2025-11-27 20:26:40][0a5900036928433ebea500015475dab0][/work/utils/send/send.go:149]SMTPS on 465 Send Error. dial tcp: lookup smtp.gmail.com: i/o timeout
[error][2025-11-27 20:26:42][0a5900036928433ebea500015475dab0][/work/utils/send/send.go:159][0xc000290380] 邮件投递失败dial tcp: lookup smtp.gmail.com: i/o timeout
[debug][2025-11-27 20:26:42][0a5900036928433ebea500015475dab0][/work/controllers/email/send.go:210]插件执行--SendAfter
[debug][2025-11-27 20:26:42][0a5900036928433ebea500015475dab0][/work/hooks/base.go:74][wechat_push]Plugin SendAfter Start
[debug][2025-11-27 20:26:42][0a5900036928433ebea500015475dab0][/work/hooks/base.go:74][spam_block]Plugin SendAfter Start
[error][2025-11-27 20:26:42][/work/hooks/framework/framework.go:123]params error json: cannot unmarshal object into Go struct field HookDTO.ErrMap of type error
[debug][2025-11-27 20:26:42][0a5900036928433ebea500015475dab0][/work/hooks/base.go:88][wechat_push]Plugin SendAfter End
[error][2025-11-27 20:26:42][/work/hooks/framework/framework.go:123]params error json: cannot unmarshal object into Go struct field HookDTO.ErrMap of type error
[debug][2025-11-27 20:26:42][0a5900036928433ebea500015475dab0][/work/hooks/base.go:88][spam_block]Plugin SendAfter End
[debug][2025-11-27 20:26:42][0a5900036928433ebea500015475dab0][/work/controllers/email/send.go:222]插件执行--SendAfter

分析问题

显然DNS解析有问题,容器的网络似乎存在异常。
现在宿主机nslookup smtp.gmail.com确定主机网络无异常。
podman exec -it pmail /bin/ash 进入容器内再次执行ping等测试均失败确定容器网络确实有问题。

- 阅读剩余部分 -

报错如下:

root@racknerd-14a7c8:~# podman stop pmail
2025-10-19T09:53:14.285697Z: send signal to pidfd: Permission denied
Error: timed out waiting for file /run/libpod/exits/b0fc27c2e04e4655bc2a810ce522b37952f27b4706727bbca2f9faa59de150b3: internal libpod error

并且使用podman-compose down也会有相同报错,并且重启容器时会遇到残留进程占用25端口的问题。
在经过一系列尝试后DeepSeek已经开始不断推荐我直接使用Docker,但是我不想用。所以尝试使用runc作为最后一搏,还不行我就真的换Docker了,毕竟好用的工具才是好工具。

什么是RunC?

RunC是Docker捐赠给OCI作为OCI容器运行时标准的参考实现,因此我猜想使用runc比podman的默认运行方式更符合OCI标准,因而能更大程度兼容Docker镜像。
安装 runc sudo apt install runc -y

配置 Podman 使用 runc 作为默认运行时

sudo nano /etc/containers/containers.conf
在 containers.conf 中添加:

[engine]
runtime = "runc"

为了确保podman-compose一定使用了runc,可以添加runtime: runc

version: '3'
services:
  pmail:
    image: ghcr.io/jinnrry/pmail:latest
    container_name: pmail
    restart: always
    #privileged: true 特权运行不能解决当前遇到的问题,所以没必要用。
    ports:
      - "25:25"
      - "2080:80"
      - "20443:443"
      - "110:110"
      - "465:465"
      - "995:995"
      - "993:993"
    volumes:
      - "/root/podman/pmail/config:/work/config"
    runtime: runc

这时候再使用podman-compose up -d和down 应该都问题了。
但是你最好确保自己的环境是完全干净的,可以通过:
podman system reset --force && reboot 确保这点。

今天是2025年1月16日星期四 ,欢迎来到硬核灌水,以下是本期的主要内容。

Fedora 42 正在考虑将其Live安装镜像切换到 EROFS

来源: Michael Larabel

Fedora 42 计划将其 live 安装镜像的文件系统从 SquashFS 切换为 EROFS,这项提案今天已提交。当前 Fedora Linux 的 live 安装介质使用 SquashFS 文件系统,但根据这项变更提案,Fedora 42 所有由 Kiwi 制作的 live 媒体,包括 Fedora KDE Desktop、Fedora Budgie、Fedora Xfce、Fedora COSMIC 等版本,将改为使用 EROFS,同时 Fedora CoreOS 的 live 安装镜像也会采用 EROFS。提案认为 EROFS 相较于 SquashFS 更积极地进行开发,且支持更多现代文件系统特性,能够在未来得到更好的应用。EROFS 自 2019 年由华为提出以来,已经增加了许多功能和优化,尤其在移动设备、嵌入式系统和容器中得到了广泛应用。需要注意的是,这项变更仅涉及 live 安装镜像,EROFS 会作为只读文件系统使用。此变更提案仍需通过 Fedora 工程与指导委员会(FESCo)的投票批准。
小石: 为了现代化,我相信大部分人都会毫不犹豫的支持这一变化。

英特尔 THC 驱动程序即将提交 Linux 6.14

Intel THC 驱动程序将为现代 Intel 笔记本的触摸输入设备提供支持,帮助 Linux 操作系统更好地兼容这些设备。该驱动程序将包含在即将发布的 Linux 6.14 内核版本中,支持最新的和即将发布的 Intel SoC。

小石:该驱动的工作从去年就开始了,看来我们有望在新的英特尔笔记本上完美运行Linux发行版。

NVMe PCI 端点功能目标驱动程序将在 Linux 6.14 中推出

来源:Michael Larabel

由西部数据编写的 NVMe PCI 端点功能目标代码是即将在 Linux 6.14 内核中首发的一款有趣的新驱动程序。
在 Linux 6.14 合并窗口打开之前,Linux 块子系统的 “for-next ”分支就已经在排队了,它是使用 PCI 端点框架的新 NVMe PCI 目标驱动程序。有了能在端点模式下运行的 PCI 控制器,就能创建 PCIe NVMe 控制器。
文档补丁详细介绍了该 NVMe 目标驱动程序的所有有趣技术细节。该驱动程序主要用于测试目的,例如在拥有 PCIe 端点控制器的小型单板计算机上创建一个 NVMe 目标来循环文件或块设备。也可以使用 TCP 目标来连接远程 NVMe 设备。
实践中 Rock5B 板(搭载 Rockchip RK3588 SoC 和 PCI Gen3x4 endpoint 控制器)进行测试时,使用 fio 工具进行随机 4K 读取时,最大性能为 131 KIOPS,并且最大吞吐量可达到 2.8 GB/s。
除非出现任何最后一刻的问题,该驱动程序应该在即将到来的 Linux 6.14 内核周期中首次亮相。

小石:虽然没什么关系,但是这个驱动程序还是让我想起来某些伪装成M.2 NVMe的DMA硬件....也许是我最近FPS游戏玩多了吧。

开源虚拟化 API libvirt 11.0 发布

来源:Michael Larabel
Libvirt 11.0 发布了多个重要新特性和改进,增强了其作为开源虚拟化 API 的功能。主要新增了对 vLAN 的支持,使得用户可以在标准 Linux 主机桥接器上进行 vLAN 标记和中继配置。此外,引入了对直接和扩展 TLB Flush 特性的支持,改善了内存管理,并扩展到 Microsoft Hyper-V 平台。该版本还允许用户在虚拟机的 domain XML 中自定义设备别名,增加了 VirtIOFS 的只读模式,优化了 QEMU 迁移功能,并修复了一些已知问题,进一步提高了性能和稳定性。

小石:这些新功能对喜欢折腾All in ~BOOM~ One的高级玩家有重要意义,有了Vlan支持也许某些东西没必要跑在Docker里了,LXC不失为另一轻量化的选择。

原委

今天下班回家一开mumble发现有延迟数值正常显示但是连不上服务器:连接服务器失败:远端主机关闭了这个连接。

排查问题

ssh home.xfox.fun 有EN经典报错:网络不可达
我还以为又宕机了,但是经过检查我的J3160活得好好的 ssh -4 -p 22022 home.xfox.fun一连就上了。
这时候再对比JiaoLoong5 nslookup回报的IPv6地址和J3160上执行ip addr返回的地址确定是DDNS出问题了,没有更新最新的ipv6地址。
看过我之前文章的同学应该知道我在使用Podman替代Docker部署NewFuture/DDNS实现ipv6 DDNS,但是在不久前更新过容器镜像后我发现服务不稳定,因为容器会自动停止运行。
自从我使用这个容器,日志里一直存在警告:
WARNING:root:Cache file is out of dated.
我不确定这是否对容器稳定性造成了影响,但是在我设定了restart=always的情况下容器还是停止了那可太玄学了。
所以我这次放弃了容器部署,直接本地从官方源码仓库部署。

开始部署

git clone https://github.com/NewFuture/DDNS

仓库文件会存储在当前目录下的DDNS文件夹里。

cd DDNS 
pyhton run.py

然后你可能得到提示:-bash: python: 未找到命令
这是因为Debain12默认安装了Python3但是默认没有将python命令软链接到pyhon3

为了解决这个问题你可以使用apt安装一个软件包:python-is-python3 (这是很久之前闲来无事apt search 发现的,没想到今天就又用上了。)如果你不想优雅的解决问题那就自己手动创建链接吧=-=。
这一步是必须的,因为NewFuture/DDNS/blob/v3.0.2/systemd.sh里写死了命令行:
ExecStart=/usr/bin/env python /usr/share/DDNS/run.py -c /etc/DDNS/config.json
所以你要么去修改源码加个3,要么....就像我现在教你的一样。
接下来执行:

sudo ./systemd.sh install

即可利用systemd注册一个名为ddns的服务。
但是需要注意一个小坑,git clone 拉下仓库文件后默认没有config.json
所以直接执行install的时候systemd.sh里的cp config.json /etc/DDNS/config.json这行压根就不会生效。
你的/etc/DDNS/里就不会有config.json
为了避免这个问题,你最好下拉仓库后先执行python run.py 让ddns脚本先在DDNS仓库文件里生成一个config.json

修改配置文件

先参考配置参数表再修改官方生成的示例配置文件。

启用服务

sudo systemctl enable ddns
sudo systemctl restart ddns

检查状态

sudo systemctl status ddns

为什么我无法使用podman update container_id --restart=always ?

我猜你在阅读本文之前已经尝试过docker(podman) update了,但是很遗憾Podman update命令主要用于配置容器可用资源和,比如限制容器使用的内存数量。
以下为podman update的可用子命令: 随着podman更新,他们可能会被更改,请参考官方文档podman-update - Update the configuration of a given container

选项描述
--blkio-weight设置块设备 I/O 的权重。权重决定了在多个容器之间进行块 I/O 带宽分配时的优先级。
--blkio-weight-device为特定的块设备设置 I/O 权重。格式为“设备路径:权重”。
--cpu-period设置 CPU 周期的时间长度,单位为微秒。用于与 --cpu-quota 一起限制 CPU 的使用。
--cpu-quota设置 CPU 配额,即容器在一个 CPU 周期内可以使用的微秒数。
--cpu-rt-period设置实时 CPU 调度的周期长度,单位为微秒。用于限制实时任务的 CPU 使用时间。
--cpu-rt-runtime设置实时 CPU 调度的运行时间长度,单位为微秒。
--cpu-shares设置 CPU 权重,用于在多个容器之间分配 CPU 时间。
--cpus.container设置容器可以使用的 CPU 核心数。
--cpuset-cpus设置容器可以使用的 CPU 集合。
--cpuset-mems设置容器可以使用的内存节点集合。
--device-read-bps为特定的设备设置读取带宽限制,单位为字节/秒。格式为“设备路径:带宽”。
--device-read-iops为特定的设备设置读取 I/O 操作限制,单位为操作/秒。格式为“设备路径:I/O 操作数”。
--device-write-bps为特定的设备设置写入带宽限制,单位为字节/秒。格式为“设备路径:带宽”。
--device-write-iops为特定的设备设置写入 I/O 操作限制,单位为操作/秒。格式为“设备路径:I/O 操作数”。
--memory设置容器可以使用的内存大小。
--memory-reservation设置容器内存预留大小,确保容器启动时获得的最小内存量。
--memory-swap设置容器可以使用的总内存(包括内存和交换分区)大小。
--memory-swappiness设置容器的交换倾向性,取值范围为 0 到 100。较高的值意味着容器更倾向于使用交换分区。
--pids-limit设置容器可以创建的进程数限制。

使用Podman更新容器参数的正确做法

假设你不想删除并在重新创建该容器时丢失之前使用的参数
以正在运行的容器natfrp-service为例:

查看容器启动参数

(我使用SakuraFrp官方的脚本部署,但是我现在需要更改--restart=on-failure:5 为:--restart=always 并且我不想重新修改一些其他固定好的参数)
podman inspect natfrp-service | grep -A 15 "CreateCommand"
这里的15取决于你的容器启动参数有多少项,一般来说一项为一行,15即获取字符串“CreateCommand”后的15行。如果你发现过多导致没有完全输出,可以适当增加该值。

停止容器

sudo podman stop natfrp-service

删除容器

sudo podman rm natfrp-service

重新运行容器并添加参数

podman run --name=natfrp-service --restart=always other... natfrp.com/launcher:latest

环境公示

宿主机J3160 上模拟堡垒机跑反代和虚拟机 网络桥接模式宽带联通IPv6公网
通过测试确定任何网络支持ipv6的用户可正常使用。

照本宣科

仓库有文档不需要我教
我高估了国内开发者的水平,实践证明90%的在职从业者水平解决问题的能力并不像他们的学历一样比我高。
如果你很有自信,有能力补全官方PPA安装后造成的一大堆依赖和配置文件缺失问题,你可以尝试不使用docker直接安装。
https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker
docker部署后注意写对PUBLIC_URL,端口无所谓,但要和后续反代对照。
NAT后部署的必须填写JVB_ADVERTISE_IPS
其他参数非必要即默认,不要看什么CSDN之类的烂文章乱改乱加。

- 阅读剩余部分 -

为什么使用Podman而不是Docker?尽管Docker-CE是免费的,但是Docker属于商业公司的产品,而Podman是由社区驱动的自由软件。Podman近乎完全兼容Docker的CLI和标准Docker容器生态,对于我没有学习成本亦不造成生态割裂。此外Podman与Cockpit可通过插件完美集成,大大提高了可视化管理效率。

什么是Moments?

Moments是一个 C# 开发的博客朋友圈平台。

Moments 为你提供了一个全新的方式来与你关注的博客作者和读者互动,让你的博客体验更加丰富和充实。
我们核心目标是通过整合各种订阅源,如 RSS 和 Atom,将你感兴趣的博客转化为一个个人朋友圈。你可以订阅来自世界各地的博客,并实时获取他们的最新动态。无论是热门博客、专业博主,还是你最喜爱的作者,你都可以通过 Moments 获得他们的最新博文、评论和互动。

安装Podman

参见Podman Installation Instructions
sudo apt install podman
你可能需要对Podman进行简单的配置,参见:必要的配置

- 阅读剩余部分 -