Назад | Перейти на главную страницу

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

Я пытаюсь создать частный реестр 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

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

ОБНОВЛЕНИЕ 4

Поработав еще немного, кажется, что порт, который я назначил своему частному реестру, прослушивает только IPV6, а не IPV4. В соответствии с этот git thread, докер может показаться, что он слушает только 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

ОБНОВЛЕНИЕ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.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.

ОБНОВЛЕНИЕ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.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 configure» - единственное, что кажется проблемой. Собираюсь изучить это. Был бы очень, очень признателен за любую дополнительную информацию.

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

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

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

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

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

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