Как мне предоставить доступ к API docker через TCP?

Я использую portainer и не могу управлять удаленными конечными точками. Я попытался использовать командную строку для подключения к удаленным узлам docker, но получил сообщение Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

Да, они бегут. Я добавил себя в группу docker и могу получить доступ к docker, подключившись к узлам. Однако я не могу получить удаленный доступ к каким-либо узлам docker.

Я изменил /etc/default чтобы добавить / раскомментировать DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

Я также изменил /etc/init.d/docker и /etc/init/docker.conf включать DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

Я перезапустил службу docker, вышел из системы и вошел в систему несколько раз в процессе, но по-прежнему не могу подключиться к удаленному узлу. Я даже не могу подключиться к локальному узлу, передав IP-адрес.

Что я упустил? Какая конфигурация в каком файле предоставляет API через TCP?

user@hostname:~$ docker -H tcp://<REMOTE_IP>:2375 infoCannot connect to the Docker daemon at tcp://<REMOTE_IP>:2375. Is the docker daemon running?user@hostname:~$ docker -H tcp://127.0.0.1:2375 infoCannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?user@hostname:~$ docker -H tcp://<LOCAL_IP>:2375 infoCannot connect to the Docker daemon at tcp://<LOCAL_IP>:2375. Is the docker daemon running?user@hostname:~$

Редактировать:Бегущий ps aux | grep -i docker возвращает это -

root      3581  0.1  0.2 596800 41540 ?        Ssl  04:17   0:35 /usr/bin/dockerd -H fd://root      3588  0.0  0.0 653576 14492 ?        Ssl  04:17   0:18 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

Я нашел решение благодаря Сообщение Ивана Кризана.

Мне пришлось отредактировать /lib/systemd/system/docker.service в моей системе Ubuntu 16.04.2 LTS, чтобы изменить строку

ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:

затем

sudo systemctl daemon-reloadsudo systemctl restart docker.service

и все заработало :-). Следующий шаг - выяснить, как защитить форму демона docker от взлома.

Каталог /etc/default - это место, куда разработчики дистрибутива помещают свои конфигурационные файлы. Если вы устанавливаете docker непосредственно из репозиториев Docker, этот каталог использоваться не будет.

Каталог /lib / systemd - это место, где пакеты будут устанавливать свои файлы systemd, и они будут перезаписывать любые изменения там при обновлении. Если вы воспользуетесь этим, ваши изменения будут потеряны.

Чтобы внести свои собственные изменения в модульный файл systemd, который сохраняется, вы можете создать модульный файл в /etc/systemd/system/docker.service.d/, например, вот мой стандартный /etc/systemd/system/docker.service.d/override.conf:

[Service]ExecStart=ExecStart=/usr/bin/dockerd

Это переопределение просто сбрасывает все флаги командной строки для демона dockerd из systemd. После этого вы можете переопределить все настройки из /etc/docker/daemon.json, который используется docker и, в зависимости от настроек, может быть перезагружен без перезапуска демона. Например. вот пример /etc/docker/daemon.json:

{"debug": false,"experimental": true,"hosts": ["fd://", "tcp://0.0.0.0:2376"],"labels": ["foo=bar", "fez=baz"],"log-driver": "json-file","log-opts": {"max-size": "10m", "max-file": "3"},"storage-driver": "overlay2","tlscacert": "/etc/docker/certs/ca.pem","tlscert": "/etc/docker/certs/host-cert.pem","tlskey": "/etc/docker/certs/host-key.pem","tlsverify": true}

Для ваших целей вам нужна только строка, чтобы установить хосты.

Одной чрезвычайно важной частью приведенного выше конфигурационного файла являются настройки TLS. Если вы не настраиваете взаимный протокол TLS между клиентом и сервером и открываете docker для прослушивания в сети, вы используете эквивалент открытого сервера telnet с разрешенным корневым входом без пароля. Если вы предпочитаете ssh вместо telnet или предпочитаете иметь пароль для своей учетной записи root, вам необходимо настроить TLS. Порты docker API часто сканируются в Интернете, и вы вскоре обнаружите вредоносное ПО, установленное на вашем хосте, если вы когда-нибудь пропустите этот шаг настройки.

Полную информацию о том, как настроить ключи TLS для клиента и сервера, можно найти по адресу:https://docs.docker.com/engine/security/https/


