Статьи

Добавление существующего хоста Docker к Docker Machine: несколько советов

Краткое введение в Docker Machine

После перехода с boot2docker (устарел) на Docker Machine (или лучше сказать Docker Toolbox для Mac) на моем ноутбуке и после игры с Google Cloud Engine через Docker Machine мне было любопытно посмотреть, смогу ли я управлять всем своим Docker. хосты, работающие на VPS или выделенных серверах, с Docker Machine.

Docker Machine — это удобный инструмент для выбора демона Docker, который вы хотите использовать: это может быть демон Docker, работающий в виртуальной машине Virtual Box, или демон Docker, работающий на EC2, GCE, Digital Ocean и т. Д., Или демон Docker, работающий на окно Linux (вопрос только в том, какой драйвер используется)

Драйвер virtualbox позволяет вам создать новую виртуальную машину в Virtual Box, запустить ее и настроить tcp-ссылку client / daemon с tls (по умолчанию через порт 2376); облачные драйверы, такие как google, позволяют вам делать то же самое, но в «облаке», тогда как универсальный драйвер не создает новый хост, а использует ssh для настройки tcp-ссылки client / daemon с tls на существующем хосте.

После настройки «docker-machine ls» предоставляет список демонов Docker, с которыми можно взаимодействовать:

1
2
3
4
5
$ docker-machine ls
NAME               ACTIVE   DRIVER       STATE     URL                           SWARM
my.host.com                 generic      Running   tcp://my.host.com:2376
default                     virtualbox   Running   tcp://192.168.99.104:2376
docker-vm          *        virtualbox   Running   tcp://192.168.99.102:2376

Чтобы пообщаться с демоном my.host.com, просто введите следующую команду:

1
$ eval "$(docker-machine env my.host.com)"

и теперь вы разговариваете со своим демоном my.host.com:

1
2
3
$ docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                          NAMES
77aa96cf6db9        flexget                "/usr/local/bin/flexg"   46 hours ago        Up 21 hours

Удобно, не так ли?

Интеграция всех моих докерских хостов (демонов) с докер-машиной на моем ноутбуке даст следующие преимущества:

  • Больше не нужно ssh для моих (удаленных) ящиков Docker
  • Вся моя работа с образами докеров (Dockerfiles) могла остаться на моем ноутбуке, я мог запускать новые контейнеры из локальных Dockerfiles на своих удаленных хостах, не покидая моего ноутбука

Docker Machine: универсальный драйвер

Чтобы интегрировать хосты, к которым вы получаете доступ через ssh, например my.host.com, в список демонов Docker Machine, вам нужно использовать универсальный драйвер. (этот драйвер позаботится о настройке вашего удаленного демона для прослушивания через порт 2376 и генерации и распространения необходимых ключей для tls)

Начиная с Docker Machine 0.4.2 с Docker 1.8.2, вам необходимо соблюдать некоторые ограничения для интеграции вашего хоста с поддержкой ssh; вот список (полученный трудным путем….):

  • убедитесь, что вы можете подключиться со своего ноутбука к удаленному хосту Docker, используя аутентификацию с открытым ключом (это означает, что вы сгенерировали открытый ключ на своем ноутбуке и добавили в список авторизованных ключей на удаленном хосте: ssh-keygen, ssh-copy- id поможет в этом)
  • Если вы используете «sudo» на хосте, убедитесь, что вы сконфигурировали sudo без пароля:
1
2
# visudo
%sudo   ALL=(ALL) NOPASSWD:ALL

если вы этого не сделаете, ну, если этот вопрос не закрыт , это не сработает

  • убедитесь, что версия демона Docker на сервере совпадает с версией клиента Docker на ноутбуке
  • откройте порт 2376 («ufw allow 2376» в Debian / Ubuntu) на вашем удаленном хосте: ваш Docker-клиент ноутбука подключится через TCP к порту 2376 для связи с удаленными демонами

