Вступление
Docker Machine - это инструмент, который позволяет легко предоставлять и управлять несколькими хостами Docker удаленно с вашего персонального компьютера. Такие серверы обычно называют Dockerized-хостами и, разумеется, могут использоваться для запуска контейнеров Docker.
Хотя Docker Machine можно установить в локальной или удаленной системе, наиболее распространенным подходом является его установка на локальном компьютере (собственной установке или виртуальной машине) и использование его для подготовки удаленных серверов Dockerized.
Хотя Docker Machine можно установить в большинстве дистрибутивов Linux, а также в Mac OS X и Windows, в этом руководстве мы установим его на локальный компьютер с Ubuntu 16.04 и будем использовать его для предоставления Dockerized DigitalOcean Droplets.
Предпосылки
Чтобы следовать этому уроку, вам понадобится следующее:
-
Локальный компьютер под управлением Ubuntu 16.04 с установленным Docker (инструкции см. ВHow To Install and Use Docker on Ubuntu 16.04)
-
Токен API DigitalOcean. Если у вас его нет, сгенерируйте его с помощьюthis guide. Когда вы генерируете токен, убедитесь, что он имеет область чтения-записи. Это значение по умолчанию, поэтому, если вы не измените какой-либо параметр при его создании, он будет иметь возможности чтения-записи. Чтобы упростить использование в командной строке, обязательно назначьте токен переменной, как указано в этой статье.
[[step-1 -—- install-docker-machine-on-your-local-computer]] == Шаг 1. Установка Docker Machine на локальный компьютер
На этом этапе мы проработаем процесс установки Docker Machine на локальный компьютер под управлением Ubuntu 16.04.
Чтобы загрузить и установить двоичный файл Docker Machine, введите:
wget https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-$(uname -s)-$(uname -m)
Имя файла должно бытьdocker-machine-Linux-x86_64
. Переименуйте его вdocker-machine
, чтобы упростить работу с:
mv docker-machine-Linux-x86_64 docker-machine
Сделайте его исполняемым:
chmod +x docker-machine
Переместите или скопируйте его в каталогusr/local/bin
, чтобы он был доступен как системная команда.
sudo mv docker-machine /usr/local/bin
Проверьте версию, которая покажет, что она правильно установлена:
docker-machine version
Вывод должен быть похож на
Outputdocker-machine version 0.14.0, build 89b8332
[[step-2 -—- install-additional-docker-machine-scripts]] == Шаг 2 - Установка дополнительных скриптов Docker Machine
В репозитории GitHub Docker Machine есть три сценария bash, предназначенные для облегчения использования командdocker
иdocker-machine
. Они обеспечивают завершение команд и настройку bash-prompt.
На этом этапе мы установим эти три сценария на ваш локальный компьютер. Они будут загружены и установлены в каталог/etc/bash_completion.d
.
Первый скрипт позволяет вам видеть активную машину из вашего приглашения bash. Это удобно, когда вы работаете с несколькими компьютерами Docker и переключаетесь между ними. Скрипт называетсяdocker-machine-prompt.bash
. Чтобы скачать его, введите:
sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-prompt.bash -O /etc/bash_completion.d/docker-machine-prompt.bash
Чтобы завершить установку указанного выше файла, вам нужно будет установить собственное значение для переменнойPS1
в вашем файле.bashrc
. Для этого откройте его с помощьюnano
(PS1
- это специальная переменная оболочки, используемая для изменения командной строки bash):
nano ~/.bashrc
В этом файле есть три строки, которые начинаются сPS1. Они должны быть такими:
~/.bashrc
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
Для каждой строки вставьте$(__docker_machine_ps1 " [%s]")
в конце, чтобы они читались:
~/.bashrc
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__docker_machine_ps1 " [%s]")\$ '
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(__docker_machine_ps1 " [%s]")\$ '
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$(__docker_machine_ps1 " [%s]")$PS1"
Сохраните и закройте файл.
Второй сценарий называетсяdocker-machine-wrapper.bash
. Он добавляет подкомандуuse
к командеdocker-machine
, упрощая переключение между машинами Docker. Чтобы скачать его, введите:
sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-wrapper.bash -O /etc/bash_completion.d/docker-machine-wrapper.bash
Третий сценарий называетсяdocker-machine.bash
. Он добавляет завершение bash для командdocker-machine
. Загрузите его, используя:
sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine.bash -O /etc/bash_completion.d/docker-machine.bash
Чтобы применить внесенные изменения, закройте, а затем снова откройте свой терминал. Если вы вошли в систему через SSH, выйдите из сеанса и войдите снова. Завершение команд для командdocker
иdocker-machine
теперь должно работать.
[[step-3 -—- provisioning-a-dockerized-host-using-docker-machine]] == Шаг 3. Подготовка Dockerized хоста с помощью Docker Machine
Теперь, когда на вашем локальном компьютере запущены Docker и Docker Machine, вы можете подготовить Dockerized Droplet для своей учетной записи DigitalOcean с помощью командыdocker-machine create
Docker Machine. Если вы еще этого не сделали, назначьте свой токен DigitalOcean API для переменной bash, используя:
export DOTOKEN=your-api-token
NOTE: This tutorial uses [.highlight]#DOTOKEN в качестве переменной bash для токена DO API. Имя переменной не обязательно должно быть DOTOKEN и не обязательно должно быть заглавными.
#
Чтобы сделать переменную постоянной, поместите ее в файл~/.bashrc
. Этот шаг не является обязательным, но он необходим, если вы хотите, чтобы значение сохранялось во время сеансов терминала.
Откройте этот файл с помощьюnano
:
nano ~/.bashrc
Добавьте строку, аналогичную этой:
~/.bashrc
export DOTOKEN=your-api-token
Чтобы активировать переменную в текущем терминальном сеансе, введите:
source ~/.bashrc
Для успешного вызова командыdocker-machine create
необходимо указать (как минимум) драйвер, токен API (или переменную, которая его оценивает) и уникальное имя для машины. Чтобы создать свой первый компьютер, введите:
docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN machine-name
Частичный вывод по мере создания машины выглядит следующим образом. В этом выводе имя машиныubuntu1604-docker
:
Output ...
Installing Docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env ubuntu1604-docker
Для нового хоста создается пара ключей SSH, чтобыdocker-machine
мог получить к нему удаленный доступ. В Droplet установлена нужная операционная система, а в системе установлен Docker. Когда команда завершена, ваша Docker Droplet запущена и работает.
Чтобы увидеть вновь созданный компьютер из командной строки, введите:
docker-machine ls
Вывод должен быть похож на это:
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
ubuntu1604-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
[[step-4 -—- specifying-the-base-os-when-Creating-a-dockerized-host]] == Шаг 4. Указание базовой ОС при создании Dockerized хоста
По умолчанию при создании Dockerized хоста с Docker Machine используется базовая операционная системаsupposed, которая соответствует последней версии Ubuntu LTS. Однако на момент публикации этой публикации командаdocker-machine create
все еще использует Ubuntu 16.04 LTS в качестве базовой операционной системы, хотя Ubuntu 18.04 является последней версией LTS. Поэтому, если вам нужно запустить Ubuntu 18.04 на недавно подготовленном компьютере, вам нужно указать Ubuntu вместе с желаемой версией, передав флаг--digitalocean-image
командеdocker-machine create
.
Например, чтобы создать машину с помощью Ubuntu 18.04, введите:
docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN machine-name
Вы не ограничены версией Ubuntu. Вы можете создать машину, используя любую операционную систему, поддерживаемую DigitalOcean. Например, чтобы создать машину с помощью Debian 8, введите:
docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN machine-name
Чтобы подготовить Dockerized хост с CentOS 7 в качестве базовой ОС, укажитеcentos-7-0-x86
в качестве имени образа, например:
docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN centos7-docker
Базовая операционная система - не единственный выбор, который у вас есть. Вы также можете указать размер капли. По умолчанию это самая маленькая капля, которая имеет 1 ГБ оперативной памяти, один процессор и твердотельный накопитель на 25 ГБ.
Найдите размер капли, которую вы хотите использовать, найдя соответствующий слаг вDigitalOcean API documentation.
Например, чтобы подготовить машину с 2 ГБ оперативной памяти, двумя процессорами и твердотельным накопителем на 60 ГБ, используйте slugs-2vcpu-2gb
:
docker-machine create --driver digitalocean --digitalocean-size s-2vcpu-2gb --digitalocean-access-token $DOTOKEN machine-name
Чтобы увидеть все флаги, специфичные для создания Docker Machine с помощью драйвера DigitalOcean, введите:
docker-machine create --driver digitalocean -h
[.tip] #Tip: Если вы обновите страницу Droplet на панели инструментов DigitalOcean, вы увидите новые машины, созданные с помощью командыdocker-machine
.
#
[[step-5 -—- execute-additional-docker-machine-commands]] == Шаг 5 - Выполнение дополнительных машинных команд Docker
Вы видели, как подготовить Dockerized хост с помощью подкомандыcreate
. Вы также видели, как составить список хостов, доступных для Docker Machine, с помощью подкомандыls
. На этом этапе вы изучите еще несколько подкомандdocker-machine
.
Чтобы получить подробную информацию о Dockerized хосте, используйте подкомандуinspect
, например:
docker-machine inspect machine-name
Вывод должен включать такие строки. СтрокаImage показывает версию используемого дистрибутива Linux, а строкаsize указывает размер слага:
Output...
{
"ConfigVersion": 3,
"Driver": {
"IPAddress": "203.0.113.71",
"MachineName": "ubuntu1604-docker",
"SSHUser": "root",
"SSHPort": 22,
...
"Image": "ubuntu-16-04-x64",
"Size": "s-1vcpu-1gb",
...
},
---
Чтобы напечатать конфигурацию соединения для хоста, введите:
docker-machine config machine-name
Вывод должен быть похож на это:
Output--tlsverify
--tlscacert="/home/kamit/.docker/machine/certs/ca.pem"
--tlscert="/home/kamit/.docker/machine/certs/cert.pem"
--tlskey="/home/kamit/.docker/machine/certs/key.pem"
-H=tcp://203.0.113.71:2376
Последняя строка выходных данных командыdocker-machine config
показывает IP-адрес хоста, но вы также можете получить эту информацию, набрав:
docker-machine ip machine-name
Если вам нужно выключить удаленный хост, вы можете использоватьdocker-machine
, чтобы остановить его:
docker-machine stop machine-name
Убедитесь, что он остановлен.
docker-machine ls
Статус машины изменился:
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
ubuntu1604-docker digitalocean Timeout
Чтобы начать это снова:
docker-machine start machine-name
Убедитесь, что он запущен:
docker-machine ls
Вы увидите, чтоSTATE
теперь установленRunning
для хоста:
OuputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
ubuntu1604-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
Затем вы можете удалить его, используя:
docker-machine rm machine-name
Дроплет удаляется вместе с SSH-ключом, созданным для негоdocker-machine.
. Теперь, когда вы перечисляете Dockerized хосты, вы не должны видеть только что удаленный:
docker-machine ls
[[step-6 -—- execute-commands-on-a-dockerized-host-via-ssh]] == Шаг 6 - Выполнение команд на Dockerized-хосте через SSH
На данный момент вы получаете информацию о своих машинах, но вы можете сделать больше, чем это. Например, вы можете выполнять собственные команды Linux на хосте Docker, используя подкомандуssh
командыdocker-machine
из вашей локальной системы. В этом разделе объясняется, как выполнять командыssh
черезdocker-machine
, а также как открыть сеанс SSH на Dockerized хосте.
Предполагая, что вы подготовили компьютер с Ubuntu в качестве операционной системы, выполните следующую команду из локальной системы, чтобы обновить базу данных пакетов на хосте Docker:
docker-machine ssh machine-name apt-get update
Вы даже можете применить доступные обновления, используя:
docker-machine ssh machine-name apt-get upgrade
Не уверены, какое ядро использует ваш удаленный хост Docker? Введите следующее:
docker-machine ssh machine-name uname -r
Помимо использования подкомандыssh
для выполнения команд на удаленном хосте Docker, вы также можете использовать ее для входа в сам компьютер. Это так же просто, как печатать:
docker-machine ssh machine-name
Ваша командная строка изменится, чтобы отразить тот факт, что вы вошли на удаленный хост:
Outputroot@machine-name#
Чтобы выйти с удаленного хоста, введите:
exit
[[step-7 -—- activating-a-dockerized-host]] == Шаг 7. Активация Dockerized-хоста
Активация хоста Docker подключает ваш локальный клиент Docker к этой системе, что позволяет запускать обычные командыdocker
в удаленной системе. Чтобы активировать хост Docker, введите следующую команду:
eval $(docker-machine env machine-name)
Кроме того, вы можете активировать его с помощью этой команды:
docker-machine use machine-name
[.tip] #Tip При работе с несколькими хостами Docker командаdocker-machine use
- самый простой способ переключения с одного на другой.
#
После ввода любой из приведенных выше команд ваша подсказка bash должна измениться, чтобы указать, что ваш клиент Docker указывает на удаленный хост Docker. Это примет эту форму. Имя хоста будет в конце приглашения:
username@localmachine:~ [machine-name]$
Теперь любая командаdocker
, которую вы вводите в этой командной строке, будет выполняться на этом удаленном хосте.
Если на терминале активен хост, на котором запущена командаdocker-machine ls
, звездочка под столбцомACTIVE показывает, что он активен.
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
ubuntu1604-docker * digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
Чтобы выйти с удаленного хоста Docker, введите следующее:
docker-machine use -u
Вы вернетесь к приглашению для вашей локальной системы.
Теперь давайте создадим контейнеры на удаленной машине.
[[step-8 -—- create-docker-container-on-a-remote-dockerized-host]] == Шаг 8 - Создание контейнеров Docker на удаленном хосте Dockerized
До сих пор вы предоставили Dockerized Droplet для своей учетной записи DigitalOcean и активировали ее, то есть ваш клиент Docker указывает на нее. Следующий логический шаг - раскрутить на нем контейнеры. В качестве примера, давайте попробуем запустить официальный контейнер Nginx.
Используйтеdocker-machine use
, чтобы выбрать удаленный компьютер:
docker-machine use machine-name
Теперь выполните эту команду, чтобы запустить контейнер Nginx на этом компьютере:
docker run -d -p 8080:80 --name httpserver nginx
В этой команде мы сопоставляем порт80
в контейнере Nginx с портом8080
на Dockerized хосте, чтобы мы могли получить доступ к странице Nginx по умолчанию из любого места.
Если команда выполнена успешно, вы сможете получить доступ к странице Nginx по умолчанию, указав в своем браузереhttp://docker_machine_ip:8080
.
Пока хост Docker все еще активирован (как видно из его имени в приглашении), вы сможете перечислить изображения на этом хосте:
docker images
Вывод должен включать изображение Nginx, которое вы только что использовали, а также другие, которые вы загружали ранее:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ae513a47849c 3 weeks ago 109MB
Вы также можете перечислить активные или работающие контейнеры на хосте:
docker ps
Если контейнер Nginx, запущенный на этом шаге, является единственным активным контейнером, выходные данные должны выглядеть следующим образом:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4284f9d25548 nginx "nginx -g 'daemon of…" 20 minutes ago Up 20 minutes 0.0.0.0:8080->80/tcp httpserver
Чтобы выйти из приглашения на удаленный хост, введите. Это также закроет терминал:
exit
[.note] #Note: Если вы собираетесь создавать контейнеры на удаленном компьютере, ваш клиент Docker должен указывать на него - то есть это должен быть активный компьютер в терминале, который вы используете. В противном случае вы будете создавать контейнер на локальном компьютере. Опять же, пусть ваша командная строка будет вашим проводником.
#
[[step-9 -—- dishibited-crash-reporting-optional]] == Шаг 9 - Отключение отчетов о сбоях (необязательно)
По умолчанию всякий раз, когда попытка инициализации Dockerized-хоста с использованием Docker Machine завершается неудачей или происходит сбой Docker Machine, некоторая диагностическая информация автоматически отправляется на учетную запись Docker в Bugsnag. Если вас это не устраивает, вы можете отключить создание отчетов, создав пустой файл с именемno-error-report
в каталоге установки.docker/machine
.
Чтобы создать файл, введите:
touch ~/.docker/machine/no-error-report
Проверьте файл на наличие сообщений об ошибках в случае сбоя инициализации или сбоя Docker Machine.
Заключение
Это было введение в установку и использование Docker Machine для удаленного предоставления нескольких Docker Droplets из одной локальной системы. Теперь вы сможете быстро предоставить столько Dockerized хостов для вашей учетной записи DigitalOcean, сколько вам нужно.
Чтобы узнать больше о машинах Docker, посетитеofficial documentation page. Три сценария Bash, загруженные в этом руководстве, размещены наthis GitHub page.