Обратите внимание, что с docker версий 18.09 и выше на клиенте (как там, где вы запускаете свою команду, так и на удаленном узле) вы можете использовать ssh вместо настройки TLS. Это включает в себя использование DOCKER_HOST значение ssh://user@host. Например.

docker -H ssh://user@host container ls

Существует официальная документация, описывающая, как Настройте, где демон Docker прослушивает соединения.

systemd против daemon.json

Настройка Docker для прослушивания подключений с использованием как модульного файла systemd, так и демона.файл json вызывает конфликт, который препятствует запуску Docker.

Настройка удаленного доступа с помощью файла systemd unit

  1. Используйте команду sudo systemctl edit docker.service, чтобы открыть файл переопределения для docker.service в текстовом редакторе.

  2. Добавьте или измените следующие строки, заменив их своими собственными значениями.

    [Service]ExecStart=ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
  3. Сохраните файл.

  4. Перезагрузите конфигурацию systemctl.

    $ sudo systemctl daemon-reload
  5. Перезапустите Docker.

    $ sudo systemctl restart docker.service
  6. Проверьте, было ли выполнено изменение, просмотрев выходные данные netstat, чтобы подтвердить, что dockerd прослушивает настроенный порт.

    $ sudo netstat -lntp | grep dockerdtcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd

Настройка удаленного доступа с помощью daemon.json

  1. Установите массив hosts в /etc/docker/daemon.json для подключения к сокету UNIX и IP-адресу следующим образом:

    {"hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]}

    Настройка Docker для прослушивания подключений с использованием как модульного файла systemd, так и демона.файл json вызывает конфликт, который препятствует запуску Docker.

    1. Добавьте или измените следующие строки, заменив их своими собственными значениями.

      [Service]ExecStart=ExecStart=/usr/bin/dockerd
    2. Сохраните файл.

    3. Перезагрузите конфигурацию systemctl.

      $ sudo systemctl daemon-reload
  2. Перезапустите Docker.

  3. Проверьте, было ли выполнено изменение, просмотрев выходные данные netstat, чтобы подтвердить, что dockerd прослушивает настроенный порт.

    $ sudo netstat -lntp | grep dockerdtcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd

Клиент Docker будет соблюдать DOCKER_HOST переменная среды для установки -H флаг для клиента. Используйте одну из следующих команд:

$ docker -H tcp://127.0.0.1:2375 ps

или

$ export DOCKER_HOST="tcp://127.0.0.1:2375"$ docker ps

Если вы не хотите перенастраивать и перезапускать свой демон docker, вы можете просто соединить сокет unix с сокетом TCP, используя ncat (из nmap посылка):

ncat -lknvp 2375 -c "ncat -U /var/run/docker.sock"

В качестве альтернативы вы можете использовать socat или другие инструменты.

Для тех, кто ищет этот ответ в контексте Ubuntu server 20.04, который использует щелкать:

Этот комментарий проблема github это должно дать вам необходимый контекст. В моем случае я не нашел заданную переменную окружения $SNAP_DATA, поэтому мне пришлось искать весь демон.файлы json в системе и использовал тот, который имеет /var префикс

$ sudo find / -name daemon.json

В моем случае в нем было две несвязанные записи, поэтому я просто добавил свою:

{  [.....]  "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]}

Указанный выше IP-адрес определяет, откуда он будет доступен, и порт может быть любым портом, который вы хотите предоставить. В моем конкретном случае я не смог заставить его работать с определенным IP-адресом, вместо этого мне пришлось использовать 0.0.0.0, иначе при перезапуске произошел бы сбой со следующей ошибкой:

aufs aufs_fill_super:918:mount[3724]: no argoverlayfs: missing 'lowerdir'aufs aufs_fill_super:918:mount[3772]: no argoverlayfs: missing 'lowerdir'aufs aufs_fill_super:918:mount[3820]: no argoverlayfs: missing 'lowerdir'

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

Я пробовал подобные вещи и подозреваю, что файлы /etc /default /docker, /etc /init/docker.conf и /etc /init.d /docker просто игнорируются в Ubuntu 16.04 с установкой docker-ce, кто-нибудь может подтвердить? Я думаю, что когда я запускаю “service docker status”, на самом деле происходит “systemctl status docker”, совершенно другая система управления.

2375 слушает? ss -ntl

Нет. На 2375 ничего не прослушивается. И я не могу понять, какая конфигурация в каком файле влияет на это. Я включил вывод ps aux в свой ответ, если это поможет.