"tls: oversized record received with length 20527" 仅尝试 "docker run" 从 Win10 WSL Bash

"tls: oversized record received with length 20527" trying to "docker run" from Win10 WSL Bash only

再生产

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

在更新到最新的 Docker CE Edge 版本之前切换到 "Linux Container"(但是最新的 "Docker for Windows" UI 不再显示切换选项?!)。 =20=]

从 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 命令来说是必需的:

Expose daemon on tcp://localhost:2375 without TLS

问题

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

例如:

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

感谢任何帮助/指点!

(=PA=)

解决方案

因为这把我吓坏了,我做了另一个 Google session 并在这边的评论中找到了解决方案: * 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 问题消失了!

对接愉快

建议的解决方案

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

问题已解决。

解决问题的步骤如下:

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

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

    注意:如果出现错误(function not implemented), try to upgrade WSL by(需要一段时间):

    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
    

相关: