【问题标题】:"tls: oversized record received with length 20527" trying to "docker run" from Win10 WSL Bash only“tls:收到长度为 20527 的超大记录”仅尝试从 Win10 WSL Bash 中“docker run”
【发布时间】:2018-03-01 12:31:28
【问题描述】:

复制

Win10 上安装的最新 Docker Edge (18.03.0-ce-rc1-win54 (16164))。

在更新到最新的 Docker CE Edge 版本之前切换到“Linux 容器”(但最新的“Docker for Windows”用户界面不再显示切换选项?!)。

从 Windows CMD 运行 docker run hello-world 没问题。

但是从 WSL Bash(最新的 Win10 1709)调用相同的内容总是会返回此 tls 错误消息:

$ docker images
REPOSITORY                        TAG                        IMAGE ID            CREATED             SIZE
continuumio/miniconda3            latest                     29af5106b6a4        17 hours ago        443 MB
hello-world                       latest                     f2a91732366c        3 months ago        1.85 kB

$ docker --version
Docker version 1.13.1, build 092cba3

$ docker version
Client:
 Version:      1.13.1
 API version:  1.26
 Go version:   go1.6.2
 Git commit:   092cba3
 Built:        Thu Nov  2 20:40:23 2017
 OS/Arch:      linux/amd64

Server:
 Version:      18.03.0-ce-rc1
 API version:  1.37 (minimum version 1.12)
 Go version:   go1.9.4
 Git commit:   c160c73
 Built:        Thu Feb 22 02:42:37 2018
 OS/Arch:      linux/amd64
 Experimental: true

$ echo $DOCKER_HOST
tcp://0.0.0.0:2375

$ docker run hello-world
tls: oversized record received with length 20527

此设置似乎无关,但对于运行docker 命令来说是必需的:

在没有 TLS 的情况下在 tcp://localhost:2375 上公开守护进程

问题

我想知道为什么这不是 Windows Docker / WSL 使用的常见问题。有些事情似乎搞砸了,但我不知道从哪里开始。

例如:

  1. 为什么问题只出现在 WSL Bash 下而不是 Windows 下 命令?
  2. 如何将"insecure-registries": []daemon.json 值更改为一些与SO 相关的消息建议?

感谢任何帮助/指针!

(=PA=)

【问题讨论】:

  • 这显然是 TLS/no-TLS 混淆,因为服务器显然在响应 HTTP/...(没有 TLS),而客户端正试图将其解析为涉及字节 3 的 TLS 响应和 4 = P 斜杠 = 十六进制 50 2F 作为长度和十六进制 502F = 十进制 20527 确实是无效的长度。 HTH。

标签: windows docker tls1.2 windows-subsystem-for-linux docker-for-windows


【解决方案1】:

解决方案

这让我有点害怕,我又创建了一个 Google 会话,并在这边的 cmets 中找到了解决方案: * https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly

简而言之: * 我所描述的问题来自默认但已过时的docker.io 安装,而不是最新且维护的docker-ce 安装。

一旦我删除了旧的(尾随 * 是有意的!):

sudo apt-get remove --purge docker*

并安装了最新的docker-ce 一个——根据上面页面描述的过程——TLS 问题消失了!

对接愉快。

【讨论】:

    【解决方案2】:

    建议的解决方案

    sudo apt-get remove --purge docker*
    

    对我不起作用,因为我一尝试运行 apt-get remove 命令就收到以下错误:

    No process in pidfile '/var/run/docker-ssd.pid' found running; none killed.
    invoke-rc.d: initscript docker, action "stop" failed.
    

    所以我不得不通过执行这个手动卸载 docker:

    sudo rm /var/lib/dpkg/info/docker.io.*
    sudo rm /var/cache/apt/archives/docker.io*
    sudo rm /etc/default/docker
    sudo rm /etc/init.d/docker
    sudo rm /etc/init/docker.conf
    

    然后我只是按照这里的说明进行操作:

    https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly

    问题已解决。

    【讨论】:

      【解决方案3】:

      以下是解决问题的步骤:

      1. 从 WSL (Ubuntu) 中删除 docker.io(如果存在)和相关软件包:

        sudo apt-get remove docker.io
        sudo apt-get remove docker*
        

        注意:如果出现错误(function not implemented),请尝试通过upgrade WSL(这需要一段时间):

        sudo -S apt-mark hold procps strace sudo
        sudo -S env RELEASE_UPGRADER_NO_SCREEN=1 do-release-upgrade
        
      2. Install Docker CE 在 WSL (Ubuntu) 中:

        sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
        sudo apt-get update
        sudo apt-get install docker-ce
        
      3. 在 Windows 上的 Docker app 中公开没有 TLS 的守护进程

      4. 通过在 WSL 中定义 DOCKER_HOST 变量来连接它:

        export DOCKER_HOST=:2375
        

      相关:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 2016-07-04
        • 2012-04-07
        • 2019-01-05
        • 2012-02-01
        • 2013-09-09
        • 2011-02-02
        相关资源
        最近更新 更多