Docker 存储库服务器向 HTTPS 客户端提供 HTTP 响应

Posted

技术标签:

【中文标题】Docker 存储库服务器向 HTTPS 客户端提供 HTTP 响应【英文标题】:Docker repository server gave HTTP response to HTTPS client 【发布时间】:2018-09-15 08:57:08 【问题描述】:

我在 Windows 上使用 Docker 工具箱,我正在尝试从该文档 https://docs.docker.com/registry/deploying/ 运行私有 docker 注册表

但这对我不起作用。 之后的错误:

$ docker pull 192.168.99.100:5000/my-ubuntu

错误

$ docker pull 192.168.99.100:5000/image
Using default tag: latest
Error response from daemon: Get https://192.168.99.100:5000/v2/: http: server gave HTTP response to HTTPS client

我认为错误是我的 docker 客户端中的问题。

有关信息,这是我的 docker info

Containers: 6
 Running: 4
 Paused: 0
 Stopped: 2
Images: 19
Server Version: 17.06.0-ce
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 144
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: cfb82a876ecc11b5ca0977d1733adbe58599088a
runc version: 2d41c047c83e09a6d61d464906feb2a2f3c52aa4
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 4.4.74-boot2docker
Operating System: Boot2Docker 17.06.0-ce (TCL 7.2); HEAD : 0672754 - Thu Jun 29 00:06:31 UTC 2017
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 995.8MiB
Name: default
ID: ZMCX:NXC7:3BSV:ZNWV:MDZO:FW26:6MX5:UWI6:NVRL:XP56:AKGC:Z3TW
Docker Root Dir: /mnt/sda1/var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 47
 Goroutines: 56
 System Time: 2018-04-05T13:43:42.856720067Z
 EventsListeners: 0
Username: kacalek
Registry: https://index.docker.io/v1/
Labels:
 provider=virtualbox
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

如果我在 mac 上尝试,那么everythink 就完美了。

你知道如何解决这个错误吗?

非常感谢您的每一个回答!

【问题讨论】:

【参考方案1】:

看起来您没有正确设置 Docker 守护程序。请注意以下几行:

Insecure Registries:
 127.0.0.0/8

尝试将此行添加到 Docker 的 daemon.json 文件中并重新启动 Docker 守护进程:

"insecure-registries":["192.168.99.100:5000"]

【讨论】:

谢谢回答。 daemon.json 在哪里? C:\ProgramData\Docker\config 没有退出!我只有“C:\Program Files\Docker Toolbox” 但我在“C:\Users\kacal\.docker”中找到了一些 config.json 我使用 Docker 工具箱,这意味着我有带有一些 linux 的 VirtualBox,其中是 docker-engine(我猜),我在 Windows 上只有 docker 客户端连接到 VirtualBox 中的 linux 中的 docker-engine .【参考方案2】:

在 CentOS 7.2.1511 上,我必须创建一个新文件

/etc/docker/daemon.json 

内容

 "insecure-registries":["host:port"]  

(主机是托管我的 docker 注册表的服务器的主机名,端口是 docker 注册表可用的端口。在我的例子中,它们是 192.168.99.1:50000)

然后通过执行以下操作重新启动 docker daemon:

$ sudo service docker restart

【讨论】:

更新daemon.json后别忘了重启docker服务!!! 但是如何使其安全或使用 https 呢? "systemctl docker reload" 就足够了(而且速度更快)重启会杀死你所有正在运行的东西:)【参考方案3】:

希望这将帮助任何在使用 insecure-registries 修复程序时遇到问题的人。

添加

"insecure-registries":["host:port"]

/etc/docker/daemon.json

在我创建文件之前对我不起作用

/etc/default/docker

然后放线

DOCKER_OPTS="--config-file=/etc/docker/daemon.json"

在其中,然后用

重新启动docker守护进程

sudo systemctl stop dockersudo systemctl start docker

出于某种原因,只是执行sudo systemctl restart docker 不起作用。它抛出一个关于尝试快速重启服务的错误。

对于["host:port"],我使用了我的 Docker 注册表的 IP,而不是主机名,因为我没有 DNS 或主机文件设置,无法通过主机名找到注册表。

这让我彻底疯了,直到我偶然发现了 /etc/default/docker 位 here。

我是 Docker 新手,所以我不知道这是否是新要求,因为最初的帖子已得到答复,或者我第一次设置注册表时是否遗漏了其他内容。尽管我所做的只是关注 Docker 站点本身的当前文档。

【讨论】:

【参考方案4】:

如果你使用窗户:

    在启动菜单中,右键单击 docker 桌面一,然后选择设置 选择“docker engine”选项卡,如图"insecure-registries": [],更改为 "insecure-registries": ["192.168.99.1:5000"],

    点击应用并重启按钮 docker restart 后,要检查修改是否已应用,打开 cmd 控制台并执行以下命令:docker system info 然后检查“insecure-registries”部分中是否存在 192.168.99.1:5000

【讨论】:

您是如何获得192.168.99.1:5000 值的? 回答你的请求 PAA - 那是他的注册表的 IP 地址和端口 - 默认为 5000。【参考方案5】:

如果您在 Windows 上使用 Docker 桌面

单击任务栏中的泊坞鲸图标

出现一个菜单,点击设置

出现一个弹出窗口,点击守护进程

