Пытаюсь ли я подключиться к демону с поддержкой TLS без TLS?


221

Я пытаюсь узнать о Docker , но продолжаю получать загадочные (для меня) сообщения об ошибках.

Возможно, самый простой пример этого - попытаться напечатать версию установленного Docker:

$ sudo docker version
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): darwin/amd64
FATA[0000] Get http:///var/run/docker.sock/v1.16/version:
    dial unix /var/run/docker.sock: no such file or directory.
    Are you trying to connect to a TLS-enabled daemon without TLS?

Я только что прочитал руководство пользователя и точно следовал каждому шагу, поэтому я удивлен, что получил это сообщение ... Что мне теперь делать?

Я только заметил, что если я не использую, sudoя не получаю ошибку:

$ docker version
Client version: 1.4.1
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): 5bc2ff8
OS/Arch (client): darwin/amd64
Server version: 1.4.1
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): 5bc2ff8

Конечно, это не решение, так как мне может понадобиться sudoгде-нибудь в будущем ...

Я только что нашел другую страницу с надписью « Если вы используете OS X, то вы не должны использовать sudo». Я не знаю, имеют ли они в виду только этот пример или вообще.


38
Глупый вопрос, но вы уже запустили Docker-демон?
Усман Исмаил

Я следовал руководству пользователя, так что да, я считаю, что демон docker запущен. Как я могу проверить дважды?
Шон

5
На самом деле вы нашли решение. С boot2docker вам никогда не понадобится sudo, а с linux вам всегда понадобится sudo. Это потому, что boot2docker фактически выполняет эти команды в виртуальном окне, которое настроено для правильного доступа к демону.
Усман Исмаил

1
Я боролся с этой проблемой, и работа без sudo работала на меня
sak

6
Почти все ответы специфичны для OS X (они упоминают boot2docker), хотя OS X явно не упоминается в вопросе или тегах. Если кого-то интересует общий ответ, см. Мой ответ.
Петр Доброгост

Ответы:


150

Для меня бег $(boot2docker shellinit 2> /dev/null)исправил проблему.

Это запускает вывод boot2docker shellinitкоманды (три set -x ...строки) в текущем терминальном сеансе, что позволяет dockerкоманде узнать, где найти виртуальную машину boot2docker.

Добавление $(boot2docker shellinit 2> /dev/null)в конец вашего ~/.bash_profileфайла будет гарантировать, что dockerкоманда настроена, каждый раз, когда вы открываете свой терминал.


Для людей , использующих моллюск: boot2docker shellinit ^ /dev/null | source.


Обратите внимание, что 2> /dev/null(и эквивалент рыбы ^ /dev/null) не являются обязательными. Как предложил @ pablo-fernandez, это скрывает Writing ..черты.


Я уже сделал это, но я добавлю его в .bash_profile, хорошая идея
Шон

определенно помогает с boot2docker 1.5, но более старый boot2docker 1.2 сделал это неправильно
Макс Марков

1
Я добавил перенаправление stderr, чтобы операторы «Writing ...» не появлялись: $ (boot2docker shellinit 2> / dev / null)
Пабло Фернандес

3
Спасибо, чтобы упомянуть рыбные раковины! Решил проблему для меня.
Cyrillk

1
Как упомянуто в ответе Сальвадора Дали ниже, убедитесь, что вы также запускаете boot2docker startперед запуском init init.
Кевин

78

Я получал ту же ошибку на MacOS с sudo и без него.

Я решил это с:

boot2docker start
$(boot2docker shellinit)

PS: спасибо Алану. Я узнал, что этот подход рекомендуется в их официальной документации .

PS2: иногда boot2docker initможет потребоваться перед запуском двух команд (спасибо Аарон).


Это сработало, но я не понимаю, почему? что делает $ (shell2itcker shellinit)?
Эмиль

Это работало в Mac OS X, но у меня тот же вопрос, что и у Эмиля, т.е. почему это работает?
Nissan

