Нажатие на локальный реестр docker приводит к ошибке сброса соединения

Я пытаюсь создать частный реестр Docker, выполнив следующие действия это руководство. Я загрузил и пометил образ Ubuntu и создал контейнер реестра, и теперь я намерен поместить его в свой реестр, но когда я вызываю sudo docker push localhost:6000/Ubuntu Я получаю следующий результат:

The push refers to a repository [localhost:6000/ubuntu]Put http://localhost:6000/v1/repositories/ubuntu/: http: can't write HTTP request on broken connection

Все, что я смог найти, это то, что ошибка "не удается записать HTTP-запрос" - это ошибка Go, но, к сожалению, я не смог найти ничего, связанного с тем, как я могу разрешить ее в Docker. Я также пытался найти журналы для команд Docker, чтобы попытаться получить более подробную информацию об этой проблеме, но, похоже, журналы доступны только для контейнеров, и я не запускаю это в контейнере.

Как я могу устранить эту ошибку?

ОБНОВЛЕНИЕ

Я просто снова запустил команду, ничего не изменив, и получил другую ошибку:

Put http://localhost:6000/v1/repositories/ubuntu/: read tcp [::1]:33417->[::1]:6000: read: connection reset by peer

ОБНОВЛЕНИЕ 2

И снова, запустил его, ничего не изменив, и теперь получаю:

Put http://localhost:6000/v1/repositories/ubuntu/: EOF

ОБНОВЛЕНИЕ 3

Немного повозившись, я обнаружил, что изображение, которое я пытался поместить в свой реестр, действительно появляется в моем списке изображений docker, но, похоже, я не могу его извлечь.

ОБНОВЛЕНИЕ 4

После того, как я еще немного повозился, кажется, что порт, который я назначил своему частному реестру, прослушивает только IPV6, а не IPV4. Согласно с этот git thread, для docker обычно кажется, что он прослушивает только IPV6, но после запуска telnet localhost, netstat -ntlp, и iptables -t nat -nxvL, я по-прежнему не вижу никаких признаков того, что что-либо прослушивается на 127.0.0.1:6000, который является портом, которому должен быть назначен мой реестр (который просто работает как контейнер). Вместо этого, похоже, он прослушивает :::1:6000.

Кроме того, потому что это было запрошено и потому, что я должен был перечислить это независимо:

user@devstack01:~$ sudo docker versionClient: Version:      1.10.3 API version:  1.22 Go version:   go1.5.3 Git commit:   20f81dd Built:        Thu Mar 10 15:54:52 2016 OS/Arch:      linux/amd64Server: Version:      1.10.3 API version:  1.22 Go version:   go1.5.3 Git commit:   20f81dd Built:        Thu Mar 10 15:54:52 2016 OS/Arch:      linux/amd64

ОБНОВЛЕНИЕ 5

журналы контейнера реестра:

