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 docker
和 sudo 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
> minikube start
【讨论】:
【参考方案8】: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"] 的不安全注册表。
【讨论】:
【参考方案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 > 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 响应的主要内容,如果未能解决你的问题,请参考以下文章