Это не сработало для меня на Mac OSX 10.10.4 с Docker Tools.
b01

Мне нужно было не только запустить boot2docker shellinit, но и скопировать и запустить каждую отображаемую команду. Официальная документация по ссылке гласит, что эта команда отображает только необходимый набор команд
Виталий Лебедев

У меня тоже работал на машине с windows.
Нушад

55

В моем случае (Linux Mint 17) я делал разные вещи, и я не уверен, какие из них абсолютно необходимы.

Я добавил недостающие пакеты Ubuntu:

$ sudo apt-get install apparmor lxc cgroup-lite

Пользователь был добавлен в группу docker:

$ sudo usermod -aG docker ${USER}

Запущен демон (openSUSE просто нуждается в этом)

$ sudo docker -d

Спасибо \ Attribution


Спасибо Усману Исмаилу , потому что, возможно, это была последняя вещь ...

Глупый вопрос, но вы уже запустили Docker-демон? - Усман Исмаил 17 декабря '14 в 15:04


Спасибо также github @ MichaelJCole за решение, которое сработало для меня, потому что я не проверял демона, когда читал комментарий Усмана.

GitHub комментарий :

sudo apt-get install apparmor lxc cgroup-lite
sudo apt-get  install docker.io
# If you installed docker.io first, you'll have to start it manually
sudo docker -d
sudo docker run -i -t ubuntu /bin/bash

Спасибо посту fredjean.net за то, что он заметил недостающие пакеты и забыл о стандартных инструкциях по установке Ubuntu, а Google о других способах.

Оказывается, пакеты cgroup-lite и lxc по умолчанию не установлены в Linux Mint. Установка обоих позволила мне запустить bash в базовом образе, а затем собрать и запустить мой образ.


Благодаря комментарию brettof86 об openSUSE


2
Спасибо! В моем случае (Монетный двор 17.1) это был пропавший аппарат.
Александр Л Теллес

2
Добавление себя в группу Docker помогло мне sudo adduser $USER docker. Трюк, чтобы заставить его вступить в силу на текущей оболочке, был curgroup=$(id -gn) && newgrp docker && newgrp $curgroupадаптирован с superuser.com/questions/272061/…
Теро Тилус

1
Я предполагаю, что тот факт, что это имеет гораздо более низкий балл, объясняется тем, что больше людей используют OS X, чем Linux? Я использую Ubuntu 14.04, и он работает для меня.
ледяной воды

1
openSUSE и мне нужно было только запустить демона
blockloop

Извините за мое незнание о докер-машине, но я не знаю. Но если вы узнаете, пожалуйста, укажите это здесь в комментариях или редактировании ответа. : D
ElMesa

49

Подчеркивающая проблема проста - отсутствие разрешения на /var/run/docker.sockunix доменный сокет.

Из главы о параметрах сокета Daemon в справочнике по командной строке Docker для Docker 1.6.0:

По умолчанию создается сокет домена unix (или сокет IPC) /var/run/docker.sock, для которого требуется либо разрешение root, либо членство в группе Docker .

Шаги, необходимые для предоставления прав пользователям, хорошо описаны в инструкциях по установке Docker для Fedora :

Предоставление прав пользователям на использование Docker

Инструмент командной строки docker связывается с процессом демона docker через файл сокета, /var/run/docker.sockпринадлежащий root:root. Хотя рекомендуется использовать sudo для команд докера, если пользователи хотят избежать этого, администратор может создать группу докеров, создать ее /var/run/docker.sockи добавить пользователей в эту группу.

$ sudo groupadd docker
$ sudo chown root:docker /var/run/docker.sock
$ sudo usermod -a -G docker $USERNAME

Выйдите и войдите в систему, чтобы изменения вступили в силу. Обратите внимание, что пакеты Docker некоторых дистрибутивов Linux (Ubuntu) уже размещены /var/run/docker.sockв dockerгруппе, поэтому первые два из вышеперечисленных шагов не нужны.

