Почему я получаю сообщение «Не удается подключиться к демону 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файла, относящегося к этому сервису.

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

l0b0
источник

Ответы:

36

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

l0b0
источник
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группе должны быть только доверенные пользователи .)

basic6
источник
1
Это, кажется, не отвечает на оригинальный вопрос.
l0b0
4
@ l0b0: Я хотел объяснить, почему это происходит, надеясь, что это кому-нибудь пригодится. Команда usermod, которая добавляет пользователя в группу, скрыта в средней части ответа. Если вы не нашли этот ответ полезным, дайте мне знать, чтобы я мог удалить его.
basic6
4
Да, он отвечает и объясняет решение для Arch.
kodeart
Я сделал все это, и я все еще сталкиваюсь с проблемой, упомянутой OP. Ни один из шагов, связанных с разрешением, не решил проблему.
mopsyd
3

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

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

user2167582
источник
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

nelaaro
источник