🐳 Как устранить ошибку “Cannot Connect to the Docker Daemon” Errors”

by itisgood

Docker – одна из ведущих платформ для создания и запуска программных контейнеров.

Он поставляется со всем необходимым для использования контейнеров как на одном узле, так и на нескольких распределенных узлах в режиме Swarm.

Docker имеет архитектуру, основанную на демонах.

Программное обеспечение, отвечающее за создание и запуск контейнеров, не зависит от процесса CLI, который принимает ваши команды.

Это означает, что вы увидите ошибки в CLI, если попытаетесь выполнить команды без активного соединения с демоном.

В этой статье мы поделимся некоторыми методами устранения этих разочаровывающих сообщений.

Симптомы проблемы

Docker CLI зависит от наличия соединения с демоном.

Он взаимодействует с демоном с помощью вызовов API.

Когда настроенный демон недоступен, команды docker, такие как docker ps, docker run и docker build, выдают сообщение об ошибке, подобное этому:

$ docker run hello-world:latest
Cannot connect to the Docker daemon at unix:///var/run/docker.sock
Is the docker daemon running?
Система показывает, что CLI пытался установить связь с демоном Docker, используя Unix-сокет /var/run/docker.sock.
Сокет не открыт, поэтому соединение не удалось.

1. Проверьте, запущена ли служба демона Docker

Демон Docker обычно управляется службой systemd, которая автоматически запускает Docker после перезагрузки хоста.
Устранение неполадок можно начать с проверки того, запущена ли эта служба:
$ sudo systemctl status docker
docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: inactive (dead)

Служба должна сообщить Active: active (running), если демон запущен.

В примере выше показано inactive (dead), что означает, что демон остановлен.

Запустите Docker с помощью следующей команды:

$ sudo systemctl start docker

Теперь вы должны иметь возможность успешно выполнять команды docker CLI.

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

Вы можете решить эту проблему, включив службу, что позволит systemd запускать ее автоматически:

$ sudo systemctl enable docker
$ sudo systemctl daemon-reload

Команда daemon-reload предписывает systemd перезагрузить свою конфигурацию, чтобы применить изменения.

2. Запуск демона вручную

Иногда вы можете использовать систему, в которой не установлена служба Docker.

Вы можете вручную запустить демон Docker с помощью команды dockerd.

Обычно ее нужно запускать от имени root.

$ sudo dockerd
INFO[2022-06-29T15:12:49.303428726+01:00] Starting up

Docker будет оставаться доступным до тех пор, пока выполняется команда.

Используйте Ctrl+C для остановки демона.

3. Проверка правильности выбора демона в CLI

Проблемы могут возникнуть, когда CLI пытается подключиться к удаленному экземпляру демона Docker.

Обычно это происходит, когда в сообщении об ошибке указывается TCP-адрес:

$ docker run hello-world:latest
Cannot connect to the Docker daemon at tcp:///0.0.0.0:2375

В этом примере docker CLI пытается связаться с демоном Docker по адресу 0.0.0.0:2375, используя TCP, а не локальный сокет Unix Docker.

Это не удастся, если поддержка TCP демоном Docker отключена или указанный хост недоступен в сети.

Обычно эту проблему можно решить, переключившись на правильный контекст Docker CLI для соединения с демоном, которое вы хотите использовать:

$ docker context use default

Вы можете перечислить все доступные контексты и конечные точки демонов, к которым они подключаются, с помощью команды context ls:

$ docker context ls
NAME        DESCRIPTION                               DOCKER ENDPOINT             
default *   Current DOCKER_HOST based configuration   unix:///var/run/docker.sock

Выбранный в данный момент контекст выделяется звездочкой.

Неожиданные значения в колонке DOCKER ENDPOINT обычно вызваны тем, что установлена переменная окружения DOCKER_HOST.

В этом случае вы увидите предупреждение:

$ export DOCKER_HOST=1.2.3.4
$ docker context ls
NAME        DESCRIPTION                               DOCKER ENDPOINT
default *   Current DOCKER_HOST based configuration   tcp://1.2.3.4:2375
Warning: DOCKER_HOST environment variable overrides the active context. To use a context, either set the global --context flag, or unset DOCKER_HOST environment variable.

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

В этом примере команды docker всегда будут нацелены на экземпляр демона по адресу tcp://1.2.3.4:2375.

Эту проблему можно решить, очистив переменную DOCKER_HOST:

$ export DOCKER_HOST=

Теперь Docker будет использовать конечную точку, настроенную вашим активным контекстом.

Это будет локальный Unix-сокет по умолчанию в /var/run/docker.sock, если вы вручную не настроили пользовательский контекст.

$ docker context ls
NAME        DESCRIPTION                               DOCKER ENDPOINT             
default *   Current DOCKER_HOST based configuration   unix:///var/run/docker.sock

4. Проблемы с правами

Неправильные разрешения пользователя на сокет Docker являются еще одной распространенной причиной проблем с подключением демона.

Этот вид проблемы обычно показывает немного другое сообщение об ошибке:

$ docker run hello-world:latest
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
Это происходит, когда вашей учетной записи пользователя Unix не хватает прав на взаимодействие с сокетом, который предоставляет API Docker.
Добавление себя в группу docker – лучший способ решения этой проблемы:
$ sudo usermod -aG docker $USER

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

Теперь вы сможете выполнять команды docker без проблем с разрешениями.

 

You may also like

Leave a Comment