В случае с OS X boot2dockerситуация иная; демон Docker работает внутри виртуальной машины, поэтому DOCKER_HOSTдля этой виртуальной машины должна быть задана переменная среды, чтобы клиент Docker мог найти демон Docker. Это делается путем запуска $(boot2docker shellinit)в оболочке.


1
Хм, моя ситуация похожа, но немного отличается. Я работаю на Ubuntu 14.04. Docker, казалось бы, установлен правильно (при вводе просто «docker» появляется список команд). Я создал группу Docker и сделал из нее моего пользователя. Это просто домашняя система, и я просто играю с докером. Однако все, кроме «докера», вызывает ошибку. Я верю в это, потому что докер не может создать /var/run/docker.sock. В моей системе / var / run есть символическая ссылка на / run, которая является root: root и 755 perm, поэтому docker не может писать туда. Не уверен, каким будет мое решение.
Стив Коэн

Петр, это объяснение очень полезно. Не могли бы вы пояснить, почему «$ (boot2docker shellinit)» работает, а обычная «boot2docker shellinit» - нет? Я понимаю, что скобки подразумевают выполнение в подоболочке, но я не смог понять, почему это необходимо для правильной работы докера, когда ни одна из других команд не требует этого ...
Алекс Эдельштейн,

@AlexEdelstein Разница между boot2docker shellinitдругими командами заключается в том, что эта команда сама по себе не вносит никаких изменений, а только генерирует (печатает) команды, которые необходимо выполнить самостоятельно. Вы можете запустить boot2docker shellinitсначала, а затем вручную скопировать и запустить каждую команду из ее вывода. Все команды легче выполнять, выполняя boot2docker shellinitподпроцесс (с $()синтаксисом), потому что таким образом каждая строка вывода автоматически запускается как команда оболочки. См. Docs.docker.com/installation/mac/#from-your-command-line, где это показано подробно.
Петр Доброгост

@SteveCohen Возможно, вы захотите убедиться, что служба Docker работает с sudo service docker status. На моем Ubuntu 14.04 он не работал после установки, что вызвало ошибку.
razz0

1
Спасибо за ссылку на актуальную документацию по основной причине, решил мою проблему
RonaldFindling

23

Убедитесь, что демон Docker работает:

service docker start

Это исправило это для меня!


sudo service docker startдля меня
Milimetric

systemctl enable docker.serviceи systemctl start docker.service для пользователей system.d linux (Arch в моем случае)
PRDeving

sudo service docker restartдля меня
Frozen Flame

15
  1. Docker называет себя автономной средой выполнения для контейнеров Linux. Проще говоря, он действует как сервер и клиент.
  2. $ docker versionЗапрос команды является внутренним для исполняемого файла Docker и не работающий демон / службы.
  3. $ docker images or $ docker ps or $ docker pull centos являются командами, которые отправляют запросы работающему демону / службе docker.
  4. Docker по умолчанию поддерживает соединения TLS со своим демоном / службой.
  5. Только если пользователь, в который вы вошли как пользователь, является частью группы пользователей dockerили вы использовали sudoдо команды, например $ sudo docker images, это не требует подключения TLS.

Посетите страницу документации Docker. Защитите сокет демона Docker .

Прокрутите немного к вершине и найдите warning sectionдля ясности.


1
Популярные ответы пока применимы только к OS X, тогда как этот гораздо более общий, объясняет причину и позволяет мне решить ее на GNU / Linux.
sinisterstuf

1
@laffuste ваша команда будет УТИЛИТЬ ДОПОЛНИТЕЛЬНЫЕ ГРУППЫ ПОЛЬЗОВАТЕЛЯ. из-за пропавшего «-а»
Павел Барчик

3
@PawelBarcik ужасная ошибка, спасибо:sudo usermod -a -G docker {username}
laffuste

1
Как этот ответ отвечает на вопрос? В чем причина ошибки? Как это исправить? (Я не на OS X, поэтому существующие ответы не применяются).
Петр Доброгост

