Статьи

Docker Machine, Compose и Swarm: как они работают вместе

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

Несмотря на то, что они должны быть простыми, эти инструменты очень мощные, и они требуют некоторого планирования, прежде чем запускать и развертывать тонны контейнеров поверх вашей любимой инфраструктуры как услуги. Я постараюсь пролить свет на то, почему они так хороши в вашем инструментальном поясе, где их следует использовать и как с ними начать.

Три инструмента теперь аккуратно упакованы в то, что называется Docker Toolbox . Убедитесь, что он установлен, прежде чем продолжить.

Докер машина

Первым инструментом, который мы рассмотрим из набора инструментов, является Docker Machine, который поможет вам создавать хосты контейнеров на многих из самых популярных платформ Infrastructure-as-a-Service. Конечно, вы можете использовать две самые популярные платформы виртуализации десктопов: VMware Fusion и VirtualBox, но он также поддерживает другие платформы, такие как AWS, Azure, DigitalOcean, Exoscale, Google Compute Engine, OpenStack, RackSpace, SoftLayer, VMware vSphere и vCloud. Воздуха.

Давайте начнем с установки хоста контейнера на локальном рабочем столе. Когда вы установили Docker Toolbox, у вас также был установлен VirtualBox, так что давайте использовать его для создания виртуальной машины Linux, где мы можем запускать наши контейнеры. Чтобы создать контейнерный хост, просто запустите следующую команду:

$ docker-machine create --driver virtualbox containerhost 
Creating VirtualBox VM... 
Creating SSH key... 
Starting VirtualBox VM... 
Starting VM... 
To see how to connect Docker to this machine, run: docker-machine env containerhost

Эта команда скажет Docker Machine использовать драйвер VirtualBox для создания узла контейнера с именем «containerhost». Теперь у нас есть место для запуска наших контейнеров! Давайте настроим наш терминал для подключения к нему, выполнив следующее:

eval "$(docker-machine env containerhost)"

Если вы привыкли работать с Boot2Docker, предшественником Docker Toolbox, приведенная выше команда похожа на знакомую boot2docker shellinit.

После проверки переменных env Docker Machine теперь вы можете запускать обычные команды Docker, такие как docker run, pull, ps, rm и т. Д. Попробуйте!

Docker Compose

Теперь, когда у нас есть хост-контейнер, мы сконцентрируемся больше на том, чтобы запустить на нем некоторые полезные контейнеры. Мы будем использовать Docker Compose для этого. На самом деле он построен на первом в истории приобретении Docker, которое произошло в 2014 году. Компания под названием Orchard создала инструмент управления несколькими контейнерами под названием Fig. Docker и недавно присоединившаяся команда из Orchard продолжили большую работу, которую проделал Orchard, и, наконец, переименовали ее в Docker Compose в конце прошлого года.

Docker Compose имеет простой способ описать приложение как несколько контейнеров, которые работают вместе, как они должны быть связаны, и какие порты должны быть доступны конечному пользователю. Контейнерные среды Docker определены в файле «docker-compose.yml»; давайте посмотрим на пример и разберем его немного:

web: 
  build: . 
  ports: 
    - "5000:5000" 
  volumes: 
    - .:/code 
  links: 
    - redis 
redis: 
  image: redis

Здесь у нас есть одно приложение, созданное с использованием двух контейнеров. Первый контейнер называется «web» и будет собран из Dockerfile, который есть у нас в текущем рабочем каталоге. Это замечательно, если у вас уже есть Dockerfile для образа контейнера, но вы еще не загрузили его в реестр. Полный Dockerfile и необходимые файлы приложения для этого примера можно найти здесь .

Следующая строка показывает, какие порты будут отображаться на хосте, а какой порт будет перенаправлять трафик в контейнер. Третья часть показывает, что мы будем монтировать том Docker в контейнер, содержащий код приложения. Затем, наконец, мы свяжемся с другим контейнером, который мы называем «redis», который будет использовать стандартный официальный образ Redis из Docker Hub.