После этих проверок я предлагаю вам сейчас добавить удаленный демон Docker (запущенный на my.host.com) на Docker Machine:

1
2
3
4
$ docker-machine create --driver generic \
 --generic-ip-address my.host.com \
 --generic-ssh-user anthony \
 my.host.com

Это не работает ? хорошо, я рассказал вам следующую главу!

Общие проблемы с драйвером докера

В Mac OS X он постоянно спрашивает меня о моей секретной ключевой фразе

Ну, это не так уж плохо, но все же есть обходной путь, описанный здесь

sudo: tty отсутствует и не задана программа askpass

1
2
3
4
5
6
SSH cmd error!
command: sudo hostname my.host.com && echo "my.host.com" | sudo tee /etc/hostname
err    : exit status 1
output : Saving password to keychain failed
Identity added: /Users/anthony/.docker/machine/machines/my.host.com/id_rsa (/Users/anthony/.docker/machine/machines/my.host.com/id_rsa)
sudo: no tty present and no askpass program specified

Убедитесь, что у вашего удаленного пользователя сконфигурировано sudo без пароля, как описано в предыдущей главе:

1
2
     
%sudo   ALL=(ALL) NOPASSWD:ALL

докер-машина будет ждать вечно

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

1
sudo tail -f /var/log/syslog

и проверьте, нет ли строк, похожих на эту:

1
Oct  7 01:26:54 my.host kernel: [1859460.411738] [UFW BLOCK] IN=eth0 OUT= MAC=XX:XX SRC=199.99.99.99 DST=92.12.12.12 LEN=64 TOS=0x00 PREC=0x00 TTL=52 ID=37574 DF PROTO=TCP SPT=49855 DPT=2376 WINDOW=65535 RES=0x00 SYN URGP=0

Хум, UFW BLOCK и 2376 на одной линии? Похоже, вам нужно обновить конфигурацию брандмауэра:

1
$ sudo ufw allow 2376

Тройная проверка версий докера на вашем ноутбуке и на удаленном хосте выровнены

Не удалось загрузить ключ хоста: / etc / ssh / ssh_host_ecdsa_key

Если у вас возникли проблемы, вы можете заглянуть в журнал SSH

1
sudo tail -f /var/log/auth.log

и, возможно, вы видели эти 2 строки:

1
2
Oct  7 01:04:41 host sshd[29920]: error: Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Oct  7 01:04:41 host sshd[29920]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key

Вам просто нужно сгенерировать эти ключи на удаленном хосте:

1
$ sudo ssh-keygen -A

и они будут генерироваться

1
ssh-keygen: generating new host keys: ECDSA ED25519

Не удалось выполнить операцию: файл существует

1
2
3
4
5
6
7
SSH cmd error!
command: sudo systemctl enable docker
err    : exit status 1
output : Synchronizing state for docker.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d docker defaults
Executing /usr/sbin/update-rc.d docker enable
Failed to execute operation: File exists

Очевидно, это специфическая проблема Debian 8 , но есть и хорошие новости: она не помешала добавить ваш удаленный хост в Docker Machine

Незначительные предупреждения

1
2
3
Importing SSH key...
Warning: got an invalid line error parsing /etc/os-release: %sExpected Saving password to keychain failed to split by '=' char into two strings, instead got 1 strings
Warning: got an invalid line error parsing /etc/os-release: %sExpected Identity added: /Users/anthony/.docker/machine/machines/my.host.com/id_rsa (/Users/anthony/.docker/machine/machines/my.host.com/id_rsa) to split by '=' char into two strings, instead got 1 strings

Вы можете спокойно игнорировать эти предупреждения

Победа!

1
2
3
$ docker-machine ls
NAME               ACTIVE   DRIVER       STATE     URL                           SWARM
my.host.com      *      generic      Running   tcp://my.host.com:2376

Теперь вы можете наслаждаться докером, работающим на вашем удаленном хосте с вашего ноутбука!