13

Вам нужно будет сделать:

$boot2docker init
$boot2docker start

Следующие настройки устранили проблему:

$export DOCKER_HOST=tcp://192.168.59.103:2376
$export DOCKER_CERT_PATH=/Users/{profileName}/.boot2docker/certs/boot2docker-vm
$export DOCKER_TLS_VERIFY=1

1
Эту команду также можно использовать для установки переменных среды (вместо того, чтобы делать это вручную):eval "$(boot2docker shellinit)"
Powers

11

Возможно, у вас еще нет прав доступа к файлу. Это случилось со мной после того, как я добавил себя в dockerгруппу, используя

sudo gpasswd -a user docker

но еще не выход.

Чтобы решить эту проблему, вы можете либо повторно войти в систему, либо использовать sg docker "docker <subcommand> ..."перед выходом из системы.

Если вы в группе docker дюйма /etc/group, вы должны быть в состоянии запустить его без ввода пароля.

https://dingyichen.wordpress.com/2015/02/05/docker-dial-unix-varrundocker-sock-no-such-file-or-directory-are-you-trying-to-connect-to-a- TLS с поддержкой-демон-без ДУС /


7

В Ubuntu после установки lxc-docker вам нужно добавить своего пользователя в группу пользователей docker :

sudo usermod -a -G docker myusername

Это из-за прав доступа к файлу сокета:

srw-rw---- 1 root docker 0 Mar 20 07:43 /var/run/docker.sock

НЕ ЗАПУСКАЙТЕ usermod БЕЗ «-a», как предложено в одном из других комментариев, иначе он сотрет настройку дополнительных групп и просто покинет группу «docker»

Вот что произойдет:

➜  ~  id pawel
uid=1000(pawel) gid=1000(pawel) groups=1000(pawel),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare),998(docker)
➜  ~  usermod -G docker pawel
➜  ~  id pawel               
uid=1000(pawel) gid=1000(pawel) groups=1000(pawel),998(docker)

6

TLDR : Это заставило мою группу разработчиков Python преодолеть эту проблему, когда я руководил клиникой по установке докера, и большинство пользователей работали на OS X:

boot2docker init
boot2docker up

запустите exportкоманды, которые выдает результат, затем

docker info

должен сказать вам, что это работает.


Контекст (что привело нас к проблеме)

Я руководил клиникой по установке докера, и у большинства участников была OS X, и мы столкнулись с этой проблемой, и я преодолел ее на нескольких машинах. Вот шаги, которым мы следовали:

Сначала мы установили homebrew (да, у некоторых посетителей его не было):

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Затем мы получили cask, который мы использовали для установки virtualbox, а затем использовали brew для установки docker и boot2docker (все это требуется для OS X). Не используйте sudo для brew. :

brew install caskroom/cask/brew-cask
brew cask install virtualbox
brew install docker
brew install boot2docker

Решение

Это было, когда мы столкнулись с проблемой, которую задал задающий вопрос. Следующее исправило это. Я понимаю, что это initбыла разовая сделка, но вам, вероятно, придется запускаться upкаждый раз, когда вы запускаете Docker:

boot2docker init
boot2docker up

Затем, когда upбыл запущен, он дает несколько exportкоманд. Скопируйте и вставьте их.

Наконец docker infoдолжен сказать вам, что он правильно установлен.

Демо

Остальные команды должны продемонстрировать это. (в Ubuntu Linux мне потребовалось sudo.)

docker run hello-world
docker run -it ubuntu bash

Тогда вы должны находиться на корневой оболочке в контейнере:

apt-get install nano
exit

Вернемся к вашему нативному пользователю bash:

docker ps -l

Найдите примерно 12-значный шестнадцатеричный (0-9 или af) идентификатор в поле «Идентификатор контейнера», например 456789abcdef. Затем вы можете зафиксировать свое изменение и дать ему какое-нибудь описательное имя, например descriptivename:

