Как подготовить и управлять удаленными хостами Docker с помощью Docker Machine в Ubuntu 18.04

Вступление

Docker Machine - это инструмент, который упрощает предоставление и управление несколькими хостами Docker удаленно с вашего персонального компьютера. Такие серверы обычно называются Dockerized-хостами и используются для запуска Docker-контейнеров.

Хотя Docker Machine можно установить в локальной или удаленной системе, наиболее распространенным подходом является его установка на локальном компьютере (собственной установке или виртуальной машине) и использование его для подготовки удаленных серверов Dockerized.

Хотя Docker Machine можно установить в большинстве дистрибутивов Linux, а также в MacOS и Windows, в этом руководстве вы установите его на локальный компьютер с Ubuntu 18.04 и будете использовать его для подготовки Dockerized DigitalOcean Droplets. Если у вас нет локального компьютера с Ubuntu 18.04, вы можете следовать этим инструкциям на любом сервере Ubuntu 18.04.

Предпосылки

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

  • Локальный компьютер или сервер под управлением Ubuntu 18.04 с установленным Docker. См. Инструкции вHow To Install and Use Docker on Ubuntu 18.04.

  • Токен API DigitalOcean. Если у вас его нет, сгенерируйте его с помощьюthis guide. Когда вы генерируете токен, убедитесь, что он имеет область чтения-записи. Это значение по умолчанию, поэтому, если вы не измените какие-либо параметры при его создании, он будет иметь возможности чтения-записи.

[[step-1 -—- install-docker-machine]] == Шаг 1. Установка Docker Machine

Чтобы использовать Docker Machine, вы должны сначала установить его локально. В Ubuntu это означает загрузку нескольких скриптов из официального хранилища Docker на GitHub.

Чтобы загрузить и установить двоичный файл Docker Machine, введите:

wget https://github.com/docker/machine/releases/download/v0.15.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.15.0, build b48dc28d

Docker Machine установлен. Давайте установим несколько дополнительных вспомогательных инструментов, чтобы с Docker Machine было легче работать.

[[step-2 -—- install-additional-docker-machine-scripts]] == Шаг 2 - Установка дополнительных скриптов Docker Machine

В репозитории GitHub Docker Machine есть три сценария Bash, которые вы можете установить, чтобы упростить работу с командамиdocker иdocker-machine. После установки эти сценарии обеспечивают завершение команд и настройку подсказок.

На этом этапе вы установите эти три сценария в каталог/etc/bash_completion.d на вашем локальном компьютере, загрузив их прямо из репозитория Docker Machine на GitHub.

[.note] #Note: Перед загрузкой и установкой скрипта из Интернета в общесистемном месте вы должны сначала проверить содержимое скрипта, просмотрев исходный URL-адрес в своем браузере.
#

Первый скрипт позволяет вам увидеть активную машину в вашем приглашении. Это удобно, когда вы работаете с несколькими компьютерами 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. ПеременнаяPS1 - это специальная переменная оболочки, используемая для изменения командной строки Bash. Откройте~/.bashrc в своем редакторе:

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.

Давайте проверим ситуацию, создав новый хост 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 для переменной среды:

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 вы должны указатьdriver, которые вы хотите использовать, а также имя компьютера. Драйвер - это адаптер для инфраструктуры, которую вы собираетесь создать. Есть драйверы для поставщиков облачной инфраструктуры, а также драйверы для различных платформ виртуализации.

Мы будем использовать драйверdigitalocean. В зависимости от выбранного драйвера, вам потребуется предоставить дополнительные опции для создания машины. Драйверdigitalocean требует токена API (или переменной, которая его оценивает) в качестве аргумента вместе с именем машины, которую вы хотите создать.

Чтобы создать свою первую машину, введите эту команду для создания капли DigitalOcean с именемdocker-01:

docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN docker-01

Вы увидите этот вывод, когда Docker Machine создаст дроплет:

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 ubuntu1804-docker

Docker Machine создает пару ключей SSH для нового хоста, чтобы иметь возможность удаленного доступа к серверу. Droplet поставляется с операционной системой, а Docker установлен. Когда команда завершена, ваша Docker Droplet запущена и работает.

Чтобы увидеть только что созданный компьютер из командной строки, введите:

docker-machine ls

Вывод будет похож на это, указывая, что новый хост Docker работает:

