Что такое ошибка "server gave HTTP response to HTTPS client"?

Ошибка Docker: Error response from daemon: server gave HTTP response to HTTPS client возникает, когда Docker пытается подключиться к registry по HTTPS, но сервер отвечает по HTTP.

Причины возникновения

  • Registry настроен только на HTTP
  • Неправильная конфигурация Docker daemon
  • Проблемы с SSL/TLS сертификатами
  • Registry использует самоподписанные сертификаты
  • Неправильный URL registry

Как отладить ошибку

  1. Проверь URL registry - убедись в правильности протокола
  2. Проверь конфигурацию Docker - docker info
  3. Проверь доступность registry - curl -I registry-url
  4. Проверь SSL сертификаты - openssl s_client

Как исправить ошибку

1. Настрой insecure registry

1// /etc/docker/daemon.json
2{
3  "insecure-registries": [
4    "registry.example.com:5000",
5    "192.168.1.100:5000"
6  ]
7}

2. Перезапусти Docker daemon

1# Перезапусти Docker
2sudo systemctl restart docker
3
4# Проверь статус
5sudo systemctl status docker
6
7# Проверь конфигурацию
8docker info

3. Используй правильный URL

1# Для HTTP registry
2docker pull registry.example.com:5000/my-image:latest
3
4# Для HTTPS registry
5docker pull https://registry.example.com/my-image:latest
6
7# Логин в registry
8docker login registry.example.com:5000

4. Настрой SSL сертификаты

1# Добавь сертификат в систему
2sudo cp ca.crt /usr/local/share/ca-certificates/
3sudo update-ca-certificates
4
5# Или добавь в Docker
6sudo mkdir -p /etc/docker/certs.d/registry.example.com
7sudo cp ca.crt /etc/docker/certs.d/registry.example.com/

5. Используй HTTP вместо HTTPS

1# Принудительно используй HTTP
2docker pull http://registry.example.com:5000/my-image:latest
3
4# Или настрой в daemon.json
5{
6  "registry-mirrors": ["http://registry.example.com:5000"]
7}

Как мониторить подобные ошибки

  • Мониторь доступность registry
  • Проверяй SSL сертификаты
  • Настрой алерты на ошибки подключения
  • Логируй все попытки доступа к registry

FAQ

В: Как настроить приватный registry с HTTP?

О: Добавь registry в insecure-registries в daemon.json и перезапусти Docker.

В: Что делать с самоподписанными сертификатами?

О: Добавь сертификат в систему или настрой insecure registry.

В: Как проверить доступность registry?

О: Используй curl или wget для проверки HTTP/HTTPS ответов.

Лучшие практики

  • Используй HTTPS для production registry
  • Настрой правильные SSL сертификаты
  • Используй insecure registry только для разработки
  • Мониторь доступность registry
  • Документируй конфигурацию registry