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?
1. Проверьте, запущена ли служба демона 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
$ sudo usermod -aG docker $USER
Вам нужно будет открыть новое окно оболочки или выйти из системы и снова войти, чтобы изменения вступили в силу.
Теперь вы сможете выполнять команды docker без проблем с разрешениями.
- Как использовать Docker без sudo на Ubuntu
- 🐳 Как просмотреть историю событий Docker
- 🖧 Что такое FirewallD и как его реализовать в Linux
- 🐧 Как контролировать целостность файлов в Linux с помощью Osquery
- 🐳 Как установить и использовать Anchore – сканер безопасности для образов контейнеров?
- 🔍 Как установить сканер уязвимостей GVM на Ubuntu 20.04