Ваш strace
вывод настоятельно предполагает, что клиент Docker не может общаться с демоном Docker, который по умолчанию создает сокет в /var/run/docker.sock
.
Предполагается, что Docker-демон является системной службой (в systemd, расположенной по адресу /lib/systemd/system/docker.service
с конфигурацией сокета в /lib/systemd/system/docker.socket
), но его можно запустить независимо, используя /usr/bin/docker daemon
любые дополнительные опции.
Вы должны демон, а не клиента .strace
Использование strace
на демоне Docker
Получите идентификатор процесса вашего демона Docker. Любая из этих команд будет хранить PID в переменной с именем
$DOCKER_PID
.Прямо из розетки:
DOCKER_PID=$(sudo lsof -Ua /var/run/docker.sock | awk '/^docker/ ' | head -1)
Systemd:
DOCKER_PID=$(systemctl show -p MainPID docker.service | awk -F'=' '')
Другой:
DOCKER_PID=$(ps aux | grep 'docker daemon' | grep -v 'grep' | awk '' | head -1)
Используйте
strace
на демоне Docker, теперь, когда у вас есть PID:sudo strace -vvvfts1000 -p $DOCKER_PID
В отдельном терминале выполните команду, которая обычно висит в клиенте Docker.
docker version
Посмотрите
strace
на демона Docker, чтобы увидеть, что происходит, начиная со слушающего конца сокета.
Интерпретация strace
вывода
Вот что демон должен делать при запуске docker version
:
Прочитайте, что отправил клиент:
[pid 14291] 12:34:36 <... read resumed> "GET /v1.22/version HTTP/1.1\r\nHost: \r\nUser-Agent: Docker-Client/1.10.3 (linux)\r\n\r\n", 4096) = 81
Соберите информацию о системе:
[pid 14291] 12:34:36 uname() = 0
Ответ клиенту с информацией о системе:
[pid 14291] 12:34:36 write(3, "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nServer: Docker/1.10.3 (linux)\r\nDate: Mon, 13 Jun 2016 17:34:36 GMT\r\nContent-Length: 194\r\n\r\n{\"Version\":\"1.10.3\",\"ApiVersion\":\"1.22\",\"GitCommit\":\"20f81dd\",\"GoVersion\":\"go1.6.1\",\"Os\":\"linux\",\"Arch\":\"amd64\",\"KernelVersion\":\"4.4.0-22-generic\",\"BuildTime\":\"Wed, 20 Apr 2016 14:19:16 -0700\"}\n", 334) = 334
Затем client (
docker version
) отображает информацию, которую вернул сервер:Server: Version: 1.10.3 API version: 1.22 Go version: go1.6.1 Git commit: 20f81dd Built: Wed, 20 Apr 2016 14:19:16 -0700 OS/Arch: linux/amd64
В вашей задаче ваш демон Docker, по-видимому, не выполнил шаг № 3, потому что если бы он это сделал, клиент увидел бы ответ, но клиент ничего не получил.
Вы должны быть в состоянии использовать эту информацию, чтобы выяснить, почему демон Docker не отвечает на запросы от клиента.
Возможные причины
Предоставленной вами информации недостаточно для точного определения причины неспособности вашего клиента Docker получить ответ от демона Docker, но вот несколько советов:
- Работает ли демон Docker?
- Что произойдет, если вы запустите демон Docker на переднем плане ?:
sudo docker daemon
- Демон Docker слушает сокет в
/var/run/docker.sock
?sudo lsof -p $DOCKER_PID
должен показать "/var/run/docker.sock type=STREAM
" там где-то. - Существуют ли политики безопасности, которые блокировали бы что-то в клиенте или демоне? В Linux SELinux и AppArmor могут вызвать путаницу, так как установленные для них политики могут запретить доступ.
- В
strace
демоне, если вы не получаете HTTP GET-запрос от клиента, это означает, что сервер ничего не получил из сокета. - Если вы это сделали
docker version
и увидели вstrace
демоне, чтоuname()
вызова не было, демон даже не попытался получить информацию о системе. - Если вы видите
write()
вызов вstrace
демоне, это означает, что демон ответил, но клиент его не увидел. - Возможно, это известная проблема в старой версии Docker, которую вы используете. Попробуйте обновить.