我在调试 docker 问题时遇到问题。在我作为主机的机器上,映像中的每个//apt
命令都会挂起,我不明白为什么。apt-get
apt-cache
debian:jessie
在其他带有 docker 的机器上,当我运行时(例如)
docker run --rm debian:jessie apt list
这需要几秒钟,但随后会弹出列表。在我的机器上,它永远挂起(> 30 分钟)并使用完整的 CPU 核心。
关于如何调试这个问题有什么想法吗?
我使用的是 Fedora 35 (x86_64),具有最新且不错的硬件。我已经
- 尝试运行不同的命令 - 全部占用 CPU 核心并冻结。我至少尝试过,,,,
apt update
当然还有一些我不记得了apt upgrade
apt list
apt show apt
apt-cache showpkg apt
- 尝试
setenforce 0
在主机上通过禁用selinux,但没有效果 - 试图通过 docker 的参数来取消网络
--network none
,但没有效果 - 更新了我的 Fedora 主机系统,但没有效果
- 检查 docker-ce 版本是否是最新的稳定版本 - 它是
- 尝试过
docker run --rm debian:latest apt list
(即最新的 debian) - 这有效,但我需要旧的(杰西,不是最新的) - 尝试通过停止 Fedora 防火墙
systemctl stop firewalld.service
并通过(感谢@rubynorails)重新启动 docker 守护进程systemctl restart docker
,但没有效果
关于如何从这里出发有什么想法吗?
答案1
经过几个小时的反复试验,另一个在不同主机上运行的图像让我走上了正确的道路。 fedora 上的默认 ulimit 似乎存在问题 [1][2]。
以下工作正常:
docker run --rm --ulimit nofile=10000:10000 -ti debian:jessie apt list
我刚刚将--ulimit
参数添加到每个容器/docker 构建中,到目前为止一切都非常顺利。
答案2
编辑基于@jsbillings的下面的评论——请注意,基于@felher的反馈,这个特定的答案没有解决他们的问题,但它可以应用于正在运行的具有相同问题描述的用户Docker 版本低于 v20.0。
原答案:
firewalld
如果我记得的话,Docker与 RHEL 系统上默认启用的配合不太好。如果你想让它表现得更像 Ubuntu 系统(ufw
默认情况下是禁用的),那么只需停止firewalld
:
sudo systemctl stop firewalld
...并且[可选]禁用它,这样将来就不会发生这种情况:
sudo systemctl disable firewalld
您可能还需要重新启动 docker 守护进程:
sudo systemctl restart docker
或者systemctl restart docker-ce
请注意,我并不是说这是最好的安全实践,但就个人而言,来自企业环境,我们总是在实例firewalld
构建后立即将其禁用,因为通过基于网络的防火墙规则来控制访问策略要容易得多比基于主机的规则。