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


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.