OutputNAME        ACTIVE   DRIVER         STATE     URL                         SWARM   DOCKER        ERRORS
docker-01   -        digitalocean   Running   tcp://209.97.155.178:2376           v18.06.1-ce

Теперь давайте посмотрим, как указать операционную систему при создании машины.

[[step-4 -—- specifying-the-base-os-and-droplet-options-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 docker-ubuntu-1804

Вы не ограничены версией Ubuntu. Вы можете создать машину, используя любую операционную систему, поддерживаемую DigitalOcean. Например, чтобы создать машину с помощью Debian 8, введите:

docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN docker-debian

Чтобы подготовить Dockerized хост с CentOS 7 в качестве базовой ОС, укажитеcentos-7-0-x86 в качестве имени образа, например:

docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN docker-centos7

Базовая операционная система - не единственный выбор, который у вас есть. Вы также можете указать размер капли. По умолчанию это самая маленькая капля, которая имеет 1 ГБ оперативной памяти, один процессор и твердотельный накопитель на 25 ГБ.

Найдите размер капли, которую вы хотите использовать, найдя соответствующий слаг вDigitalOcean API documentation.

Например, чтобы подготовить машину с 2 ГБ оперативной памяти, двумя процессорами и твердотельным накопителем на 60 ГБ, используйте slugs-2vcpu-2gb:

docker-machine create --driver digitalocean --digitalocean-size s-2vcpu-2gb --digitalocean-access-token $DOTOKEN docker-03

Чтобы увидеть все флаги, специфичные для создания Docker Machine с помощью драйвера DigitalOcean, введите:

docker-machine create --driver digitalocean -h

[.tip] #Tip: Если вы обновите страницу Droplet на панели инструментов DigitalOcean, вы увидите новые машины, созданные с помощью командыdocker-machine.
#

Теперь давайте рассмотрим некоторые другие команды Docker Machine.

[[step-5 -—- execute-additional-docker-machine-commands]] == Шаг 5 - Выполнение дополнительных машинных команд Docker

Вы видели, как подготовить Dockerized хост с помощью подкомандыcreate, и как составить список хостов, доступных Docker Machine, с помощью подкомандыls. На этом этапе вы изучите еще несколько полезных подкоманд.

Чтобы получить подробную информацию о Dockerized хосте, используйте подкомандуinspect, например:

docker-machine inspect docker-01

Вывод включает в себя строки, подобные приведенным в следующем выводе СтрокаImage показывает версию используемого дистрибутива Linux, а строкаSize указывает размер слага:

Output...
{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "203.0.113.71",
        "MachineName": "docker-01",
        "SSHUser": "root",
        "SSHPort": 22,
        ...
        "Image": "ubuntu-16-04-x64",
        "Size": "s-1vcpu-1gb",
        ...
    },

---

Чтобы напечатать конфигурацию соединения для хоста, введите:

docker-machine config docker-01

Вывод будет похож на это:

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 docker-01

Если вам нужно выключить удаленный хост, вы можете использоватьdocker-machine, чтобы остановить его:

docker-machine stop docker-01

Убедитесь, что он остановлен:

docker-machine ls

Вывод показывает, что статус машины изменился:

OuputNAME        ACTIVE   DRIVER         STATE     URL   SWARM   DOCKER    ERRORS
docker-01   -        digitalocean   Stopped                 Unknown

Чтобы запустить его снова, используйте подкомандуstart:

docker-machine start docker-01

Затем проверьте его статус снова:

docker-machine ls

Вы увидите, чтоSTATE теперь установленRunning для хоста:

OuputNAME                ACTIVE   DRIVER         STATE     URL                        SWARM   DOCKER    ERRORS

docker-01           -        digitalocean   Running   tcp://203.0.113.71:2376            v18.06.1-ce

Теперь давайте посмотрим, как взаимодействовать с удаленным хостом с помощью SSH.

[[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 docker-01 apt-get update

Вы даже можете применить доступные обновления, используя:

docker-machine ssh docker-01 apt-get upgrade

Не уверены, какое ядро ​​использует ваш удаленный хост Docker? Введите следующее:

docker-machine ssh docker-01 uname -r

Наконец, вы можете войти на удаленный хост с помощью командыdocker machine ssh:

docker-machine ssh docker-01

Вы войдете в систему как пользовательroot и увидите что-то похожее на следующее:

Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-131-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

14 packages can be updated.
10 updates are security updates.

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

Далее мы будем направлять команды Docker на наш удаленный хост.

[[step-7 -—- activating-a-dockerized-host]] == Шаг 7. Активация Dockerized-хоста

Активация хоста Docker подключает ваш локальный клиент Docker к этой системе, что позволяет запускать обычные командыdocker в удаленной системе.

Сначала используйте Docker Machine для создания нового хоста Docker с именемdocker-ubuntu с помощью Ubuntu 18.04:

docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN docker-ubuntu

Чтобы активировать хост Docker, введите следующую команду:

eval $(docker-machine env machine-name)

Кроме того, вы можете активировать его с помощью этой команды:

docker-machine use machine-name

[.tip] #Tip При работе с несколькими хостами Docker командаdocker-machine use - самый простой способ переключения с одного на другой.
#

После ввода любой из этих команд ваше приглашение изменится, чтобы указать, что ваш клиент Docker указывает на удаленный хост Docker. Это примет эту форму. Имя хоста будет в конце приглашения:

username@localmachine:~ [docker-01]$

Теперь любая командаdocker, которую вы вводите в этой командной строке, будет выполняться на этом удаленном хосте.

Снова выполнитеdocker-machine ls:

docker-machine ls

Вы увидите звездочку под столбцомACTIVE дляdocker-01:

OutputNAME                ACTIVE   DRIVER         STATE     URL                         SWARM   DOCKER    ERRORS
docker-01           *        digitalocean   Running   tcp://203.0.113.71:2376             v18.06.1-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 docker-01

Теперь выполните эту команду, чтобы запустить контейнер 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              71c43202b8ac        3 hours ago         109MB

Вы также можете перечислить активные или работающие контейнеры на хосте:

docker ps

Если контейнер Nginx, запущенный на этом шаге, является единственным активным контейнером, выходные данные будут выглядеть следующим образом:

OutputCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS
 PORTS                  NAMES
d3064c237372        nginx               "nginx -g 'daemon of…"   About a minute ago   Up About a minute
 0.0.0.0:8080->80/tcp   httpserver

Если вы собираетесь создавать контейнеры на удаленной машине, ваш Docker-клиент должен указывать на него, то есть это должен быть активный компьютер в терминале, который вы используете. В противном случае вы будете создавать контейнер на локальном компьютере. Опять же, пусть ваша командная строка будет вашим руководством.

Docker Machine может создавать удаленные хосты и управлять ими, а также удалять их.

[[step-9 -–- remove-docker-hosts]] == Шаг 9. Удаление хостов Docker

Вы можете использовать Docker Machine для удаления созданного хоста Docker. Используйте командуdocker-machine rm, чтобы удалить созданный вами хостdocker-01:

docker-machine rm docker-01

Капля удаляется вместе с ключом SSH, созданным для нее. Снова перечислите хосты:

docker-machine ls

На этот раз вы не увидите хостdocker-01 в выводе. И если вы создали только один хост, вы вообще не увидите никакого вывода.

Обязательно выполните командуdocker-machine use -u, чтобы вернуть локальный демон Docker на ваш локальный компьютер.

[[step-10 -—- dishibited-crash-reporting-optional]] == Шаг 10 - Отключение отчетов о сбоях (необязательно)

По умолчанию всякий раз, когда попытка подготовить Dockerized хост с помощью Docker Machine завершается неудачей или происходит сбой Docker Machine, некоторая диагностическая информация отправляется в учетную запись Docker наBugsnag. Если вас это не устраивает, вы можете отключить создание отчетов, создав пустой файл с именемno-error-report в каталоге.docker/machine локального компьютера.

Чтобы создать файл, введите:

touch ~/.docker/machine/no-error-report

Проверьте файл на наличие сообщений об ошибках в случае сбоя инициализации или сбоя Docker Machine.

Заключение

Вы установили Docker Machine и использовали его для удаленной подготовки нескольких хостов Docker к DigitalOcean из локальной системы. Отсюда вы сможете выделить столько Dockerized хостов для вашей учетной записи DigitalOcean, сколько вам нужно.

Чтобы узнать больше о Docker Machine, посетитеofficial documentation page. Три сценария Bash, загруженные в этом руководстве, размещены наthis GitHub page.

Related