time="2016-04-04T18:34:22Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.5.3 instance.id=25b8dd5a-f154-455b-84ad-3dd61ccf04e0 version=v2.3.1time="2016-04-04T18:34:22Z" level=info msg="redis not configured" go.version=go1.5.3 instance.id=25b8dd5a-f154-455b-84ad-3dd61ccf04e0 version=v2.3.1time="2016-04-04T18:34:22Z" level=info msg="Starting upload purge in 58m0s" go.version=go1.5.3 instance.id=25b8dd5a-f154-455b-84ad-3dd61ccf04e0 version=v2.3.1time="2016-04-04T18:34:22Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.5.3 instance.id=25b8dd5a-f154-455b-84ad-3dd61ccf04e0 version=v2.3.1time="2016-04-04T18:34:22Z" level=info msg="listening on [::]:5000" go.version=go1.5.3 instance.id=25b8dd5a-f154-455b-84ad-3dd61ccf04e0 version=v2.3.1time="2016-04-04T19:32:22Z" level=info msg="PurgeUploads starting: olderThan=2016-03-28 19:32:22.890256531 +0000 UTC, actuallyDelete=true"time="2016-04-04T19:32:22Z" level=info msg="Purge uploads finished.  Num deleted=0, num errors=1"time="2016-04-04T19:32:22Z" level=info msg="Starting upload purge in 24h0m0s" go.version=go1.5.3 instance.id=25b8dd5a-f154-455b-84ad-3dd61ccf04e0 version=v2.3.1time="2016-04-05T13:54:59Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.5.3 instance.id=90882341-a150-4384-9434-b091aacdd68b version=v2.3.1time="2016-04-05T13:54:59Z" level=info msg="redis not configured" go.version=go1.5.3 instance.id=90882341-a150-4384-9434-b091aacdd68b version=v2.3.1time="2016-04-05T13:54:59Z" level=info msg="Starting upload purge in 59m0s" go.version=go1.5.3 instance.id=90882341-a150-4384-9434-b091aacdd68b version=v2.3.1time="2016-04-05T13:54:59Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.5.3 instance.id=90882341-a150-4384-9434-b091aacdd68b version=v2.3.1time="2016-04-05T13:54:59Z" level=info msg="listening on [::]:5000" go.version=go1.5.3 instance.id=90882341-a150-4384-9434-b091aacdd68b version=v2.3.1time="2016-04-05T14:53:59Z" level=info msg="PurgeUploads starting: olderThan=2016-03-29 14:53:59.133142744 +0000 UTC, actuallyDelete=true"time="2016-04-05T14:53:59Z" level=info msg="Purge uploads finished.  Num deleted=0, num errors=1"time="2016-04-05T14:53:59Z" level=info msg="Starting upload purge in 24h0m0s" go.version=go1.5.3 instance.id=90882341-a150-4384-9434-b091aacdd68b version=v2.3.1

Журналы отладки Docker daemon, когда я пытаюсь вставить изображение в свой реестр:

DEBU[0037] Calling POST /v1.22/images/localhost:6000/hello-world/pushDEBU[0037] POST /v1.22/images/localhost:6000/hello-world/push?tag=DEBU[0037] Trying to push localhost:6000/hello-world to https://localhost:6000 v2DEBU[0037] Error getting v2 registry: Get https://localhost:6000/v2/: read tcp [::1]:33560->[::1]:6000: read: connection reset by peerDEBU[0037] Trying to push localhost:6000/hello-world to http://localhost:6000 v2DEBU[0037] Error getting v2 registry: Get http://localhost:6000/v2/: read tcp [::1]:33562->[::1]:6000: read: connection reset by peerDEBU[0037] Trying to push localhost:6000/hello-world to https://localhost:6000 v1DEBU[0037] attempting v2 ping for registry endpoint https://localhost:6000/v2/DEBU[0037] attempting v1 ping for registry endpoint https://localhost:6000/v1/DEBU[0037] Trying to push localhost:6000/hello-world to http://localhost:6000 v1DEBU[0037] Image list: [0xc820aa3840 0xc820704500]DEBU[0037] Tags by image: map[sha256:690ed74de00f99a7d00a98a5ad855ac4febd66412be132438f9b8dbd300a937d:[latest]]DEBU[0037] Pushing ID: b652ec3a27e758f30de4742156b5d096bb19c82f2dc836e96e430323ba166ffe with Tag:DEBU[0037] Pushing ID: 690ed74de00f99a7d00a98a5ad855ac4febd66412be132438f9b8dbd300a937d with Tag: latestDEBU[0037] [registry] PUT http://localhost:6000/v1/repositories/hello-world/DEBU[0037] Image list pushed to index:[{"id":"b652ec3a27e758f30de4742156b5d096bb19c82f2dc836e96e430323ba166ffe"},{"id":"690ed74de00f99a7d00a98a5ad855ac4febd66412be132438f9b8dbd300a937d","Tag":"latest"}]DEBU[0037] Not continuing with error: Put http://localhost:6000/v1/repositories/hello-world/: EOF

Журналы реестра заканчиваются сообщением о том, что произошла ошибка, но из остальной части журнала я не могу понять, что это была за ошибка. Я даже разделил журнал на stdout и stderr, и в stderr ничего не было.

