Docker仓库服务器向HTTPS客户端发出了HTTP响应。

163

我正在使用 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 信息

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上尝试这个,一切都运行得非常完美。

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

非常感谢您的所有回答!


我的问题是我在daemon.json文件中有一个拼写错误(像dEAmon.json这样的)。 - undefined
19个回答

203

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

Insecure Registries:
 127.0.0.0/8

尝试将此行添加到Docker的daemon.json文件中,并重新启动Docker Daemon:
(在Windows上为C:\ProgramData\Docker\config\daemon.json,在Linux上为/etc/docker/daemon.json

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

2
它在 C:\ProgramData\Docker\config 中。 - Yuankun
7
我在“C:\Users\kacal.docker”路径下发现了一些 config.json 文件。 - Tomáš Kacálek
7
提示:在Linux系统上,此文件位于/etc/docker/daemon.json,参考网址为https://docs.docker.com/registry/deploying/。 - Ogre Psalm33
7
更改 daemon.json 后需要重新启动 Docker 吗?我需要重新启动以刷新这些更改。sudo systemctl restart docker - John smith
1
我能把它变成安全的注册表吗? - Nate-Wilkins
显示剩余7条评论

100
在CentOS 7.2.1511上,我不得不创建一个新文件

/etc/docker/daemon.json 

随着内容

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

主机名是托管我的Docker注册表的服务器的主机名,端口是Docker注册表可用的端口。在我的情况下,它们是192.168.99.1:50000。

然后通过执行以下操作重新启动Docker守护程序:

$ sudo service docker restart

7
更新daemon.json后,不要忘记重新启动docker服务!!! - nix
1
但是如何使其安全或使用https? - McLan
4
"systemctl docker reload"足够了(而且更快)重新启动将会结束所有正在运行的程序 :) - FabricioFCarv

68
如果您使用的是 Windows 操作系统:
  1. 在“开始菜单”中,右键单击 Docker Desktop,然后选择“设置”
  2. 选择“Docker 引擎”选项卡,并按照以下图片所示进行更改:"insecure-registries": [], 修改为 "insecure-registries": ["192.168.99.1:5000"],

Docker engine tab

  1. 点击“应用”并重启 Docker
  2. 在 Docker 重启后,打开 cmd 命令行窗口,并执行以下命令:docker system info ,然后检查“insecure-registries”部分是否存在“192.168.99.1:5000”

你是怎么获取192.168.99.1:5000的值的? - PAA
回答你的问题PAA - 那是他注册表的IP地址,端口默认为5000。 - Traderhut Games
也适用于Ubuntu(使用Docker桌面版)。在顶部答案中创建守护程序JSON对我无效,但这个方法有效! :) - Hedgelot
适用于Ubuntu 20的Docker桌面版 - ZhaoqunZhong

61
希望这可以帮助到有问题的人解决 insecure-registries 的问题。
将以下内容添加到/etc/docker/daemon.json文件中:{ "insecure-registries":["host:port"] },但这对我来说不起作用,直到我创建了/etc/default/docker文件,并在其中放入以下行:DOCKER_OPTS="--config-file=/etc/docker/daemon.json",然后使用sudo systemctl stop dockersudo systemctl start docker重启docker守护进程。
由于某种原因,只执行sudo systemctl restart docker不起作用。它会抛出一个关于试图太快地重启服务的错误。
另外,在["host:port"]中,我使用我的Docker注册表的IP而不是主机名,因为我没有设置DNS或hosts文件来通过主机名查找注册表。
直到我在这里偶然发现了/etc/default/docker的方法,我才彻底崩溃。
我刚开始使用Docker,所以我不知道这是否是自最初的文章回答以来的新要求,或者是否有其他事情我错过了。尽管所有我做的就是按照Docker网站上当前文档的指示操作。

20
如果启用了buildkit(在新版本中似乎默认启用),并且添加不安全的注册表没有解决问题,则可能需要禁用buildkit,或者在不安全的注册表中将主机名添加http://。
通过环境变量禁用Buildkit:
DOCKER_BUILDKIT=0 docker build -t image_name .
通过docker守护进程配置文件禁用:
  • 在Docker桌面版中,转到设置 > Docker引擎
    **请格外小心拼写错误和逗号的缺失,因为这会导致文件损坏,从而阻止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

(注意:此链接需要访问外部网站)

5
将不安全注册表中的主机名添加http://有所帮助,谢谢! - alexanderzhirov
1
救命稻草的解决方案! - Felipe Desiderati

13
如果您正在使用Windows的Docker Desktop:
  • 单击任务栏中的docker鲸标志

  • 出现一个菜单,单击设置(Settings)

  • 弹出窗口出现,单击守护进程(Daemon)

  • 在"Insecure registries"文本区域中输入您的不安全注册表

  • 单击应用(Apply)

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

2
这在我的MacOS Docker桌面版上也可以工作。请注意,必须重新启动守护程序,因此任何正在运行的容器都将被终止。 - Ed Cardinal
看起来他们从Windows Docker Desktop中删除了该功能,因为当我单击设置1时,我没有弹出窗口;如果我假设您只是在谈论显示的选项:常规/资源/Docker引擎/实验功能/Kubernetes/软件更新。(更新,看起来下面的答案有一个图像显示你所看到的内容,你需要进入Docker引擎) - Traderhut Games

9
也许有人会再次遇到这个问题,@user674669也应该提到sudo /etc/docker/daemon.json需要在客户机器上设置,以连接到相关的Docker注册表。

这样可以使客户端连接到服务器。


1
那就是关键,它在客户端机器上是必需的,而我在服务器机器上进行了操作,谢谢! - Luis Manrique
那是关键。谢谢! - thiagolsilva

6

如果您正在Windows机器上使用minikube,并使用minikube插件registry。

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
            ],
  1. 重启 minikube

    > minikube start


3
necron9x11的回答对我有用。请注意,如果您正在使用Docker-in-Docker部署,例如容器化的Jenkins(https://www.jenkins.io/doc/book/installing/docker/),您可以将 "daemon.json" 和 "docker" 文件添加为构建镜像的一部分。这样,两个文件都包含在支持Jenkins镜像的可部署dind镜像中。只需在与Dockerfile相同的目录中创建这两个文件:
然后,Dockerfile 的内容如下:
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"]的不安全注册表。

2

这是一个官方页面,解释了如何“测试不安全的注册表”。

解决方案:
  1. 添加“insecure-registries”(本主题中的主要解决方案)
  2. 使用自签名证书

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接