Чому я отримую "Не вдається підключитися до демона Докера", коли демон працює?


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
Не дуже вводить в оману. Не вдалося підключитися до демона докера. "чи біжить демон?" була лише здогадка.
Братчлі

2
sudo gpasswd -a alex
docker

1
sudo gpasswd -a $ USER docker # Працює для будь-якого імені користувача
priomsrb

Я це зробив, і все ще не вийшло. Запуск sudo systemctl start dockerзафіксував його, демон дійсно був не працює ...
nakamin

32

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

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

Ви спочатку встановите Docker з сховища дистрибутива. Деякі люди завантажують скрипт встановлення та передають його в оболонку ( curl ... | sh), але рекомендується встановити його з сховища, щоб його можна було легко оновити.

Арка:

# pacman -S docker

Fedora:

# dnf install docker

Як було сказано вище, демон може бути відключений за замовчуванням. Якщо ви хочете використовувати Docker, демон повинен працювати.

Увімкніть його (так воно буде запущено під час завантаження):

# systemctl enable docker

Почніть зараз (або перезавантажте):

# systemctl start docker

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

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

Ось чому звичайний користувач не в змозі спілкуватися з демон-докером. Постійний користувач не має достатніх дозволів для доступу до сокета. Він не в змозі дістатися до демона, тому він припускає, що він не працює, і показує цю помилку:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Ось чому багато людей просто запускають усі команди Docker як root, використовуючи 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/ .
(Але, звичайно, це саме стосується і судо - у wheelгрупі повинні бути лише надійні користувачі .)


1
Схоже, це не відповідає на початкове запитання.
l0b0

4
@ l0b0: Ну, я хотів пояснити, чому це відбувається, сподіваючись, що комусь це буде корисно. Команда usermod, яка додає користувача до групи, прихована у середній частині відповіді. Якщо ви не вважаєте цю відповідь корисною, дайте мені знати, щоб я міг її видалити.
basic6

4
Так, він відповідає і пояснює рішення для Arch.
kodeart

Я все це зробив, і досі стикаюся з проблемою, згаданою ОП. Жоден із кроків, пов’язаних з дозволом, не вирішив проблему.
мопсид


1

Провівши кілька досліджень щодо вирішення цієї проблеми в моїй системі Linux, я подумав, що напишу цю відповідь. Ось що я зробив, щоб виправити проблему.

На Fedora 22

Встановлення Docker:

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

Після встановлення Docker:

Користувача потрібно додати в групу докерів.

$> sudo usermod -aG docker

Демон докера потрібно запустити

$> sudo service docker start

Ви можете встановити демон, щоб він починався під час завантаження

$> sudo chkconfig docker on

Ви можете перевірити, чи працює служба докера

$> service docker status

І одна остання остаточна перевірка

$> docker run hello-world

+1 для повного прикладу, хоча багато з цих команд не застосовуються до моєї ситуації (установка з використанням pacman, використання systemctlзамість service+ chkconfig).
l0b0

1

Якщо ви використовуєте Fedora 23 або Redhat варіант, відредагуйте /etc/sysconfig/dockerта змініть наступне

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

Перезавантажте докер.

Переконайтесь, що ви додали цю групу до системи та додали себе до групи.



1

Якщо ви запустили свій докерний двигун із: запуску сервера docker для служби sudo

ви не можете підключитися до звичайного користувача, навіть якщо ви додали себе до групи "докер".

Ви можете просто зупинити це за допомогою: dodo service docker stop

і запустити його як звичайний користувач: запустити сервер докерів


Мені до цього часу не потрібно було додавати користувача docker group. sudo service startпрацював на мене. Однак спостерігатимуть, чи є щось нове.
stupidnetizen

0

У мене теж було таке ж питання. Проблема полягала в розетках, виділених докер-демону та докер-клієнту.

  1. По-перше, для docker-клієнта на docker.sock не встановлено дозвіл. Ви можете встановити його за допомогою sudo usermod -aG docker $USER

  2. Потім перевірте ваш bash файл, де працює докер-клієнт. Для мене він був встановлений на 0,0.0,0:2375, поки docker-демон демон працював на unix socket. (Він був встановлений у файлі конфігурації dockerd).

  3. Просто прокоментуйте рядок порушень, і це буде добре.

  4. Але якщо ви хочете змусити його працювати на порту TCP замість unix socket, то змініть файл конфігурації 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. Додайте себе до групи докерів

    usermod -aG docker $USER

  2. Виправте дозволи на докер-сокер і команду.

    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.