在“不安全的注册表”文本区域中输入您的不安全注册表

点击应用

工作完成,无需手动编辑任何文件

【讨论】:

这也适用于我的 MacOS Docker 桌面。请注意需要重新启动守护程序,因此任何正在运行的容器都将被杀死。 看起来他们从 Windows Docker Desktop 中删除了该功能,就像我点击设置 1 时一样。我没有弹出窗口,2。如果我假设您只是在谈论显示的选项:常规/资源/Docker 引擎/实验功能/Kubernetes/软件更新。 (更新,看起来下面的答案有你看到的图像,你需要进入 Docker 引擎)【参考方案6】:

也许有人又碰到了这个问题,@user674669 也应该提到应该在想要连接到相关 Docker 注册表的client machine 上设置sudo /etc/docker/daemon.json

这允许客户端连接到服务器

【讨论】:

这是关键,它在客户端机器上是必需的,我在服务器机器上做谢谢!【参考方案7】:

如果您在 Windows 机器上使用 minikube 以及 minikube 插件注册表。

1.找到注册表IP。与 minikube IP 相同。

> minikube ip

2.编辑文件:

C:\Users\<username>\.minikube\machines\minikube\config.json

 "InsecureRegistry": [
                "10.96.0.0/12",      // Add coma
                "<minikube IP>:5000" //-> Add this line
            ],

    重启 minikube

    &gt; minikube start

【讨论】:

【参考方案8】:

necron9x11 的回答对我有用。请注意,如果您正在使用 Docker-in-Docker 部署,例如容器化 Jenkins (https://www.jenkins.io/doc/book/installing/docker/),您可以添加“daemon.json”和“docker”文件作为镜像构建的一部分。这样,两者都包含在支持 Jenkins 映像的可部署 dind 映像中。只需使用 Dockerfile 在同一目录中创建这两个文件:

那么Doc​​kerfile的内容是:

FROM docker:dind
USER root
ADD docker /etc/default/docker
ADD daemon.json /etc/docker/daemon.json

最后像往常一样构建和部署:

docker build -f Dockerfile.dind -t dind-custom .
docker run ...
   (name + env + volume + etc)
   dind-custom

现在您的 dind 容器可以访问在 daemon.json 中指定为 ["host:port"] 的不安全注册表。

【讨论】:

【参考方案9】:

这是“测试不安全的注册表”的官方页面说明。 解决方案:

    添加“insecure-registries”(此线程中的主要解决方案。) 使用自签名证书

https://docs.docker.com/registry/insecure/

【讨论】:

【参考方案10】:

如果启用了 buildkit(在较新的版本中它似乎默认启用)并且添加不安全注册表没有修复它,您可能需要禁用 buildkit,或者将 http:// 添加到主机名不安全的注册表。

通过环境变量禁用 Buildkit:
DOCKER_BUILDKIT=0 docker build -t image_name .
通过 docker daemon 配置文件禁用:
在 Docker 桌面上转到 Settings &gt; Docker Engine ** 请非常小心拼写错误和缺少逗号,因为破坏此文件会阻止 docker 桌面启动。

  ...
  "features": 
    "buildkit": false << SET THIS TO FALSE
  ,
  "insecure-registries": [
    "hostname:18443",
    "hostname:8083"
  ],
  ...

将 URL 配置为 HTTP:

  ...
  "features": 
    "buildkit": true
  ,
  "insecure-registries": [
    "http://hostname:18443",
    "http://hostname:8083"
  ],
  ...

已知问题的文档:

https://github.com/docker/docker.github.io/blob/62adddbb6b1f8d861c72f6ade2c50977fd57f481/registry/insecure.md#known-issue-on-buildkit

【讨论】:

【参考方案11】:

除了更改 daemon.json 之外,我还必须 rm -Rf ~/.docker

信用:https://github.com/moby/moby/issues/28321#issuecomment-638307611

【讨论】:

【参考方案12】:

我在 Ubuntu 中安装了新版本的 Docker,但这些方法都不起作用,所以我安装了旧版 docker

sudo apt-get install docker-ce=5:19.03.12~3-0~ubuntu-focal

正常工作

【讨论】:

【参考方案13】:

我刚刚花了几个小时尝试调试 WSL。事实证明,它结合了 insecure-registreis 正确,但也没有在另一侧设置 DOCKER_TLS_VERIFY。将其设置为 0 或 1 会破坏它,所以我不得不取消设置变量并且它起作用了。

【讨论】:

【参考方案14】:

我也遇到了同样的问题。经过数小时的努力,我发现我需要如下定义不安全的注册表。

如果hosts文件映射为192.168.0.xx docker.local 那么 daemon.json 应该有不安全的注册表(在 etc/docker/daemon.json 中)键应该是: ... “不安全的注册表”:[“docker.local:5000”] ... 之前是这样的: ... “不安全的注册表”:[“192.168.0.xx:5000”] ...

【讨论】:

以上是关于Docker 存储库服务器向 HTTPS 客户端提供 HTTP 响应的主要内容,如果未能解决你的问题,请参考以下文章

docker命令行解析以及如何向服务器端发送请求

使用Nexus3构建Docker私有镜像仓库

Docker 的一些常用命令

阿里云docker 镜像私库建立与使用

服务提供方用户客户端

Tomcat HTTPS 密钥库证书