Нажатие на локальный реестр 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

UPDATE2

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

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

Update3

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

UPDATE4

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

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

user@devstack01:~$ sudo docker version
Client:
 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

Server:
 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

UPDATE5

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

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.1
time="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.1
time="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.1
time="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.1
time="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.1
time="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.1
time="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.1
time="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.1
time="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.1
time="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.1
time="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.1
time="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, когда я пытаюсь вставить изображение в свой реестр:

DEBU[0037] Calling POST /v1.22/images/localhost:6000/hello-world/push
DEBU[0037] POST /v1.22/images/localhost:6000/hello-world/push?tag=
DEBU[0037] Trying to push localhost:6000/hello-world to https://localhost:6000 v2
DEBU[0037] Error getting v2 registry: Get https://localhost:6000/v2/: read tcp [::1]:33560->[::1]:6000: read: connection reset by peer
DEBU[0037] Trying to push localhost:6000/hello-world to http://localhost:6000 v2
DEBU[0037] Error getting v2 registry: Get http://localhost:6000/v2/: read tcp [::1]:33562->[::1]:6000: read: connection reset by peer
DEBU[0037] Trying to push localhost:6000/hello-world to https://localhost:6000 v1
DEBU[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 v1
DEBU[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: latest
DEBU[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,

UPDATE6

Явно указал порт 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.1
time="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.1
time="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.1
time="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.1
time="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.1
time="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 not сконфигурировано" - единственное, что может показаться проблемой. Собираюсь разобраться в этом. Очень, очень признателен за любую дополнительную информацию.

2 ответа

Решение

Решил вопрос:

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

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

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

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

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

Другие вопросы по тегам