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

Вступление

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

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

Хотя Docker Machine можно установить в большинстве дистрибутивов Linux, а также в Mac OS X и Windows, в этом руководстве мы установим его на локальный компьютер с ОС CentOS 7 и используем его для предоставления Dockerized DigitalOcean Droplets.

Предпосылки

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

  • Локальный компьютер под управлением CentOS 7 с установленным Docker. (см. инструкции вHow To Install and Use Docker on CentOS 7)

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

[[step-1 -—- install-docker-machine-on-your-local-computer]] == Шаг 1. Установка Docker Machine на локальный компьютер

На этом этапе мы проработаем процесс установки Docker Machine на локальный компьютер с ОС CentOS 7.

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

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

Скопируйте и вставьте следующую строку в конец этого файла:

~/.bashrc

export PS1='[\u@\h \W$(__docker_machine_ps1 " [%s]")]\$ '

С этой модификацией вашего файла~/.bashrc, когда вы активируете машину, ее имя будет вставлено в приглашение оболочки.

Сохраните и закройте файл.

Второй сценарий называетсяdocker-machine-wrapper.bash. Он добавляет подкомандуuse к командеdocker-machine, упрощая переключение между Dockerized Machines. Чтобы скачать его, введите

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 теперь должно работать. Если это не сработает, вероятно, пакетbash-completion не установлен. Если это так, установите его, используя:

sudo yum install bash-completion

Это должно исправить это.

[[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 shell-variable=your-api-token

NOTE: This tutorial uses [.highlight]#DOTOKEN в качестве переменной bash для токена DO API. Имя переменной не обязательно должно быть DOTOKEN и не обязательно должно быть заглавными.
#

Чтобы сделать переменную постоянной, поместите ее в файл~/.bashrc. Этот шаг не является обязательным, но он необходим, если вы хотите, чтобы значение сохранялось во время сеансов терминала.

nano ~/.bashrc

Добавьте строку, аналогичную этой:

~/.bashrcexport DOTOKEN=your-api-token

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

source ~/.bashrc

Для успешного вызова командыdocker-machine create необходимо указать (как минимум) драйвер, токен API (или переменную, которая его оценивает) и уникальное имя для удаленного хоста. Чтобы создать свой первый Dockerized хост, введите:

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

Частичный вывод при создании хоста выглядит следующим образом. В этом выводе имя хостаcentos-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 i up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env centos-docker

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

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

docker-machine ls

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

OutputNAME                ACTIVE   DRIVER         STATE     URL                         SWARM   DOCKER    ERRORS
centos-docker   -        digitalocean   Running   tcp://203.0.113.71:2376            v18.05.0-ce

[[step-4 -—- укажите-the-base-os-when-Creating-a-dockerized-host]] == Шаг 4. Укажите базовую ОС при создании Dockerized хоста

На этом шаге показано, как указать базовую ОС и версию для Dockerized Host, создаваемого с флагом--digitalocean-image.

Например, чтобы создать хост Dockerized с помощью CentOS 7, введите:

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

Что если вы хотите запустить Debian 8 на своем сервере? Вы должны ввести следующую команду:

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

По умолчанию при создании Dockerized хоста с Docker Machine в качестве базовой операционной системы используетсяsupposed, которая является последней версией (или последней версией LTS для Ubuntu). Однако на момент публикации этой публикации командаdocker-machine create все еще использует Ubuntu 16.04 LTS в качестве базовой операционной системы, хотя Ubuntu 18.04 является последней версией LTS. Поэтому, если вам нужно запустить Ubuntu 18.04, вам нужно будет указать Ubuntu вместе с нужной версией, передав флаг--digitalocean-image командеdocker-machine create:

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

Базовая операционная система - не единственный выбор, который у вас есть. Вы также можете указать размер капли. По умолчанию это самая маленькая капля, которая имеет 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-other-docker-machine-commands]] == Шаг 5. Выполнение других команд Docker Machine

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

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

docker-machine inspect machine-name

Вывод должен включать такие строки. СтрокаImage показывает используемую версию дистрибутива Linux:

Output{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "203.0.113.71",
        "MachineName": "centos-docker",
        "SSHUser": "root",
        "SSHPort": 22,
        ...
        "Image": "centos-7-0-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
centos-docker                  digitalocean   Timeout

Чтобы начать это снова:

docker-machine start machine-name

Убедитесь, что он запущен:

docker-machine ls

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

OuputNAME                 ACTIVE   DRIVER         STATE     URL                        SWARM   DOCKER    ERRORS

centos-docker         -        digitalocean   Running    tcp://203.0.113.71:2376            v18.05.0-ce

Наконец, если вы хотите удалить хост:

docker-machine rm machine-name

[[step-6 -—- execute-commands-on-a-dockerized-host-via-ssh]] == Шаг 6 - Выполнение команд на Dockerized-хосте через SSH

На данный момент вы получаете информацию о своих хостах, но вы можете сделать больше, чем это. Например, вы можете выполнять собственные команды Linux на хосте Docker, используя подкомандуssh командыdocker-machine из вашей локальной системы. В этом разделе объясняется, как выполнять командыssh черезdocker-machine, а также как открыть сеанс SSH на Dockerized хосте.

Предполагая, что вы подготовили хост с CentOS в качестве операционной системы, выполните следующую команду из локальной системы, чтобы обновить пакеты на хосте Docker:

docker-machine ssh machine-name yum update

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

docker-machine ssh machine-name uname -r

Помимо использования подкомандыssh для выполнения команд на удаленном хосте Docker, вы также можете использовать ее для входа на сам хост Dockerized. Это так же просто, как печатать:

docker-machine ssh machine-name

Ваша командная строка изменится, чтобы отразить тот факт, что вы вошли на удаленный хост:

root@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 показывает, что он активен.

Output NAME         ACTIVE            DRIVER         STATE     URL                        SWARM   DOCKER    ERRORS
centos-docker   *        digitalocean   Running    tcp://203.0.113.71:2376            v18.05.0-ce

[.note] #NOTE: Когда хост активен, любая командаdocker, которую вы вводите на терминале, который вы используете, будет выполняться на удаленном хосте. Однако все обычные команды Linux выполняются на локальном компьютере.
#

Чтобы выйти с удаленного хоста 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. Это также закроет терминал:

exit

[.tip] #Tip: Если вы собираетесь создавать контейнеры на удаленном хосте, ваш клиент Dockermust указывает на него, то есть это должен быть активный хост в терминале, который вы с помощью. В противном случае вы будете создавать контейнер на локальном компьютере. Пусть ваша командная строка будет вашим проводником.
#

[[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