Почему я получаю сообщение «Не удается подключиться к демону Docker» во время работы демона?


29

Сервис Docker явно работает:

$ systemctl status docker.service 
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2015-12-28 19:20:50 GMT; 3 days ago
     Docs: https://docs.docker.com
 Main PID: 1015 (docker)
   CGroup: /system.slice/docker.service
           └─1015 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs
$ ps wuf -u root | grep $(which docker)
root      1015  0.0  0.3 477048 12432 ?        Ssl   2015   2:26 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs

Однако сам Докер отказывается говорить с ним:

$ docker info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Я использую стандартную конфигурацию Docker , то есть я не изменил ни одного /etcфайла, относящегося к этому сервису.

В чем может быть проблема здесь?

Ответы:


36

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


1
На самом деле не вводит в заблуждение. Не удалось подключиться к демону Docker. "Демон работает?" было только предположение.
— Братчли

2
sudo gpasswd -a alex docker
— Алекс Пуннен

1
sudo gpasswd -a $ USER docker # Работает для любого имени пользователя
— priomsrb

Я сделал это, и это все еще не сработало. Запуск sudo systemctl start dockerисправил это, демон действительно не работал ...
— Накамин

32

На этот вопрос уже дан ответ, но вот дополнительная информация.

Независимо от того, находитесь ли вы в Arch или другом дистрибутиве, таком как Fedora или Ubuntu, Docker использует файл сокета для связи. Когда вы запускаете dockerкоманды, он использует этот сокет для связи с демоном Docker. Конечно, демон должен работать (и он часто отключен по умолчанию), но если ваш пользователь не может получить доступ к сокету, он также не сможет общаться с демоном.

Сначала вы должны установить Docker из репозитория дистрибутива. Некоторые люди скачивают скрипт установки и передают его в оболочку ( curl ... | sh), но рекомендуется установить его из репозитория, чтобы его можно было легко обновить.

Arch:

# pacman -S docker

Fedora:

# dnf install docker

Как упоминалось выше, демон может быть отключен по умолчанию. Если вы хотите использовать Docker, демон должен быть запущен.

Включите его (чтобы он запускался при загрузке):

# systemctl enable docker

Запустите его сейчас (или перезагрузите компьютер):

# systemctl start docker

Теперь по умолчанию (если группа docker отсутствует), сокет Docker принадлежит root:

# ls -la /var/run/docker.sock
srw-rw---- 1 root root 0 Apr 28 17:22 /var/run/docker.sock

Вот почему обычный пользователь не может общаться с демоном Docker. Обычный пользователь не имеет достаточных разрешений для доступа к сокету. Он не может связаться с демоном, поэтому он предполагает, что он не работает, и показывает эту ошибку:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Вот почему многие люди просто запускают все команды Docker с правами root sudo. Но, как описано в другом ответе, Docker имеет собственный механизм для этого, поэтому использование sudo не является необходимым.

В идеале, группа под названием dockerсоздается при установке Docker. Однако, если эта группа не существует при запуске демона, файл сокета принадлежит root.

В некоторых случаях эта группа имела другое имя, как dockerrootв Fedora . Проверьте grep docker /etc/group, есть ли такая группа в вашей системе. Если вы уже используете эту группу (ваш пользователь в ней), вам нужно настроить Docker для ее использования:

В /etc/sysconfig/dockerдобавьте -G dockerroot(примечание: это временное решение, не самое лучшее решение):

OPTIONS='--selinux-enabled -G dockerroot'

После перезапуска демона ваш пользователь сможет получить доступ к сокету:

# systemctl restart docker
# ls -la /var/run/docker.sock
srw-rw---- 1 root dockerroot 0 Apr 28 17:32 /var/run/docker.sock

В противном случае официальным способом было бы использовать группу под названием docker. Если он существует, Docker автоматически его использует, т. Е. Устанавливает группу сокетов в эту группу. Если он не существует, все, что вам нужно сделать, это создать его и перезапустить демон:

# groupadd docker
# systemctl restart docker

Файл сокета будет принадлежать этой группе:

# srw-rw---- 1 root docker 0 Apr 28 17:42 /var/run/docker.sock

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

# usermod -aG docker (user)

