Docker升级失败:不再支持aufs存储驱动程序

Gil*_*il' 21 upgrade docker

我有一台安装了 Docker 的 Ubuntu 机器。(Ubuntu 版本是 20.04,但这也会影响 18.04,也可能影响非 LTS 版本。)软件包docker.iofocal-security失败:

\n
Preparing to unpack .../docker.io_20.10.7-0ubuntu1~20.04.1_amd64.deb ...\nThe aufs storage-driver is no longer supported.\nPlease ensure that none of your containers are\nusing the aufs storage driver, remove the directory\n/var/lib/docker/aufs and try again.\ndpkg: error processing archive /var/cache/apt/archives/docker.io_20.10.7-0ubuntu1~20.04.1_amd64.deb (--unpack):\n new docker.io package pre-installation script subprocess returned error exit status 1\ndpkg: error while cleaning up:\n installed docker.io package post-installation script subprocess returned error exit status 1\n
Run Code Online (Sandbox Code Playgroud)\n

这是一个已知的错误,但根据Ubuntu Docker 打包策略,该错误已被标记为 \xe2\x80\x9cwon\'t fix\xe2\x80\x9d 。

\n
\n

这里引用了很多人的话:

\n
\n

这是一个重大更新,不应在 LTS 版本上发生。

\n
\n
\n

像这样需要大量手动干预的升级在 LTS 版本中绝对不应该发生。

\n
\n

在一般情况下,你对此的看法是正确的。不幸的是 Docker 是一个例外。(\xe2\x80\xa6)

\n

因此,作为 Docker 的例外,我们更新到较新的上游版本,而不考虑 Docker 本身行为的向后兼容性,而是完全依赖上游的决策。在这种情况下,并且仅基于其他人已经在此处提供的分析,这意味着我们不希望将 aufs 存储驱动程序修补回我们自己的包装中。(\xe2\x80\xa6)

\n

按照目前的政策,这不是我们期望修复的问题,因此我将此错误标记为“无法修复”。

\n
\n

我发现推理令人困惑 \xe2\x80\x94\xc2\xa0 如果我使用稳定的发行版,我希望升级是无缝的,并且我不希望拥有最新版本的程序。如果我想要滚动版本,我知道在哪里可以找到它,而且它不会被称为 LTS。但这不是讨论的场所。

\n

我的问题是,接下来我该怎么办?我如何 \xe2\x80\x9censure [我的] 容器都没有使用 aufs 存储驱动程序\xe2\x80\x9d?保留旧的、未维护的 Docker 版本是行不通的。我需要安全更新。

\n

我的容器都不使用依赖于存储驱动程序的高级功能。我对升级或迁移我的容器非常满意。我怎么做?

\n

Art*_*ild 21

来自官方 Docker 文档- 如何配置存储驱动程序以使用OverlayFS而不是AUFS.

  1. 停止 Docker。

    sudo systemctl stop docker
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将 的内容复制/var/lib/docker到临时位置。

    cp -au /var/lib/docker /var/lib/docker.bk
    
    Run Code Online (Sandbox Code Playgroud)
  3. 编辑/etc/docker/daemon.json。如果它尚不存在,请创建它。假设该文件为空,添加以下内容。

    {
       "storage-driver": "overlay2" 
    }
    
    Run Code Online (Sandbox Code Playgroud)

    如果 daemon.json 文件包含格式错误的 JSON,则 Docker 不会启动。

  4. 启动 Docker。

    sudo systemctl start docker
    
    Run Code Online (Sandbox Code Playgroud)
  5. 验证守护程序是否正在使用overlay2 存储驱动程序。使用 docker info 命令并查找存储驱动程序和支持文件系统。

    $ docker info
    
    Containers: 0
    Images: 0
    Storage Driver: overlay2
     Backing Filesystem: xfs
     Supports d_type: true
     Native Overlay Diff: true
    <...>
    
    Run Code Online (Sandbox Code Playgroud)

Docker 现在正在使用overlay2存储驱动程序。

然后,您需要重新创建容器并使用新的存储驱动程序再次获取所有图像。使用“绑定挂载”映射的容器数据应该保持不变(这是指向 Docker 文件系统外部的数据的挂载,而不是卷 -请参阅此处了解更多信息)。

之后,您可以删除该目录/var/lib/docker/aufs并继续升级 Docker 包。

  • 我对“然后您需要重新创建容器并使用新的存储驱动程序再次获取所有图像感到困惑”。卷中映射的容器数据不应更改。” 我不知道“卷中映射的容器数据”是什么意思。这一步保留了什么?我觉得很奇怪,我会重新下载基本映像,这些映像不会因存储驱动程序的选择而修改,但本地修改会被修改,即使这就是存储驱动程序的作用? (4认同)
  • 我看过几个映像备份/恢复和容器备份/恢复指南,但绝对没有一个解释如何按原样恢复容器,以便您可以从上次中断的地方继续。 (3认同)