Docker 在 Ubuntu 16.04 上无法使用?

我在尝试通过 Web 界面更新 Docker 管理器时,Docker 安装出现了问题。我知道我的 Docker 安装已损坏,因为我按照sam 的建议操作后得到了以下结果:

$ docker run -it --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f
Status: Downloaded newer image for hello-world:latest
docker: Error response from daemon: no status provided on response: unknown.
ERRO[0003] error waiting for container: context canceled

随后我发现了这个 GitHub 问题,似乎与我遇到的情况相符:

由于我使用的是 Ubuntu 16.04,看起来这个解决方案是可行的:

  1. 添加一个 deb 仓库:
sudo add-apt-repository 'deb http://security.ubuntu.com/ubuntu xenial-security main universe'
  1. 安装 runc(注意其中的 ~ 符号,GitHub 在 @vietthang207 的原始帖子中弄错了它们):
sudo apt-get install runc=1.0.0~rc7+git20190403.029124da-0ubuntu1~16.04.4
  1. 安装 runc 会导致 docker-ce 被卸载,因此需要重新安装它:
sudo apt-get install docker-ce

有人能确认这样做是否安全,或者会有什么后果吗?我有点担心这会卸载 Docker。我猜想这意味着我的网站在安装过程中会停机(奇怪的是,尽管 Docker 已损坏,但目前网站仍然正常运行)。但我的 Discourse 安装是否安全?我的容器会消失吗?

编辑:这是我目前敢尝试的操作:

$ sudo apt-get install runc=1.0.0~rc7+git20190403.029124da-0ubuntu1~16.04.4
[sudo] password for christoph:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  aufs-tools cgroupfs-mount docker-ce-cli libltdl7
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  containerd.io docker-ce
The following NEW packages will be installed:
  runc
0 upgraded, 1 newly installed, 2 to remove and 21 not upgraded.
1 not fully installed or removed.
Need to get 1,890 kB of archives.
After this operation, 192 MB disk space will be freed.
Do you want to continue? [Y/n] n
Abort.
$

你重启过吗?我如果在升级后没有重启,Docker 就会出问题。

是的,听起来挺吓人的。我知道我在 16.04 上运行着一些站点,而且我并没有对 runc 做过任何操作。

如果你担心停机时间,并且使用的是 Digital Ocean,你可以考虑以下步骤:

  1. 创建一个运行 18.04 的新 Droplet,并进行干净安装。
  2. 获取一个浮动 IP,将其指向旧服务器,同时将 DNS 也指向该 IP。
  3. 将旧论坛设置为只读模式。
  4. 进行备份。
  5. 将备份恢复到新服务器。
  6. 将浮动 IP 重新指向新服务器。

这样就不会有停机时间,只会因为备份和恢复而短暂进入只读模式。你可以在正式执行只读操作之前练习几次。你也可以使用 rsync 同步上传文件,而不是将其包含在备份中,这样你只需要备份和恢复数据库。

不过,你可能还需要将现有的 Let’s Encrypt 证书迁移过来,否则我认为你需要重新生成这些证书。

我本来在考虑重启,但后来决定不做了。因为我觉得我的 Docker 安装似乎已经损坏,但论坛还能正常运行,如果重启服务器,可能会导致论坛也无法使用。这种可能性有多大?我应该尝试重启吗?

感谢你关于最小化停机时间的解释。不过,我并没有使用 DigitalOcean(DO)。而且只要停机时间不会持续数小时或数天,完全不是问题。

如果你升级了 Docker,它仍然已安装,并且这个问题是在升级后出现的,那么我敢肯定重启能解决你的问题。注意: 免费的建议只值你付出的代价。:wink:

在重启之前请做好备份。最坏的情况下,有了备份和你的 app.yml,你可以在不到一小时内启动一台新服务器并重新开始(除非你有数十 GB 的数据,也许需要更久)。

我的方案很可能适用于多种托管服务。

如果你特别担心,可以在某个地方启动一台新服务器,并将备份拉取过去,这样万一出现严重问题,你还有备用方案。

我非常感激。

实际上,我认为它的价值远超于此。但我理解你的意思。

准确来说:

  1. 尝试通过 Discourse 网页界面升级 Docker 管理器,但失败了(我在这里发布了错误信息)
  2. 然后我尝试运行 . /launcher rebuild app,但也失败了,并引导我访问 Troubleshoot docker installation issues
  3. 随后我意识到我可能需要使用不同的命令,因为我有独立的数据容器和 web_only 容器,于是我尝试了 ./launcher bootstrap web_only,但得到了相同的错误。
  4. 我按照 Troubleshoot docker installation issues 的说明进行了操作。其余内容在原帖(OP)中。

我想我会在本周末有空时尝试重启,以便有时间修复可能出现的后续问题。因为:不,虽然我几年前曾设置过三个 Discourse 实例,但“启动新服务器并重新开始”可能会让我忙上一整天。仅将我的域名指向新的 IP 地址本身就可能是一场潜在的噩梦。或者也许不是,但若要确认这其实没什么大不了的,也需要花费一些时间……

好吧,既然我已经花费了数百个小时(比我前任提供的“手工安装”所花的时间多得多),如果你知道如何配置 DNS,我的安装方案是完全自动化的,耗时不到一小时(大部分时间是 DNS 传播所需的时间)。