更新 Docker 到1.12后无法拉取/推送图像

私有注册表在 docker 1.10.3的基础上工作得很好,但是在 docker 更新到1.12.0之后,我无法提取/推送映像。

我将/etc/sysconfig/docker 修改为:

OPTIONS='--selinux-enabled=true --insecure-registry=myip:5000'

或者

OPTIONS='--selinux-enabled=true --insecure-registry myip:5000'

但是当我执行 pull/push 时,我得到了这个错误:

$ docker pull myip:5000/cadvisor
Using default tag: latest
Error response from daemon: Get https://myip:5000/v1/_ping: http: server gave HTTP response to HTTPS client

当我将 docker 调回1.10.3时,它仍然能够正常工作,如下所示:

$ docker pull myip:5000/cadvisor
Using default tag: latest
Trying to pull repository myip:5000/cadvisor ...
latest: Pulling from myip:5000/cadvisor
09d0220f4043: Pull complete
a3ed95caeb02: Pull complete
151807d34af9: Pull complete
14cd28dce332: Pull complete
Digest:
sha256:33b6475cd5b7646b3748097af1224de3eee3ba7cf5105524d95c0cf135f59b47
Status: Downloaded newer image for myip/cadvisor:latest

下面列出了一些相关信息:

docker version
Client:
Version: 1.12.0
API version: 1.24
Go version: go1.6.3
Git commit: 8eab29e
Built:


OS/Arch: linux/amd64


Server:
Version: 1.12.0
API version: 1.24
Go version: go1.6.3
Git commit: 8eab29e
Built:


OS/Arch: linux/amd64


docker info
Containers: 4
Running: 1
Paused: 0
Stopped: 3
Images: 241
Server Version: 1.12.0
Storage Driver: devicemapper
Pool Name: docker-253:0-6809-pool
Pool Blocksize: 65.54 kB
Base Device Size: 107.4 GB
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 5.459 GB
Data Space Total: 107.4 GB
Data Space Available: 34.74 GB
Metadata Space Used: 9.912 MB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.138 GB
Thin Pool Minimum Free Space: 10.74 GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Deferred Deletion Enabled: false
Deferred Deleted Device Count: 0
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
WARNING: Usage of loopback devices is strongly discouraged for production use. Use '--storage-opt dm.thinpooldev' to specify a custom block storage device.
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.107-RHEL7 (2016-06-09)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: host overlay null bridge
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 3.10.0-229.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 24
Total Memory: 62.39 GiB
Name: server_3
ID: TITS:BL4B:M5FE:CIRO:5SW6:TVIV:HW36:J7OS:WLHF:46T6:2RBA:WCNV
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
File Descriptors: 21
Goroutines: 32
System Time: 2016-08-02T10:33:06.414048675+08:00
EventsListeners: 0
Registry: https://index.docker.io/v1/
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
Insecure Registries:
127.0.0.0/8


docker exec <registry-container> registry -version
registry github.com/docker/distribution v2.2.1

在调试模式下重新启动 docker 守护进程后,重现问题时的守护进程日志如下所示:

DEBU[0794] Calling POST /v1.24/images/create?fromImage=10.10.10.40%3A5000%2Fcadvisor&tag=latest
DEBU[0794] hostDir: /etc/docker/certs.d/10.10.10.40:5000
DEBU[0794] hostDir: /etc/docker/certs.d/10.10.10.40:5000
DEBU[0794] Trying to pull 10.10.10.40:5000/cadvisor from https://10.10.10.40:5000 v2
WARN[0794] Error getting v2 registry: Get https://10.10.10.40:5000/v2/: http: server gave HTTP response to HTTPS client
ERRO[0794] Attempting next endpoint for pull after error: Get https://10.10.10.40:5000/v2/: http: server gave HTTP response to HTTPS client
DEBU[0794] Trying to pull 10.10.10.40:5000/cadvisor from https://10.10.10.40:5000 v1
DEBU[0794] hostDir: /etc/docker/certs.d/10.10.10.40:5000
DEBU[0794] attempting v1 ping for registry endpoint https://10.10.10.40:5000/v1/
DEBU[0794] Fallback from error: Get https://10.10.10.40:5000/v1/_ping: http: server gave HTTP response to HTTPS client
ERRO[0794] Attempting next endpoint for pull after error: Get https://10.10.10.40:5000/v1/_ping: http: server gave HTTP response to HTTPS client
ERRO[0794] Handler for POST /v1.24/images/create returned error: Get https://10.10.10.40:5000/v1/_ping: http: server gave HTTP response to HTTPS client
DEBU[1201] clean 2 unused exec commands

更重要的是,我只是运行一个简单的命令来启动私有注册表进行测试,其他任何东西都是默认的:

docker run -d -p 5000:5000 --restart=always --name registry -v 'pwd'/data:/var/lib/registry registry:2

没有配置代理。总之,它只是一个用于测试的安静示例环境。

76988 次浏览

I had the same issue.

This helped for me:

  • Create or modify /etc/docker/daemon.json on the client machine

    { "insecure-registries":["myregistry.example.com:5000"] }

  • Restart docker daemon

    sudo /etc/init.d/docker restart

If you are using Windows and you get this error you need to create a file here: "C:\ProgramData\docker\config\daemon.json"

and do the same as @Bspec mentioned above:

{ "insecure-registries":["myregistry.example.com:5000"] }

Then restart docker using PowerShell commands:

Stop-Service docker
Start-Service docker

For Windows users

Add local registry here and apply:

enter image description here

For Mac Users: Update the docker preferences using the (docker) icon in top bar

Preferences -> Daemon -> Insecure Registry [Click (+) sign] -> add :port

hit "Apply & Restart" button at bottom

Pic showing Docker preference window

I also had same issue and followed below steps:

1. Create file

 vi /etc/docker/daemon.json

2. Add below content

{
"insecure-registries":["192.168.1.142:5000"]
}

3.Restart Docker

service docker restart

modifying "/etc/docker/daemon.json" didn't work for me.

Putting it under "/etc/sysconfig/docker" as below, worked.

INSECURE_REGISTRY="--insecure-registry 192.168.24.1:8787"

In order to push, add the ip to insecure registry on the client side (e.g. for Windows)

enter image description here

To pull, add it to the server side (in this case Ubuntu)

vim /etc/docker/daemon.json

enter image description here

and then restart Docker.

None of the solutions worked on Ubuntu 18.04 so spend some time to find the root cause.

Steps to solve an issue

sudo vi /lib/systemd/system/docker.service
# ExecStart=dockerd .... --insecure-registry=192.168.99.100:5000
sudo systemctl stop docker.service
sudo systemctl daemon-reload
sudo systemctl start docker.service

What was the issue?

I would recommend to check where exactly dockerd options are configured regardless of you Linux distribution with:

sudo find /etc /lib -name 'docker*' | while read -r line; do grep dockerd $line /dev/null; done

first test localy

docker push localhost:5000/<ImageName>

if docker pushed is Done going to another server and do it:

sudo nano /etc/docker/daemon.json




{"insecure-registries" : ["<HostName or IP Address registry server>:5000"]}

Saving and...

and for next

sudo systemctl daemon-reload


sudo service docker restart

nice! now docker pushing on another server:

docker tag <image id> <HostName or IP Address registry server>:5000/<ImageName>
docker push <HostName or IP Address registry server>:5000/<ImageName>

Enjoy It.