Краткое введение в 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 |
Теперь вы можете наслаждаться докером, работающим на вашем удаленном хосте с вашего ноутбука!