Syntax highlighting of devops/docker/troubleshooting

<<TableOfContents()>>

= Docker Troubleshooting =

=== WSL: docker not running ===

После обновления Ubuntu в WSL до версии 22.04 перестал запускать docker-демон. Переустановка докера не помогла.

{{{#!highlight bash
sudo service docker start
sudo service docker status
# * Docker is not running
}}}

В журнале отображается ошибка

{{{#!highlight bash
tail -f /var/log/docker.log | grep -i error
# ...
failed to start daemon: Error initializing network controller: error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain: (iptables  
failed: iptables --wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables): RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATIO  
N-STAGE-1
}}}

Найдено решение на странице https://github.com/microsoft/WSL/issues/6655

{{{#!highlight bash
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
}}}

=== filesystem layer verification failed for digest ===

Вдруг перестали скачиваться образы из gitlab-репозитория. 

{{{#!highlight bash
filesystem layer verification failed for digest ...

}}}

Помогла перезаливка базового образа в docker registry. Кроме того, базовый образ не обновлялся на ci-сервере, что приводило к аналогичной ошибке даже после обновления образа в registry. По умолчанию gitlab-runner должен всегда скачивать образ (см. pull_policy https://docs.gitlab.com/runner/configuration/advanced-configuration.html#the-runnersdocker-section). Пришлось руками удалить базовый образ на ci-сервере и при очередном пайплайне он подтянулся и проблема ушла.

=== tlsv1 alert protocol version ===

После обновления сервера docker-compose на клиентской машине вдруг начал выдавать:

{{{#!highlight bash
ERROR: SSL error: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:661)

}}}

Обновление пакетов ubuntu и версии руби результата не дали.

Помогла установка переменной окружения ''COMPOSE_TLS_VERSION'':

{{{#!highlight bash
COMPOSE_TLS_VERSION=TLSv1_2 docker-compose ...
           Name                          Command               State                       Ports                      
---------------------------------------------------------------------------------------------------------------------
elasticsearch                 /docker-entrypoint.sh elas ...   Up      0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp
...

}}}

Также помогает обновление версии docker-compose

=== pg_hba ===

{{{#!highlight bash
docker compose postgres no pg_hba.conf entry for host ...

}}}

Если при запуске postgres в докере при подключении выдается вышеуказанная ошибка, то необходим сделать

{{{#!highlight bash
docker volume prune

}}}

=== Package 'docker-ce' has no installation candidate ===

Если в процессе установки ''docker'' получаем сообщение

{{{#!highlight bash
sudo apt-get update
# E: Package 'docker-ce' has no installation candidate

}}}

То в первую очередь необходимо проверить разрядность 

{{{
# если в пристутствует i386 или i686 - это 32 бита, 
# а если x86_64 - то 64
uname -a

}}}

=== Cannot connect to the Docker daemon ===

После обновления системы (`sudo apt upgrade`) на сервере, на котором настроено удаленное управление докером, случилось следующее

{{{
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

}}}

Диагностика ничего не говорит

{{{
adminisoit@ds4:~$ sudo systemctl restart docker.service
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
adminisoit@ds4:~$ systemctl status docker.service                                                                                                                                      
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since Пт 2018-12-14 11:34:21 +04; 44ms ago
     Docs: https://docs.docker.com
  Process: 5600 ExecStart=/usr/bin/dockerd -H unix:// (code=exited, status=1/FAILURE)
 Main PID: 5600 (code=exited, status=1/FAILURE)

дек 14 11:34:19 ds4 systemd[1]: Failed to start Docker Application Container Engine.
дек 14 11:34:19 ds4 systemd[1]: docker.service: Unit entered failed state.
дек 14 11:34:19 ds4 systemd[1]: docker.service: Failed with result 'exit-code'.
дек 14 11:34:21 ds4 systemd[1]: docker.service: Service hold-off time over, scheduling restart.
дек 14 11:34:21 ds4 systemd[1]: Stopped Docker Application Container Engine.
дек 14 11:34:21 ds4 systemd[1]: docker.service: Start request repeated too quickly.
дек 14 11:34:21 ds4 systemd[1]: Failed to start Docker Application Container Engine.
дек 14 11:34:21 ds4 systemd[1]: docker.service: Unit entered failed state.
дек 14 11:34:21 ds4 systemd[1]: docker.service: Failed with result 'start-limit-hit'.

}}}

При этом, если убрать строку `hosts` из файла ''/etc/docker/daemon.json'', а также удалить (переименовать) директорию ''/etc/systemd/system/docker.service.d/'', то докер стартует корректно, однако мы лишаемся возможности им управлять удаленно.

Выявлено, что значения в поле `hosts` в файле ''/etc/docker/daemon.json'' и опции вызова демона docker в файле ''/etc/systemd/system/docker.service.d/override.conf'' связаны или даже равнозначны.

'''Итоговое решение проблемы'''

 1. Удалено поле `hosts` из файла ''/etc/docker/daemon.json''
 1. Файл ''/etc/systemd/system/docker.service.d/override.conf'' переименован в ''/etc/systemd/system/docker.service.d/hosts.conf'' (НЕ ОБЯЗАТЕЛЬНО)
 1. Скорректирован файл ''hosts.conf''  

{{{
# Было
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
# Стало
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2376

}}}

 1. Перезапущен докер

{{{
sudo systemctl daemon-reload
sudo systemctl restart docker.service

}}}

=== The input device is not a TTY ===

При запуске композа через CI выдается ошибка: 

{{{
The input device is not a TTY

}}}

Решение здесь - https://github.com/docker/compose/issues/5696

Необходимо добавить переменную окружения в контекст исполнения

{{{
export COMPOSE_INTERACTIVE_NO_CLI=1

}}}

Для Ansible переменная окружения не помогает, т.к. возникает другая ошибка...
Альтернативное решение - это замена команды `docker-compose exec` на `docker exec` без опций `-it`. Для того, чтобы обратиться к конкретному контейнеру из состава композа, можно воспользоваться опцией `container_name` в `docker-compose.yml`.

=== postgresql cannot create temp file for here-document: Permission denied ===

В какой-то момент, после долгого перерыва (включающего в себя обновление дистрибутива и установку vagrant), при попытке запустить контейнер ''postgresql'' выдавалась ошибка

{{{
...
cannot create temp file for here-document: Permission denied

}}}

Помогла лишь переустановка докера и "перезаливка" образов

=== Error response from daemon: manifest for IMAGES not found ===

Причину выявить не удалось. Исправить не удалось. Решение - переустановка ''registry''

{{{
docker run -d -p 5001:5000 \
    --restart=always \
    --name registry2 \
    -v /etc/letsencrypt/live/registry.misuz.ru:/certs \
    -v /opt/docker-registry-2:/var/lib/registry \
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
    registry:2.7.1

}}}