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

13

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

Да, они бегут. Я добавил себя в группу Docker и могу получить доступ к Docker по 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".

Я перезапустил службу Docker, несколько раз вышел из системы и вошел в нее, но все равно не могу подключиться к удаленному узлу. Я даже не могу подключиться к локальному узлу, передав 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, может кто-нибудь подтвердить ? Я думаю, что когда я запускаю «Service Docker Status», на самом деле происходит «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

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

Лорд лох
источник
1
Я подтверждаю, что это изменение заставляет Dockerd прослушивать HTTP-запросы в Ubuntu 16.04 с docker-ce ver 17.06. Просто кажется неправильным изменять скрипт сервиса напрямую.
chrisinmtown
7
Никогда не редактируйте сценарий службы Docker (или любой сценарий службы) напрямую. SystemD имеет встроенную функцию дифференциального редактирования. Use systemctl edit docker.serviceи systemctl создадут новый файл с вашими правками. Это предотвращает стирание ваших изменений обновлением. SystemD объединит два файла во время выполнения. Хороший документ здесь: digitalocean.com/community/tutorials/...
Routhinator
Благодарность! Это ужасно полезно. Я получаю предупреждение во время обновлений. Я посмотрю на это: _)
Лорд Ло.
4
На Ubuntu Server 18.04 это работало так:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA
когда я использую -H tcp://настройку самостоятельно, без -H fd://настройки я не могу выдавать и клиентские команды, например .., информация о докере, версия докера и т. д.
Chris F
2

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

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

Чтобы внести свои собственные изменения в файл модуля systemd, который сохраняется, вы можете создать файл модуля в /etc/systemd/system/docker.service.d/, например, вот мой стандартный файл /etc/systemd/system/docker.service. д / 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 с разрешенными учетными записями root без пароля. Если вы предпочитаете ssh, а не telnet, или если вы предпочитаете иметь пароль для своей учетной записи root, вы должны настроить TLS. Порты док-станции API часто сканируются в Интернете, и вы вскоре найдете вредоносное ПО, установленное на вашем хосте, если пропустите этот шаг настройки.

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

BMitch
источник
1
Очень хороший ответ, который переживет будущие обновления в докере. Это правильный способ сделать это.
Фопедуш
2

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

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

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

eadmaster
источник
удивительный! я могу выполнить эту команду в фоновом режиме? когда я закрываю терминал, соединение теряется
Феликс
ах я нашел nohupи&
Феликс
0

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

systemd vs daemon.json

Конфигурирование Docker для прослушивания соединений с использованием как системного файла systemd, так и файла daemon.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 dockerd
    tcp        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, так и файла daemon.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 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
РОЙ
источник