docker commit 456789abcdef descriptivename`

5

Все, что вам нужно для запуска Docker в Linux Ubuntu / Mint:

sudo apt-get -y install lxc
sudo gpasswd -a ${USER} docker
newgrp docker
sudo service docker restart

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

sudo apt-get -y install apparmor cgroup-lite
sudo service docker restart

1
Я бы дал себе +1, если бы это было возможно - я искал решение и нашел свое собственное решение, о котором я забыл :)
tomrozb

Это помогло мне. Я понял, что служба Docker не работает после установки, поэтому sudo service docker startрешил эту проблему на моем Ubuntu 14.04.
razz0

3

Я попробовал решения здесь, и boot2docker не работал.

Мое решение: удалить boot2docker на Mac, установить виртуальную машину Centos 7 в VirtualBox и работать с Docker внутри этой виртуальной машины.


3

Для меня сработали следующие шаги:

  1. Я заметил, что запуск docker run hello-worldзавершился неудачно с этой ошибкой, как в вопросе, но запуск sudo docker run hello-worldработал.
  2. Я добавил своего текущего пользователя в dockerгруппу sudo adduser user docker. Затем вы должны перезагрузить компьютер или использовать его su - user(проверьте, используя groupsкоманду, если находитесь в dockerгруппе).

После этого hello-worldначал работать.

Мой ответ основан на том, как я могу использовать докер без sudo? что объясняет, что пошло не так.



После добавления себя в группу, сделайте `newgrp docker; newgrp primary-group создает подчиненную оболочку с новой первичной группой docker, а затем заново устанавливает правильную первичную группу. (Немного взломать).
Ctrl-Alt-Delor

2

Для чего бы это ни стоило, я попробовал все решения в этом и в этом смежном вопросе, и никто не решил мою проблему, пока я не удалил и не переустановил VirtualBox . Этот процесс обновил VirtualBox с версии 4.2.16 до 4.3.22 (мой предыдущий лежал в системе неиспользованным в течение нескольких месяцев).

Тогда boot2dockerи dockerработал без каких-либо других настроек.



2

Демон Docker связывается с сокетом Unix вместо порта TCP. По умолчанию этот сокет Unix принадлежит пользователю root, и другие пользователи могут получить к нему доступ только через sudo. Демон Docker всегда запускается от имени пользователя root.

sudo groupadd docker
sudo usermod -aG docker $USER

Выйдите из системы и снова войдите в нее, чтобы вновь оценить членство в группе.

docker run hello-world

Источник: Управление Docker от имени пользователя без полномочий root


1

У меня была та же проблема, и я пытался ее исправить, внося поправки в файл .bash_profile, входя и выходя без всякой удачи. В итоге перезапуск моей машины исправил.



0

Я столкнулся с той же проблемой, когда создавал образы Docker из Jenkins. Просто добавьте пользователя в dockerгруппу, а затем перезапустите сервисы Docker, и в моем случае мне пришлось перезапустить сервисы Jenkins.

Это была ошибка, которую я получил:

http:///var/run/docker.sock/v1.19/build?cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&memory=0&memswap=0&rm=1&t=59aec062a8dd8b579ee1b61b299e1d9d340a1340: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
FATAL: Failed to build docker image from project Dockerfile
java.lang.RuntimeException: Failed to build docker image from project Dockerfile

Solution:

[root@Jenkins ssh]# groupadd docker
[root@Jenkins ssh]# gpasswd -a jenkins docker
Adding user jenkins to group docker
[root@Jenkins ssh]# /etc/init.d/docker restart
Stopping docker:                                           [  OK  ]
Starting docker:                                           [  OK  ]
[root@Jenkins ssh]# /etc/init.d/jenkins restart
Shutting down Jenkins                                      [  OK  ]
Starting Jenkins                                           [  OK  ]
[root@Jenkins ssh]#

-1

Другая возможная причина заключается в том, что визуализация ЦП вашего BIOS не включена. Иди и включи его первым!

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