Возможно, вам придется выйти и снова войти (или su - (user)), запустить, idчтобы увидеть, если вы находитесь в группе.

Затем вы можете использовать Docker без sudo / root:

$ docker version --format '{{.Server.Version}}'
1.9.1

Наконец, слово предупреждения. Только доверенные пользователи могут иметь право управлять вашим демоном Docker . См. Https://docs.docker.com/engine/security/security/ .
(Но, конечно, то же самое верно для sudo - в wheelгруппе должны быть только доверенные пользователи .)


1
Это, кажется, не отвечает на оригинальный вопрос.
— l0b0

4
@ l0b0: Я хотел объяснить, почему это происходит, надеясь, что это кому-нибудь пригодится. Команда usermod, которая добавляет пользователя в группу, скрыта в средней части ответа. Если вы не нашли этот ответ полезным, дайте мне знать, чтобы я мог удалить его.
— basic6

4
Да, он отвечает и объясняет решение для Arch.
— kodeart

Я сделал все это, и я все еще сталкиваюсь с проблемой, упомянутой OP. Ни один из шагов, связанных с разрешением, не решил проблему.
— mopsyd

3

sudo usermod -aG docker [имя пользователя]

затем выйдите из системы, затем войдите снова


1

Проведя некоторые исследования по решению этой проблемы в моей системе Linux, я решил написать этот ответ. Вот что я сделал, чтобы исправить проблему.

На Fedora 22

Установка Docker:

$> curl -fsSL https://get.docker.com/ | sh

После установки Docker:

Пользователь должен быть добавлен в группу Docker.

$> sudo usermod -aG docker

Должен быть запущен демон Docker

$> sudo service docker start

Вы можете настроить запуск демона при загрузке

$> sudo chkconfig docker on

Вы можете убедиться, что служба Docker запущена

$> service docker status

И последняя последняя проверка

$> docker run hello-world

+1 для полного примера, хотя многие из этих команд не применимы к моей ситуации (установка с pacmanиспользованием systemctlвместо service+ chkconfig).
— 10

1

Если вы используете Fedora 23 или Redhat, отредактируйте /etc/sysconfig/dockerи измените следующее

OPTIONS='--selinux-enabled --log-driver=journald -G yourdockergroup'

Перезапустите докер.

Убедитесь, что вы добавили эту группу в систему и добавили себя в группу.



1

Если вы запустили ваш механизм докера с помощью: sudo service docker start

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

Вы можете просто остановить это с помощью: sudo service docker stop

и запустите его как обычный пользователь: запуск службы Docker


Мне не нужно было добавлять пользователя до docker groupсих пор. sudo service startработал на меня. Однако, будет наблюдать, если есть что-то новое.
— Ступиднетизен

0

У меня тоже была такая же проблема. Проблема была в сокетах, выделенных для docker-daemon и docker-client.

  1. Во-первых, не было установлено разрешение для docker-клиента на docker.sock. Вы можете установить его, используя sudo usermod -aG docker $USER

  2. Затем проверьте ваш bash-файл, где запущен docker-клиент. Для меня это было установлено на 0.0.0.0:2375, когда docker-daemon работал на сокете unix. (Это было установлено в конфигурационном файле dockerd).

  3. Просто закомментируйте оскорбительную строку, и она будет работать нормально.

  4. Но если вы хотите, чтобы он работал на порте TCP вместо сокета unix, измените файл конфигурации dockerd, установите его на 0.0.0.0.2375 и оставьте строку в bash, как есть, или установите ее на 0.0. 0.0: 2375.


0

Вот шаги, которые я выполнил, чтобы исправить следующее

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. Добавьте себя в группу Docker

    usermod -aG docker $USER

  2. Исправьте права доступа к докеру socker и команде.

    sudo chgrp docker /usr/bin/docker
    sudo chgrp docker /var/run/docker.sock

    $ ll $(which docker) -rwxr-xr-x 1 root docker 18991768 08.07.2017 22:57 /usr/bin/docker*

    $ ll /var/run/docker.sock srw-rw---- 1 root docker 0 23.07.2017 10:21 /var/run/docker.sock

  3. Добавьте переменные в конфигурационную среду для команды docker

    export DOCKER_HOST=unix:///var/run/docker.sock

  4. Отдых Докер

    sudo systemctl restart docker

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.