Теперь, чтобы запустить это, мы запускаем следующую команду:

$ docker-compose up

Это прочитает docker-compose.yml и создаст среду приложения, которую мы в ней определили, сначала создав веб-приложение из Dockerfile, а также вытащив изображение redis. Docker Compose также свяжет веб-контейнер с контейнером redis. Это будет выглядеть примерно так:

$ docker-compose up 
Pulling redis (redis:latest)... 
<snip> 
Creating compose_redis_1... 
Building web... 
Step 0 : FROM python:2.7 
2.7: Pulling from python 
<snip> 
Successfully built b88dd767cf97 
Creating compose_web_1... 
Attaching to compose_redis_1, compose_web_1 
<snip> 
redis_1 | 1:M 11 Sep 21:21:56.463 # Server started, Redis version 3.0.3 
<snip> 
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 
web_1 | * Restarting with stat

Вот оно! Вы успешно использовали Docker Compose для создания контейнерной среды с двумя сервисами: один — внешний веб-сервис, а другой — уровень персистентности. Теперь давайте посмотрим на веб-страницу, чтобы убедиться, что приложение работает.

Чтобы найти IP-адрес вашего хоста контейнера, выполните следующую команду:

$ docker-machine ip containerhost 
192.168.99.101

Поскольку мы также убедились, что открыли порт 5000 на хосте контейнера и связали его с контейнером, теперь вы сможете подключиться к http://192.168.99.101:5000. Вы должны увидеть сообщение «Hello World! Меня видели 1 раз ». Теперь вы заходите на веб-сайт, на котором хранится значение счетчика посещений в отдельном хранилище значений ключей в контейнерах, получая это значение при каждом новом посещении веб-сайта и представляя его вам. Потрясающие!

Хорошо, теперь, когда мы объяснили основы Docker Compose, пришло время углубиться в следующую тему.

Докер Рой

Наконец, давайте посмотрим на самый интересный инструмент в текущей панели инструментов Docker, Docker Swarm. До сих пор вы работали с одним хостом контейнера и запускали один или два контейнера, что отлично подходит для тестирования или локальной разработки. С помощью Docker Swarm мы собираемся превратить эту маленькую тестовую среду в более крупную установку кластерных хостов-контейнеров, которые можно использовать для масштабирования ваших операций во что-то еще более полезное. Это немного более продвинутое и будет включать такие вещи, как обнаружение служб, кластеризация и удаленное управление.

Давайте начнем с очистки окружающей среды, которая у нас есть, чтобы мы не столкнулись с какими-либо проблемами, связанными с работой множества вещей. Остановите и удалите текущий локальный контейнерный хост, выполнив следующее:

$ docker-machine stop containerhost 
exit status 1 
$ docker-machine rm containerhost 
Successfully removed containerhost

Теперь давайте начнем с создания нового свежего хоста контейнера, который мы будем использовать ненадолго:

$ docker-machine create -d virtualbox local

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

eval "$(docker-machine env local)"

Теперь нам нужно сгенерировать так называемый «токен обнаружения», который будет использоваться для настройки и проверки того, что ваши узлы являются частью правильного кластера:

$ docker run swarm create 
<snip> 
Status: Downloaded newer image for swarm:latest 
8d7dc66346a3e0d999ed38dd29ed0d38

Эта последняя строка является вашим токеном открытия и будет отличаться от моей. Маркер обнаружения фактически создается с помощью общедоступной службы обнаружения Docker. Вы можете найти информацию, хранящуюся в вашем кластере, перейдя по адресу https://discovery.hub.docker.com/v1/clusters/YOURTOKENHERE. Вы будете использовать этот новый токен для всех новых участников Swarm, включая Swarm Master, который мы создаем следующим образом:

$ docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://YOURTOKENHERE swarm-master

Теперь мы создадим два первых узла Swarm:

$ docker-machine create -d virtualbox --swarm --swarm-discovery token://YOURTOKENHERE swarm-agent-00 
$ docker-machine create -d virtualbox --swarm --swarm-discovery token://YOURTOKENHERE swarm-agent-01

Теперь вы также можете завершить работу и удалить «локальный» контейнерный хост; нам это больше не нужно.

Теперь давайте удостоверимся, что ваша оболочка указывает на Swarm Master:

eval $(docker-machine env --swarm swarm-master)

Теперь у вас есть Swarm Master и два Swarm Nodes, работающие локально. Давайте посмотрим, как это выглядит:

$ docker info 
Containers: 4 
Images: 3 
Role: primary 
Strategy: spread 
Filters: affinity, health, constraint, port, dependency 
Nodes: 3 
  swarm-agent-00: 192.168.99.104:2376 
    └ Containers: 1 
    └ Reserved CPUs: 0 / 1 
    └ Reserved Memory: 0 B / 1.022 GiB 
    └ Labels: executiondriver=native-0.2, kernelversion=4.0.9-boot2docker, operatingsystem=Boot2Docker 1.8.1 (TCL 6.3); master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015, provider=virtualbox, storagedriver=aufs 
  swarm-agent-01: 192.168.99.105:2376 
    └ Containers: 1 
    └ Reserved CPUs: 0 / 1 
    └ Reserved Memory: 0 B / 1.022 GiB 
    └ Labels: executiondriver=native-0.2, kernelversion=4.0.9-boot2docker, operatingsystem=Boot2Docker 1.8.1 (TCL 6.3); master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015, provider=virtualbox, storagedriver=aufs 
  swarm-master: 192.168.99.103:2376 
    └ Containers: 2 
    └ Reserved CPUs: 0 / 1 
    └ Reserved Memory: 0 B / 1.022 GiB 
    └ Labels: executiondriver=native-0.2, kernelversion=4.0.9-boot2docker, operatingsystem=Boot2Docker 1.8.1 (TCL 6.3); master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015, provider=virtualbox, storagedriver=aufs 
CPUs: 3 
Total Memory: 3.065 GiB 
Name: 054cb8519400

Это действительно круто! Теперь у вас есть полный контроль над кластером хостов-контейнеров уже через несколько минут работы. Я думаю, что это действительно фантастика!

Теперь вы можете попробовать запускать контейнеры как обычно. Иногда клиенту требуется некоторое время, чтобы ответить уникальным идентификатором контейнера, поэтому просто подождите, пока он не вернется:

$ docker run -d redis 0d7af2492be35cc9c7593f6d677185c6c44f3a06898258585c7d2d2f9aa03c2e 
$ docker run -d nginx 0babf055abf9b487b6bafd4651386075f8d6f46ce9f192849bc32345997438ea

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

$ docker ps
CONTAINER ID    IMAGE     COMMAND                CREATED        STATUS        PORTS           NAMES 
0babf055abf9    nginx     "nginx -g 'daemon off" 10 seconds ago Up 10 seconds 80/tcp, 443/tcp swarm-agent-01/grave_jones 
0d7af2492be3    redis     "/entrypoint.sh redis" 37 seconds ago Up 37 seconds 6379/tcp        swarm-agent-00/furious_fermat

Отличная работа! Теперь у вас есть кластер хостов контейнеров, который вы контролируете и можете использовать для планирования контейнеров между ними.

К сожалению, интеграция между Docker Compose и Docker Swarm в настоящее время не завершена. Но ведется работа, чтобы они были должным образом совместимы в ближайшем будущем; Вы можете следить за работой здесь .

До тех пор получайте удовольствие, придумывая интересные приложения, которые можно запускать на вашем недавно созданном кластере!

Первоначально появился в блоге Codeship Джонасом Росландом.