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

Вступление

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.

Related