Як відкрити API докера через TCP?


13

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

Так, вони бігають. Я додав себе до групи докерів і можу отримати доступ до докера через SSHing у вузли. Однак я не можу отримати доступ до будь-яких докерних вузлів віддалено.

Я змінив, /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".

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

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

user@hostname:~$ docker -H tcp://<REMOTE_IP>:2375 info
Cannot 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 info
Cannot 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 info
Cannot 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

2375 слухає? ss -ntl
jscott

Ні. 2375 нічого не слухають. І я не можу зрозуміти, яка конфігурація у файлі впливає на це. Я включив результат ps auxсвоєї відповіді, якщо це допомагає.
Лорд Лох.

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

Відповіді:


22

Я знайшов рішення завдяки посту Івана Кризана .

Мені довелося редагувати /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-reload
sudo systemctl restart docker.service

і все спрацювало :-). Наступний крок - з’ясувати, як захистити форму захоплення демон-докера.


1
Я підтверджую, що ця зміна змушує Dockerd слухати HTTP-запити на Ubuntu 16.04 з docker-ce ver 17.06. Просто невірно безпосередньо змінювати скрипт служби.
chrisinmtown

7
Ніколи не редагуйте скрипт служби докера (або будь-який сценарій обслуговування) безпосередньо. У SystemD є вбудована функція диференціального редагування. Використання systemctl edit docker.serviceта systemctl створить новий файл із вашими правками. Це запобігає витирання змін оновленням. SystemD об'єднає два файли під час виконання. Хороший документ тут: digitalocean.com/community/tutorials/…
Routhinator

Спасибі! Це страшенно корисно. Я постійно отримую попередження під час оновлень. Я розгляну це: _)
Лорд Лох.

4
На сервері Ubuntu 18.04 він працював так:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA

коли я використовую -H tcp://налаштування самостійно, без цього -H fd://налаштування я не можу видавати і клієнтські команди, наприклад .., інформація про докер, версія
Chris F,

2

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

Каталог / lib / systemd - це те, де пакунки встановлюватимуть свої системні файли, і вони замінять будь-які зміни там при оновленні. Якщо ви користуєтесь цим, ваші зміни будуть втрачені.

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

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

Це перевизначення просто знімає всі прапори командного рядка до демон-докера від systemd. Після цього ви можете змінити всі налаштування з /etc/docker/daemon.json, які використовується докер, і залежно від налаштування, можна перезавантажити, не перезавантажуючи демон. Наприклад, ось приклад /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 між клієнтом і сервером, а ви відкриваєте докер для прослуховування в мережі, ви запускаєте еквівалент відкритого сервера telnet з кореневими логінами, дозволеними без пароля. Якщо ви віддаєте перевагу ssh через telnet, або якщо ви хочете мати пароль для свого кореневого облікового запису, ви повинні налаштувати TLS. Порти API докера часто скануються в Інтернеті, і ви знайдете зловмисне програмне забезпечення, встановлене на вашому хості, за короткий час, якщо ви пропустите цей крок налаштування.

Повні відомості про налаштування ключів TLS для клієнта та сервера можна знайти за посиланням: https://docs.docker.com/engine/security/https/


1
Дуже хороша відповідь, яка переживе майбутні оновлення служби докер. Це правильний спосіб зробити це.
Фопедуш

2

Якщо ви не хочете перенастроювати і перезапускати демон-докер, ви можете просто перенести unix-сокет на TCP-сокет за допомогою ncatnmapпакета):

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

В якості альтернативи можна використовувати socat або інші інструменти .


дивовижний! чи можу я виконувати цю команду у фоновому режимі? коли я закриваю термінальний зв’язок, втрачено
Фелікс

ах я знайшов nohupі&
Фелікс

0

Існує офіційна документація, в якій описано, як налаштувати, де демон Докера слухає з'єднання .

systemd vs daemon.json

Настроювання Docker для прослуховування з'єднань, використовуючи як файл системного блоку, так і файл daemon.json, викликає конфлікт, який заважає запуску Docker.

Налаштування віддаленого доступу з файлом системного блоку

  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. Перезавантажте Докер.

    $ sudo systemctl restart docker.service
    
  6. Перевірте, чи було проведено зміну, переглянувши висновок netstat, щоб переконатися, що докерд прослуховується на налаштованому порту.

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

Налаштування віддаленого доступу за допомогою daemon.json

  1. Встановіть масив хостів у /etc/docker/daemon.json для підключення до сокета UNIX та IP-адреси таким чином:

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

    Настроювання Docker для прослуховування з'єднань, використовуючи як файл системного блоку, так і файл daemon.json, викликає конфлікт, який заважає запуску Docker.

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

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. Збережіть файл.

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

      $ sudo systemctl daemon-reload
      
  2. Перезавантажте Докер.

  3. Перевірте, чи було проведено зміну, переглянувши висновок netstat, щоб переконатися, що докерд прослуховується на налаштованому порту.

    $ sudo netstat -lntp | grep dockerd
    tcp        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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.