Кроме того, я подтвердил, что реестр прослушивает ipv4. Бегущий nc -l -4 6000 возвращается Address already in use По крайней мере, я думаю, что подтвердил это. Адреса ipv4 по-прежнему не будут отображаться с netstat.

ОБНОВЛЕНИЕ 6

Явно указанный порт ipv4 с docker run -d -p 127.0.0.1:8000:8000, этот порт отображается как прослушиваемый в netstat. Все еще получаю те же ошибки. Однако журналы Docker немного отличаются:

time="2016-04-07T15:19:31Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.5.3 instance.id=6391e3dc-6644-4a45-8e8b-a08c8ff798a6 version=v2.3.1time="2016-04-07T15:19:31Z" level=info msg="redis not configured" go.version=go1.5.3 instance.id=6391e3dc-6644-4a45-8e8b-a08c8ff798a6 version=v2.3.1time="2016-04-07T15:19:31Z" level=info msg="Starting upload purge in 1m0s" go.version=go1.5.3 instance.id=6391e3dc-6644-4a45-8e8b-a08c8ff798a6 version=v2.3.1time="2016-04-07T15:19:31Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.5.3 instance.id=6391e3dc-6644-4a45-8e8b-a08c8ff798a6 version=v2.3.1time="2016-04-07T15:19:31Z" level=info msg="listening on [::]:5000" go.version=go1.5.3 instance.id=6391e3dc-6644-4a45-8e8b-a08c8ff798a6 version=v2.3.1time="2016-04-07T15:20:31Z" level=info msg="PurgeUploads starting: olderThan=2016-03-31 15:20:31.061864096 +0000 UTC, actuallyDelete=true"time="2016-04-07T15:20:31Z" level=info msg="Purge uploads finished.  Num deleted=0, num errors=1"time="2016-04-07T15:20:31Z" level=info msg="Starting upload purge in 24h0m0s" go.version=go1.5.3 instance.id=6391e3dc-6644-4a45-8e8b-a08c8ff798a6 version=v2.3.1

Сообщение "redis не настроен" - это единственное, что, похоже, может быть проблемой. Собираюсь разобраться в этом. Был бы очень, очень признателен за любую дополнительную информацию.

Я пишу это, потому что потратил на это несколько часов, прежде чем, наконец, разгадал его.

Моя ситуация: я использую docker версии 17 на Fedora 25 и пытался запустить реестр, используя пользовательский конфигурационный файл, и получаю то же сообщение о сбросе однорангового узла, что и выше. Казалось, что это происходило из-за сброса небезопасного HTTP-соединения, и поэтому я обнаружил, что люди говорят мне добавить DOCKER_OPTS="--insecure-registry localhost:6000 127.0.0.1:6000" вариант в /etc/sysconfig/docker и /etc/default/docker файл и перезапустите службу docker. Однако это не устранило проблему (Здесь есть официальная документация по этому поводу).

Что, наконец, сработало, так это запуск реестра с использованием образа docker compose. Я следовал инструкциям, приведенным в руководство digitalocean, который в основном поможет вам использовать docker-compose для настройки реестра, а затем использовать nginx для настройки SSL , что сработает, если это будет сделано на ваших локальных серверах.

Однако оказывается, что все, что мне нужно было сделать, это Шаг 2, то есть настроить docker-compose.yml как указано, запустите реестр, и вуаля! толчок теперь работает.

Решил проблему:

Пришлось бежать с docker run -d -p 127.0.0.1:6000:5000. Отказ от использования localhost гарантировал использование ipv4 (я почти уверен, что он использовался иначе, но, по крайней мере, теперь он отображается в netstat), а контейнеры прослушивают свой порт 5000, так что иначе это не сработало.

Эй, это решено? Какую последнюю ошибку вы получаете?
Также вы можете публиковать версии docker, реестра и т.д. Используете ли вы реестр как контейнер docker (или как работает ваш реестр?)

@Maniankara Я обновил вопрос

Проверьте журналы вашего реестра. Вероятно, вы пропустили что-то важное, пока отвлекались на отсутствие проблемы с IPv6.

@MichaelHampton подойдет. Я опубликую результаты через минуту.