Хостинг docker: «Докер» — надежный и недорогой хостинг с бесплатной защитой от DDoS

Ansible, Docker, Docker Swarm / Хабр

Привет Хабр! Последние 1.5 года я работал над своим проектом, которому был необходим надежный облачный хостинг. До этого момента я больше 10 лет занимался веб-программированием и когда я решил построить свой хостинг у меня были относительно поверхностные знания в этой области, я и сейчас не являюсь системным администратором. Все что я буду рассказывать может выполнить обычный программист в течение 5 минут, просто запустив набор сценариев для Ansible, которые я подготовил специально для вас и выложил на GitHub.


Моя цель – дать вам список инструментов и общее понимание, что бы вы знали от чего отталкиваться, если у вас появится необходимость в собственном облачном хостинге. При выборе используемых инструментов я ориентировался на простоту, качество документации и стабильность. Прежде, чем использовать все это у себя в продакшене, вам определенно стоит проконсультироваться с системным администратором (я использую некоторые компоненты, которые находятся в статусе «BETA» (июнь 2015)).

Содержание

  • Часть 0: Виртуализация
  • Часть 1: Ansible, Docker, Docker Swarm
  • Часть 2: Service Discovery
  • Часть 3: Consul, Registrator, Consul-Template


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

Вторая причина заключается в специфике моего проекта, он связан с приватностью персональных данных. У меня нет причин кому-то просто доверять свои данные, а своих пользователей тем-более. Меня очень волнует этот вопрос, и я обеспокоен тем, что ему уделяется так мало внимания.

Последняя причина в целях и ориентирах у стартапа в Российских реалиях. Здесь основная цель – начать зарабатывать деньги и выйти в плюс. Нет прибыли – нет стартапа, есть убыточное хобби. Поэтому, третья причина – это стоимость. У меня сейчас ~9Tb трафика и ~5Tb данных, которые я регулярно обрабатываю, обходится мне все это ~100$/месяц (можете посчитать сколько это будет стоить на AWS). Я знаю, что в следующем месяце у меня будет такая же стоимость, а проект я строю на свои деньги.


Первое, что необходимо сделать – раздобыть 3 сервера в одном датацентре (они должны находится как можно ближе друг к другу, что бы ping между ними был минимальный). Не имеет значения, будут это виртуальные выделенные сервера (на время тестирования) или настоящие и у какого провайдера вы их арендуете. Я заказал у DigitalOcean, выбрал установку Debian 8.1 x64 и указал добавить свой SSH ключ:

Установка закончена и у нас в распоряжении 3 «голых» сервера:


Как вы уже поняли, мы будем использовать Ansible для конфигурирования наших серверов. Если вы не знаете что это такое и как этим пользоваться, то на Хабре есть ответы на эти вопросы:

  1. Система управления Ansible
  2. Ansible
  3. Ansible — давайте попробуем


Никто не отменял и официальную документацию (если у вас нет проблем с чтением документации на английском языке, то я бы рекомендовал именно этот источник информации).

Ansible не единственная система управления конфигурациями (есть Puppet, Chef, Salt и т.д.), так почему именно она?

Как я написал выше, один из приоритетов при выборе инструментов – простота. На управляемые машины не надо устанавливать клиенты (все работает через SSH), язык сценариев предельно прост, у проекта свежая и подробная документация, а код модулей написан на Python (что для нас преимущество, потому что Python является основным языком в стартапе).

Мысли о простоте

Вообще для меня простота является признаком глубокого понимания предмета. Если один человек (знакомый с предметом), не может объяснить другому человеку (с предметом не знакомому), как он работает, значит он сам до конца не понимает этот предмет.

Это хорошо раскрыто в книге Стива Возняка – «Cтив Джобс и Я», там отец начинает рассказывать принципы электротехники Стиву, когда он еще не достиг четырех лет (книга будет интересна всем инженерам, даже если вас не интересует история Apple).


На этом этапе Ansible должен быть установлен на вашей клиентской машине (инструкция). Мне, на OS X 10.9, для этого понадобилось выполнить всего 2 команды:

» sudo easy_install pip # если у вас еще не установлен PIP
» sudo pip install ansible


Проверяем, что все ок:

» ansible --version
ansible 1.9
  configured module search path = None


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

«Из коробки» мы получаем доступ к огромному количеству готовых образов, которые мы сможем моментально выполнить в нашем облаке. У нас появляется возможность изолированно запускать необходимые сервисы разных версий одновременно, для тестирования совместимости или удовлетворения зависимостей наших веб-приложений.

Мы можем запустить 20 контейнеров с 1-ой версией нашего веб-приложения, 2 контейнера со 2-ой версией и распределив между ними нагрузку, показать новую версию только ~10% посетителей, оценив стабильность работы и отзывы пользователей.

Сейчас вам необходимо установить Docker на клиентскую машину, он понадобится нам для управления будущим кластером Docker’ов. Самый простой способ сделать это – скачать GUI клиент Kitematic (доступен для Mac OS X 10.9+ и Windows 7+ 64-bit), зайти в главное меню и выбрав «Install Docker Commands» установить консольные комманды Docker’а.

Альтернативные варианты установки вы можете узнать из официальной документации (она хорошо написана и своевременно обновляется). Убедиться, что все в порядке, можно следующим образом:

» docker version  
Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): 7c8fca2
OS/Arch (client): darwin/amd64


Наконец-то мы дошли до самого интересного, до того, что придаст нашему хостингу «облачности». Странно, но я не нашел никакой информации о Docker Swarm на Хабре.

Docker Swarm служит для объединения множества Docker хостов в один виртуальный хост и делает это элегантно. Docker Swarm предоставляет REST API интерфейс, совместимый с Docker API. Таким образом, все инструменты, которые работают с API Docker’a (клиент Docker’a, Dokku, Compose, Krane, Flynn, Deis, DockerUI, Shipyard, Drone, Jenkins и т.д.), смогут работать с Docker Swarm, не подозревая о том, что за ним стоит кластер Docker’ов, а не одна машина.

Давайте уже построим наше облако и на практике посмотрим на что способен Docker Swarm.


К этому моменту у вас на клиентской машине должен быть установлен Ansible и Docker. В наличии должно быть 3 сервера с авторизацией по ключу и Debian 8.1 x64 на борту (вы можете использовать любой другой дистрибутив, внеся небольшие изменения в сценарии). Я подготовил набор сценариев для Ansible, которые сделают всю работу за вас, поэтому вам не понадобится много времени.

Скачиваем набор сценариев или клонируем репозиторий:

» git clone https://github.com/vkozlovski/ansible-cloud-hosting
» git checkout v1.x
» cd ansible-cloud-hosting


Открываем файл stage и заменяем в нем IP адреса на IP своих серверов:

[cloud]
188.166.16.70   debian_release=testing   hostname=debian1
188.166.99.31   debian_release=testing   hostname=debian2
128.199.59.102  debian_release=testing   hostname=debian3


Для того, что бы Docker Swarm мог соединяться с нодами Docker’a, они должны быть доступны снаружи (по умолчанию на 2375-ом порту для HTTP и на 2376-ом для HTTPS). Также нам надо сделать доступным снаружи и Docker Swarm Manager, что бы мы могли управлять кластером. HTTP нам для этих целей не подходит (мы же строим облако для себя, а не любого интернет-пользователя), остаётся HTTPS, а точнее TLS (подробнее можно почитать в официальной документации).

Принцип работы следующий: мы создаём свой центр сертификации (далее ЦС), подписываем сертификаты для сервера и клиента Docker’a. После этого «демон» докера принимает соединения от клиентов, сертификат которых подписан тем же ЦС, что и сертификат «демона». Клиент Docker’а выполняет такую же проверку и подключается только к тем серверам Docker’a, сертификат которых подписан тем же ЦС. Docker Swarm Manager использует такую же схему. Таким образом обеспечивается аутентификация и безопасность нашего мини-облака.

Единственное, что вам требуется сделать, это сгенерировать ключи для вашего ЦС (все остальное выполнится в автоматическом режиме). Просто выполните следующие команды из корневой директории проекта (пароль, который вы укажите, необходимо запомнить, он нам понадобится) и заполните ответы на вопросы (тут нет никаких конкретный требований, домен можете указать любой):

» openssl genrsa -aes256 -out certs/ca/ca-key. pem 4096
» openssl req -new -x509 -days 365 -key certs/ca/ca-key.pem -sha256 -out certs/ca/ca.pem


Осталось заполнить значения некоторых переменных в файле:

group_vars/all.yml

certs:
  ca:
    password: "YOUR PASSWORD HERE"
docker_swarm:
  # docker run --rm swarm create
  token: "YOUR DOCKER SWARM TOKEN HERE"
  manager: "YOU DOCKER SWARM MANAGER IP HERE"
ssh:
  users:
    # user for ansible
    - user: "support"
      shell: "/bin/zsh" # for oh-my-zsh
      groups: "sudo"
      # mkpasswd --method=SHA-512
      password: "YOUR PASSWORD HERE"
      # cat ~/.ssh/id_rsa.pub
      key: "YOUR PUBLIC KEY HERE"


Переменная certs.ca.password должна содержать пароль, который мы указали, когда генерировали приватный ключ для нашего центра сертификации.

Переменная docker_swarm.token должна содержать идентификатор нашего будущего кластера, который можно сгенерировать следующей командой:

» docker run --rm swarm create
6856663cdefdec325839a4b7e1de38e8


Переменная docker_swarm. manager должна содержать IP адрес хоста, где будет запущен Docker Swarm Manager (укажите IP адрес любого из ваших серверов).

В сценариях Ansible указано, что необходимо создать пользователя support, добавить его в группу sudo и запретить root‘у возможность авторизации по SSH. Значение переменной ssh.users[].password должно быть хешем пароля для указанного выше пользователя. Для того, что бы его получить, необходимо выполнить следующую команду на любой Linux машине (можете зайти на один из ваших серверов по SSH и выполнить ее):

» mkpasswd --method=SHA-512
Password: 
$6$n0lQGWy2s5437ns1$nczULrrTw5r.TmhEI/xBz5xYEHWyMbtbQhAJoWshv0rFjSoRxLYZh0zDoMwVM.ZFnChx7ym.4.r182EOIn9Ec/


Значение ssh.users[].key должно быть вашим публичным ключом, который по умолчанию находится тут ~/.ssh/id_rsa.pub:

~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDDakR6/NJuIxJGpWZiV5QODuRacuh5VoIdzeOUlH+MC1xxFf/U74gfumoQ1k62d4S0qPqnlpJVqRNg7mQo0CCguujVRuOP+FbRMjdQbbAEfDAjxkSuKXRWnChg6Ds4MX0RO9WUB9pQLrCmbPpI8A0l0zaNi6mp6TaXWCoMPrgk1OfuTYDBTgQya/MtKjjPnWFEdgwTvB3hVusCU83854Gju9OX4I5ucejy/f8/IWGUIFt8miLisrYnDcdFvY/ThzX7E2h5lzsc8JK6ltywyoHVScl3Vdgf1/WbScEnQYWJZk/h3zWDqdFlte/elov7l3yfJDN0axF+dC6BqJGfZMFQsN6xPWHoG8OCPah3HmTY3XNpQNRLJR5GFWwVriIBDe+GyVjtjzb1/BLdu0WJatv6/PYMsEfArYBgnQ/bHYgfFLF0GPq6nBGJbngytv7C5crBljZAvnC86HQN5sGPbZWfkKdvoG5MbbJYwqFvaD2BEjlXMurbCX4ERrRUHC9875XufaCvdpCiSWaU4S5PM8nr2QCF3co0EtL0bkiciyv95eU0HoQ3cYhPNGwUMxntPp/3z0KRqeSBHPnvV5pmXOwP/xUHxEIvDbqCXtTc3y96iDKZ1T8+jPh2aif6ooVUwmogTHDd1DcW+APtMkqRHdZ7r33wKAYJfNopd+0P8rYF2w==


Пример заполненного файла конфигурации можете глянуть ниже:

group_vars/all. yml

certs:
  ca:
    password: "12345"
docker_swarm:
  # docker run --rm swarm create
  token: "6856663cdefdec325839a4b7e1de38e8"
  manager: "188.166.16.70"
ssh:
  users:
    # user for ansible
    - user: "support"
      shell: "/bin/zsh" # for oh-my-zsh
      groups: "sudo"
      # mkpasswd --method=SHA-512
      password: "$6$n0lQGWy2s5437ns1$nczULrrTw5r.TmhEI/xBz5xYEHWyMbtbQhAJoWshv0rFjSoRxLYZh0zDoMwVM.ZFnChx7ym.4.r182EOIn9Ec/"
      # cat ~/.ssh/id_rsa.pub
      key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDDakR6/NJuIxJGpWZiV5QODuRacuh5VoIdzeOUlH+MC1xxFf/U74gfumoQ1k62d4S0qPqnlpJVqRNg7mQo0CCguujVRuOP+FbRMjdQbbAEfDAjxkSuKXRWnChg6Ds4MX0RO9WUB9pQLrCmbPpI8A0l0zaNi6mp6TaXWCoMPrgk1OfuTYDBTgQya/MtKjjPnWFEdgwTvB3hVusCU83854Gju9OX4I5ucejy/f8/IWGUIFt8miLisrYnDcdFvY/ThzX7E2h5lzsc8JK6ltywyoHVScl3Vdgf1/WbScEnQYWJZk/h3zWDqdFlte/elov7l3yfJDN0axF+dC6BqJGfZMFQsN6xPWHoG8OCPah3HmTY3XNpQNRLJR5GFWwVriIBDe+GyVjtjzb1/BLdu0WJatv6/PYMsEfArYBgnQ/bHYgfFLF0GPq6nBGJbngytv7C5crBljZAvnC86HQN5sGPbZWfkKdvoG5MbbJYwqFvaD2BEjlXMurbCX4ERrRUHC9875XufaCvdpCiSWaU4S5PM8nr2QCF3co0EtL0bkiciyv95eU0HoQ3cYhPNGwUMxntPp/3z0KRqeSBHPnvV5pmXOwP/xUHxEIvDbqCXtTc3y96iDKZ1T8+jPh2aif6ooVUwmogTHDd1DcW+APtMkqRHdZ7r33wKAYJfNopd+0P8rYF2w=="


Теперь мы готовы приступить к построению долгожданного облака:

» ansible-playbook -i stage site. yml -u root


Из-за того, что мы отключили возможность авторизации root‘ом, а также добавили пользователя support (это прописано в сценариях Ansible), все последующие запуски надо выполнять с флагами -s (sudo) и -K (для запроса пароля для sudo):

» ansible-playbook -i stage site.yml -u support -s -K


Мы готовы к проверке нашего новоиспеченного облака:

» docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem info
Containers: 4
Images: 3
Storage Driver: 
Role: primary
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 3
 debian1: 188.166.16.70:2376
  └ Containers: 2
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 519.2 MiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux stretch/sid, storagedriver=aufs
 debian2: 188. 166.99.31:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 519.2 MiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux stretch/sid, storagedriver=aufs
 debian3: 128.199.59.102:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 519.2 MiB
  └ Labels: executiondriver=native-0.2, kernelversion=3.16.0-4-amd64, operatingsystem=Debian GNU/Linux stretch/sid, storagedriver=aufs
Execution Driver: 
Kernel Version: 
Operating System: 
CPUs: 3
Total Memory: 1.521 GiB
Name: 
ID: 
Http Proxy: 
Https Proxy: 
No Proxy:


Ура! Я почти дописал эту большую статью, а вы успешно закончили построение своего облака.

Если у вас появится необходимость, то вы можете подключаться к любому из Docker хостов отдельно:

Пример

» docker -H tcp://128.199.59.102:2376 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert. pem --tlskey=certs/docker/key.pem info
Containers: 2
Images: 7
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 11
 Dirperm1 Supported: true
Execution Driver: native-0.2
Kernel Version: 3.16.0-4-amd64
Operating System: Debian GNU/Linux stretch/sid
CPUs: 1
Total Memory: 494.5 MiB
Name: debian1
ID: 5XPE:2VWX:QCSA:J3PJ:WMN7:EDXX:3TSS:7K7K:XU4R:Z3AX:TRVX:VTUQ
WARNING: No memory limit support
WARNING: No swap limit support


Но мы же не для этого прошли весь этот путь, правда? Давайте попробуем запустить несколько экземпляров Nginx в нашем облаке:

» docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem run -d -p 80:80 --name nginx1 nginx
bb49018b697fca975d10a5ec31ad2fed65ed12b3ad8fbd61e64474187d8bc6ed
» docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key. pem run -d -p 80:80 --name nginx2 nginx
2bd86ff97c35d431e9db7f0571d65e17893aefd1d18b1b52194c100a22a49937

Проверяем:

Давайте попробуем запустить еще 2 экземпляра Nginx:

» docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem run -d -p 80:80 --name nginx3 nginx
622b4e199c700cae663bf2e2f326918f94a0cd016c27dc9ff39f4ec4abf7bdb1
» docker -H tcp://188.166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem run -d -p 80:80 --name nginx4 nginx
FATA[0001] Error response from daemon: unable to find a node with port 80 available 


Как мы видим 3-ий экземпляр запустился, а вот 4-ый нет: FATA[0001] Error response from daemon: unable to find a node with port 80 available. Docker Swarm Scheduler видит, что нет хостов со свободным 80-ым портом.

Мы можем посмотреть, какие контейнеры сейчас выполняются у нас в кластере и удостовериться, что каждая копия Nginx была запущена на разной машине:

» docker -H tcp://188. 166.16.70:8000 --tlsverify=true --tlscacert=certs/ca/ca.pem --tlscert=certs/docker/cert.pem --tlskey=certs/docker/key.pem ps                                                      1 ↵
CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS              PORTS                                NAMES
622b4e199c70        nginx:latest           "nginx -g 'daemon of   5 minutes ago       Up 5 minutes        128.199.59.102:80->80/tcp, 443/tcp   debian3/nginx3                 
2bd86ff97c35        nginx:latest           "nginx -g 'daemon of   16 minutes ago      Up 16 minutes       188.166.16.70:80->80/tcp, 443/tcp    debian1/nginx2                 
bb49018b697f        nginx:latest           "nginx -g 'daemon of   17 minutes ago      Up 17 minutes       188.166.99.31:80->80/tcp, 443/tcp    debian2/nginx1                 
148eef0bbe02        library/swarm:latest   "/swarm manage --tls   2 hours ago         Up 2 hours          188.166.16.70:8000->2375/tcp         debian1/docker-swarm-manager   
3545322d27b7        library/swarm:latest   "/swarm join --addr=   2 hours ago         Up 2 hours          2375/tcp                             debian2/docker-swarm           
faaa78cbedba        library/swarm:latest   "/swarm join --addr=   2 hours ago         Up 2 hours          2375/tcp                             debian3/docker-swarm           
0fee12f6a473        library/swarm:latest   "/swarm join --addr=   2 hours ago         Up 2 hours          2375/tcp                             debian1/docker-swarm 


Возможности Docker Swarm на этом не заканчиваются, а только начинаются (об этом можно почитать тут и тут).

Как я писал в начале статьи, моя цель – дать вам список инструментов и общее понимание, что бы вы знали от чего отталкиваться и я надеюсь, что она достигнута.

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

На этом все. Всем спасибо за внимание. Стабильных вам облаков и удачи!

Подписывайтесь на меня в Twitter, я рассказываю о работе в стартапе, своих ошибках и правильных решениях, о python и всём, что касается веб-разработки.

P.S. Я ищу разработчиков в компанию, подробности у меня в профиле.

Установка Docker на VPS | Каталог приложений Beget

Docker — это платформа для разработки, сборки, доставки и запуска приложений в т.н. «контейнерах». Благодаря Docker вы можете сделать ваши приложения независимыми от инфраструктуры и обеспечить их быстрое и единообразное развертывание.

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

Docker от Бегета — это готовый к работе дистрибутив с установленным ПО Docker и Docker Compose: собирайте, тестируйте и деплойте свои приложения сразу после создания виртуального сервера, используя контейнеры.

Состав приложения

  • Ubuntu 22.04
  • Docker CE, последняя версия
  • Docker Сompose, последняя версия

При создании сервера не требуется указывать никаких дополнительных параметров. После создания виртуального сервера потребуется 1-3 минуты на то, чтобы развернуть на нем последнюю версию Docker. Статус установки будет отображаться в панели управления. После завершения установки Docker вы получите уведомление.

Использование Docker

Для проверки корректности развертывания платформы Docker рекомендуется выполнить следующие действия:

  • Подключиться к вашему серверу по SSH по его IP-адресу, используя в качестве логина root. Для пользователей Windows может потребоваться установка SSH-клиента (например, Putty).
  • Для проверки корректности установки Docker можно запустить простой контейнер с помощью команды docker run hello-world и убедиться, что скачивание и запуск образов происходит корректно и контейнер запускается без ошибок:
root@docker-host1:~# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:7d246653d0511db2a6b2e0436cfd0e52ac8c066000264b3ce63331ac66dca625
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal. 
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
For more examples and ideas, visit:
 https://docs.docker.com/get-started/

После успешной установки, Docker можно использовать без ограничений. Желаем удачной работы!

Частые вопросы по Docker

Как войти в работающий контейнер Docker? Как выполнить команду в работающем контейнере Docker?

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

  • Найдите ID или имя требуемого контейнера с помощью команды docker ps:
root@docker-host1:~# docker ps
CONTAINER ID   IMAGE           COMMAND             CREATED         STATUS         PORTS     NAMES
fc0e883605c3   ubuntu:latest   "/bin/sleep 1000"   2 minutes ago   Up 2 minutes             lucid_bouman
  • Для выполнения произвольной команды в контейнере воспользуйтесь командой вида docker exec <container id|name> <command>:
root@docker-host1:~# docker exec fc0e883605c3 ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0. 0  0.0   2788  1056 ?        Ss   12:37   0:00 /bin/sleep 1000
root          32  0.0  0.0   7060  1588 ?        Rs   12:41   0:00 ps aux

где fc0e883605c3 — ID контейнера, ps aux — требуемая команда

  • Для выполнения интерактивных команд (например, запуска оболочки bash в окружении контейнера), воспользуйтесь командой вида docker exec -it <container id|name> <command>:
root@docker-host1:~# docker exec -it fc0e883605c3 bash
root@fc0e883605c3:/# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   2788  1056 ?        Ss   12:37   0:00 /bin/sleep 1000
root          38  0.0  0.1   4628  3864 pts/0    Ss   12:43   0:00 bash
root          47  0.0  0.0   7060  1600 pts/0    R+   12:43   0:00 ps aux

Как перезапустить контейнер с помощью Docker?

Для перезапуска контейнера используйте docker restart:

  • Найдите ID или имя требуемого контейнера с помощью команды docker ps:
root@docker-host1:~# docker ps
CONTAINER ID   IMAGE           COMMAND             CREATED         STATUS         PORTS     NAMES
fc0e883605c3   ubuntu:latest   "/bin/sleep 1000"   2 minutes ago   Up 2 minutes             lucid_bouman
  • Для перезапуска требуемого контейнера воспользуйтесь командой вида docker restart <container id|name>:
root@docker-host1:~# docker restart fc0e883605c3
fc0e883605c3

Как удалить все остановленные контейнеры в Docker?

Для удаления всех остановленных контейнеров воспользуйтесь командой docker container prune:

root@docker-host1:~# docker container prune
WARNING! This will remove all stopped containers. 
Are you sure you want to continue? [y/N] y
Deleted Containers:
8618a56f1accf627945ce95c4dae94ad15cb369cfaba9f0867aaccf7b7b8d2ae
55cfa3754b062c9055d5a97bf0de2c13eecc77d74c5846bb066ab24512cb72c5
fc0e883605c38d811cae890b244e2f6776b507e00e02fe802e53c82ec29fe876
86ce4a4f6cbe2be88c31163babde317d99de8fb536ae77d62a7254fc1ad2d3d1
Total reclaimed space: 10M

8 лучших платформ хостинга Docker или хостинга контейнеров в 2022 году

Просмотров сообщений: 4 866

Docker в облачных вычислениях — это бесплатная платформа контейнеризации с открытым исходным кодом, которая помогает разработчикам запускать приложения внутри контейнера. Контейнер небольшой и легкий, использует минимум ресурсов и может упростить разработку, тестирование и развертывание приложений.

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

Докеру также требуется VPS или выделенный сервер, чтобы полностью раскрыть свой потенциал. Так зачем тратить ресурсы и время на управление контейнерами. На рынке доступно множество поставщиков хостинга Docker или контейнеров . Они помогают размещать, развертывать и управлять образами и контейнерами Docker по очень низкой цене.

Вот список лучших платформ для размещения контейнеров Docker, идеально подходящих для разработчиков, использующих Docker.

1. Каматера – (Выбор редакции)

Kamatera — одна из лучших и самых надежных хостинговых платформ Docker, которая предоставляет облачный сервер для развертывания и управления контейнерами Docker . Он имеет 13 центров обработки данных, которые разбросаны по четырем континентам. Хостинг Kamatera построен на мощной сети, которая обеспечивает постоянную доступность и высокую производительность для пользователей по всему миру.

Цены очень низкие. Плата за установку не взимается, никаких обязательств и отмена в любое время. Вы можете начать с минимальной цены 4 долларов в месяц.

Особенности

  • 30-дневная бесплатная пробная версия Docker Hosting
  • Отсутствие единой точки отказа
  • Развертывание сервера менее чем за 60 секунд
  • Аппаратное обслуживание не требуется.
  • 13 центров обработки данных на 4 континентах для максимальной доступности и производительности

Ссылка на веб-сайт: www.kamatera.com

2.StackPath

StackPath — это облачная вычислительная инфраструктура и платформа услуг, созданная на границе облака. Он используется для сборки и развертывания вашего приложения в контейнерной среде. С помощью StackPath вы можете развернуть контейнер в любом из 22 периферийных местоположений . Данные конечных пользователей могут поступать в наши контейнеры в 2,6 раза быстрее, чем в общедоступные облачные контейнеры, а данные могут перемещаться между периферийными местоположениями на 21% быстрее , чем при маршрутизации через общедоступный Интернет.

По сравнению с другими облачными провайдерами, StackPath обрабатывает контейнеры в 2,6 раза быстрее с ультранизкой задержкой. Вот сравнение StackPath с другими поставщиками:

Возможности
  • Поддержка CI/CD и RESTful API
  • Инструменты DevOps, такие как Terraform, и прямой контроль над ЦП, памятью, дисковыми ресурсами и расположением.
  • Высокая масштабируемость и гибкость
  • Предлагает бесплатное размещение контейнеров на 1 месяц.
  • Поддержка нескольких облаков
  • Постоянное хранилище
  • Управление идентификацией и доступом (IAM)

Бесплатная демонстрация: Щелкните здесь , чтобы запланировать демонстрацию, чтобы узнать больше о продуктах и ​​ценах.

3. RoseHosting

RoseHosting — это облачная платформа, которая предоставляет «Платформу как услугу» на основе контейнерной технологии. RoseHosting PaaS позволяет создавать и собирать приложение в виде контейнера Docker и хранить его в Docker Hub или любом другом реестре. Вы можете создать свой собственный образ Docker с помощью специального родительского шаблона RoseHosting.

Одной из наиболее важных функций RoseHosting является доступность в нескольких облаках. Он позволяет размещать контейнеры Docker в нескольких облачных вариантах (PaaS, CaaS). Jelastic поставляется с предварительно настроенным докеризированным шаблоном, который поможет вам развернуть любое решение одним щелчком мыши.

RoseHosting использует модель ценообразования на хостинг докеров с оплатой по мере использования, которая позволяет вам платить только за то, что вы используете. Цена RoseHosting основана на облачка , которые представляют собой единицы по 128 МБ ОЗУ и 400 МГц ЦП. Они будут измерять, сколько облачков потребляется в каждом контейнере, и взимать плату за это количество. Кроме того, вы можете установить предел масштабирования для облачных сервисов, чтобы случайно не нарушить свой бюджет.

Особенности

  • Автоматическое вертикальное и горизонтальное масштабирование
  • Автоматический переход в спящий режим.
  • Интуитивно понятный веб-интерфейс
  • Модель ценообразования с оплатой по факту использования
  • Быстрая настройка кластерных и высокодоступных приложений.
  • Развертывание без простоев с автоматическим распределением трафика.

Ссылка на веб-сайт: www.RoseHosting.com

4. Хостинг A2

Хостинг A2 также предоставляет платформу для размещения контейнерного приложения в контейнере Docker. Хостинг контейнеров Docker от A2 — лучший, самый быстрый, простой и надежный. Он предоставляет индивидуальный план размещения вашего приложения с помощью Docker. Вы можете выбрать ОЗУ, ЦП и хранилище в соответствии с вашими потребностями, и вы платите только за те ресурсы, которые вам нужны.

Особенности
  • до 20 раз быстрее турбо-серверы
  • 99,9% Обязательство по работе с работой
  • HURU Support
  • Гарантия Money

. 5.0005.

HostPresto — первый в Великобритании провайдер хостинга докеров, предлагающий сверхбыстрое облако для размещения контейнера. Он позволяет запускать контейнеры Docker из Docker Hub, GitHub или использовать собственный образ. Вы можете развернуть все свои приложения, такие как WordPress, NextCloud, Node Web App или ELK Stack, всего за несколько кликов.

Функции
  • 30-дневная гарантия возврата денег
  • Простой пользовательский интерфейс для создания, адаптации и запуска
  • Надежное и быстрое развертывание контейнеров
  • Полное автоматическое управление сетью для общедоступного и частного трафика 30 Комплексная балансировка нагрузки 80039
  • Мониторинг и метрические данные

Ссылка на веб-сайт:  www.hostpresto.com

6. Vultr

Vultr предлагает дешевую, надежную и лучшую платформу хостинга Docker с развертыванием Docker одним щелчком мыши. Их дата-центры расположены в 17 местах по всему миру. Он предоставляет простую в использовании панель управления и API, которые помогают вам управлять вашим приложением.

Особенности

  • Развертывание одного щелчка
  • Мощная панель управления
  • Комплексный мониторинг и метрические данные
  • 99,9% Uptime

ПРИМЕЧАНИЕ: Вы можете создать Account Antry

. реферальная ссылка  , чтобы получить $50 бесплатного кредита.

Ссылка на сайт: www.vultr.com

7. DigitalOcean

DigitalOcean позволяет быстро создавать, развертывать и масштабировать приложения с помощью Docker. Он предоставляет предварительно созданный образ контейнера, и Платформа приложений развернет его для вас. Вам не нужно беспокоиться об установке Docker. Вы также можете выбрать «1-Click App Marketplace», который поможет вам установить Docker на Droplets одним нажатием кнопки.

Функции
  • Простой в использовании API
  • Соглашение об уровне обслуживания 99,99% безотказной работы
  • Мониторинг и оповещение
  • Корпоративные твердотельные накопители
  • Глобальные центры обработки данных

Примечание: Вы можете создать учетную запись по адресу DigitalOcean по моей реферальной ссылке , чтобы получить $100 бесплатного кредита.

Ссылка на веб-сайт: www.digitalocean.com

8. Appfleet

Appfleet — это облачная платформа контейнерного хостинга, позволяющая развертывать код на любом языке, в любой среде или технологии. Это позволяет вам легко развертывать и размещать контейнеры Docker в нескольких регионах по всему миру. Размещайте свои контейнерные веб-приложения на периферии без каких-либо ограничений!

Features
  • Money-Back Guarantee
  • Globally Load-Balanced
  • Global traffic router
  • Github integration
  • Public & private registries
  • Console access

Pricing

Appfleet’s basic prices start at 10  долларов США в месяц за 1 ядро ​​ЦП, 1 ГБ ОЗУ и 20 ГБ SSD-накопителя. Вы можете дойти до 640 долларов в месяц за 16 ядер ЦП, 64 ГБ ОЗУ и 1,2 ТБ SSD-накопителя. Все планы включают мониторинг кластера, настраиваемые проверки работоспособности, доступ к API и интеграцию с GitHub.

Ссылка на веб-сайт: http://www.appfleet.com/

Заключение

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

Как выполнить развертывание на удаленных хостах Docker с помощью docker-compose

Инструмент docker-compose довольно популярен для запуска докеризированных приложений в локальной среде разработки. Все, что нам нужно сделать, это написать файл Compose, содержащий конфигурацию служб приложения, и иметь работающий механизм Docker для развертывания. Отсюда мы можем запустить приложение локально за несколько секунд с помощью одного команда `docker-compose up` .

Это был первоначальный объем, но…

Поскольку разработчики хотят иметь такую ​​же простоту развертывания в конвейерах/производственных средах CI, как и в своей среде разработки, сегодня мы обнаруживаем, что docker-compose используется по-разному и выходит за рамки первоначального объем. В таких случаях проблема заключается в том, что docker-compose обеспечивает поддержку работы на удаленных механизмах Docker за счет использования переменной среды DOCKER_HOST и -H, –host 9.0316 параметр командной строки. Это не очень удобно для пользователя, и управление развертыванием приложений Compose в нескольких средах становится бременем.

Чтобы решить эту проблему, мы полагаемся на контексты Docker для безопасного развертывания приложений Compose в различных средах и легкого управления ими с нашего локального хоста. Цель этого поста — показать, как использовать контексты для выбора разных сред для развертывания и легко переключаться между ними.

Мы начнем с определения примера приложения для использования в этом упражнении, а затем покажем, как его развернуть на локальном хосте. Далее мы рассмотрим контекст Docker и информацию, которую он содержит, чтобы мы могли безопасно подключаться к удаленным механизмам Docker. Наконец, мы попробуем использовать контексты Docker с docker-compose для развертывания на удаленных механизмах.

Прежде чем продолжить, docker и docker-compose должны быть установлены на локальном хосте. Docker Engine и Compose включены в Docker Desktop для Windows и macOS. Для Linux вам понадобится Docker Engine и docker-compose. Убедитесь, что вы получаете docker-compose с функцией контекстной поддержки. Это доступно, начиная с версии 1.26.0-rc2 docker-compose.

Образец приложения Compose

Определим файл Compose, описывающий приложение, состоящее из двух сервисов: frontend и backend. Служба внешнего интерфейса будет запускать прокси-сервер nginx, который будет перенаправлять HTTP-запросы на простой сервер приложений Go.

Образец со всеми необходимыми файлами для этого упражнения можно загрузить отсюда или вместо него можно использовать любой другой образец из репозитория образцов Compose.

Структуру проекта и файл Compose можно найти ниже:

$ tree hello-docker
hello-docker
├── backend
│ ├── Dockerfile
│ │ ─4─9 main docker-compose.yml
└── frontend
├── Dockerfile
└── nginx.conf

docker-compose.yml

version: "3.6"
services:
  frontend:
    build: frontend   
    ports:
    - 8080:80
    depends_on:
    - backend
  backend:
    build: backend

Running on localhost

Чтобы развернуть приложение, которое мы определили ранее, перейдите в каталог проекта и запустите docker-compose:

$ cd hello-docker/
$ docker-compose up -d
Создание сети «hello-docker_default» со значением по умолчанию водитель
Создание hello-docker_backend_1 . .. выполнено
Создание hello-docker_frontend_1     ... выполнено

Убедитесь, что все контейнеры запущены и порт 80 внешнего сервисного контейнера сопоставлен с портом 8080 локального хоста, как описано в docker-compose .yml.

$ Docker PS
Идентификационный идентификатор контейнер.0343 0.0.0.0:8080->80/tcp hello-docker_frontend_1
48cdf1b8417c hello-docker_backend "/usr/local/bin/back ..." 6 секунд назад 5 секунд Hello-Docker_backend_1

Query The Web Service порт 8080, чтобы получить приветственное сообщение от серверной части go.

$ curl localhost:8080
          ##         .
    ## ## ##        ==
## ## ## ## ##     ===
/""""""""""""""""\___/ ===
{ / ===-
\______ O           __/
 \    \         __/
  \____\_______/
Привет от Docker!

Запуск на удаленном хосте

Удаленный хост Docker — это машина внутри или за пределами нашей локальной сети, на которой работает Docker Engine и открытые порты для запросов API Engine.

Пример приложения можно развернуть на удаленном узле несколькими способами. Предположим, у нас есть SSH-доступ к удаленному хосту докера с аутентификацией на основе ключа, чтобы избежать запроса пароля при развертывании приложения.

Есть три способа развернуть его на удаленном хосте:

1. Развертывание вручную путем копирования файлов проекта, установки docker-compose и его запуска compose.yml

, установите docker-compose на целевую машину, где мы хотим развернуть приложение для создания композиций, и, наконец, запустите его.

$ scp -r hello-docker [электронная почта защищена]:/path/to/src
$ ssh [электронная почта защищена]
$ pip install docker-compose
$ cd /path/to/src/hello-docker
$ docker-compose up -d

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

2. Использование переменной среды DOCKER_HOST для настройки целевого механизма

В этом упражнении мы используем сценарий переменной среды DOCKER_HOST для целевых хостов Docker, но того же можно добиться, передав -H, –host аргумент для docker-compose.

$ cd hello-docker
$ DOCKER_HOST=»ssh://[email protected]» docker-compose up -d

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

3. Использование контекстов docker 

$ docker context ls
ИМЯ   ОПИСАНИЕ   DOCKER ENDPOINT   KUBERNETES ENDPOINT   ORCHESTRATOR

remote                                 

remote                          
$ cd hello-docker
$ docker-compose —context remote up -d

Контексты Docker – это эффективный способ автоматического переключения между различными целями развертывания. Мы обсудим контексты в следующем разделе, чтобы понять, как Docker Contexts можно использовать с композицией для облегчения/ускорения развертывания.

Контексты Docker

Контекст Docker — это механизм предоставления имен конечным точкам API Docker и сохранения этой информации для последующего использования. Контекстами Docker можно легко управлять с помощью интерфейса командной строки Docker, как показано в документации.

Создание и использование контекста для целевого удаленного хоста

Чтобы упростить доступ к удаленному хосту с помощью клиента Docker, мы сначала создадим контекст, который будет содержать путь подключения к нему.

$ Docker Context Context создание удаленного — Docker «host = ssh: // [электронная почта защищена]»
Удаленный
Успешно созданный контекст «Удаленный»

$ Docker Context LS
Имя Docker Endpoint Kubernetes endpoint Orchestrator
*Current Docker_hhost …   unix:///var/run/docker.sock                swarm
remote                          ssh://[email protected]

Убедитесь, что мы установили аутентификацию на основе ключа для SSH-соединения с удаленным хостом. Как только это будет сделано, мы можем перечислить контейнеры на удаленном хосте, передав имя контекста в качестве аргумента.

$ docker ‐-context remote ps
ИДЕНТИФИКАТОР КОНТЕЙНЕРА    ИЗОБРАЖЕНИЕ   КОМАНДА   СОЗДАН   СТАТУС   ИМЯ

Мы также можем установить «удаленный» контекст в качестве контекста по умолчанию для наших команд docker. Это позволит нам запускать все команды Docker непосредственно на удаленном хосте, не передавая аргумент контекста для каждой команды.

$ Docker Context Используйте удаленное
Удаленный
Текущий контекст теперь является «удаленным»
$ Docker Context LS
Имя Описание Docker Endpoint Kubernetes Endpoint Orchestrator
Default Docker_host… Unix: //var/run/docker.sock Swarm
434343434343434343434343434343434343434343443434434434343443434434344343443434434344343443 *                         ssh://[email protected]

Использование контекста docker-compose

Последний выпуск docker-compose теперь поддерживает использование контекстов для доступа к конечным точкам Docker API. Это означает, что мы можем запустить docker-compose и указать контекст «удаленный», чтобы автоматически нацеливаться на удаленный хост. Если контекст не указан, docker-compose будет использовать текущий контекст так же, как Docker CLI.

$ docker-compose —context remote up -d
/tmp/_MEI4HXgSK/paramiko/client. py:837: UserWarning: Неизвестный ключ хоста ssh-ed25519 для 10.0.0.52: b’047f5071513cab8c00d7944ef9d5d1fd «Создание сети 9034-4d1fd» docker_default ”с драйвером по умолчанию
Создание Hello-docker_backend_1… Готово
Создание Hello-Docker_frontend_1… Готово

$ Docker0343 ddbb380635aa   hello-docker_frontend  «nginx -g ‘daemon of…»  24 секунды назад
  Up 23 секунды   0.0.0.0:8080->80/tcp   hello-docker_web_1
872c6a55316f/bin/usrbackend/loc/hello-docker_backend… 25 секунд назад
  Up 24 секунды                          hello-docker_backend_1

Составление развертываний для нескольких целей

У многих разработчиков может быть несколько сред разработки/тестирования, между которыми им необходимо переключаться. Развертывание всего этого теперь не требует усилий благодаря использованию контекстов в docker-compose.

Теперь мы пытаемся осуществить переключение контекста между несколькими движками Docker. Для этого мы определяем три цели:

  • Локальный хост с локальным механизмом Docker
  • Удаленный хост, доступный через ssh
  • Контейнер Docker-in-Docker, выступающий в роли другого удаленного хоста

В таблице ниже показано сопоставление контекстов для целей докера:

Целевая среда Имя контекста API endpoint
localhost default unix:///var/run/docker. sock
Remote host remote ssh://[email protected]
docker-in-docker dind tcp://127.0.0.1:2375

-d -p «2375:2375» – привилегированный -e «DOCKER_TLS_CERTDIR=» – имя dind docker:19.03.3-dind
ed92bc991bade2d41cab08b8c070c70b788d8ecf9dffc89e8c6379187aed9cdc
$ docker ps
CONTAINER ID   IMAGE                COMMAND                 CREATED         STATUS
  PORTS                                 NAMES
ed92bc991bad   docker:19.03.3-dind  “dockerd-entrypoint.…”  17 seconds ago  Up 15 seconds
  0.0.0.0:2375-> 2375/tcp, 2376/tcp      dind

Создайте новый контекст ‘dind’ для удобного нацеливания на контейнер:

$ docker context create dind ‐docker «host=tcp://127.0.0.1:2375» ‐‐default- стек-оркестратор рой
dind
Успешно создан контекст «dind»

$ docker context ls
ИМЯ       ОПИСАНИЕ
Docker Endpoint Kubernetes Endpoint Orchestrator
по умолчанию * Current Docker_host… Unix: //var/run/docker. sock Swarm
Удаленный SSH: // [Электронная почта защищена] Swarm

Мы теперь можем нацелиться на любую среду, чтобы развернуть нанесение компенсации. с локального хоста.

$ использование контекста докера
dind
Текущий контекст теперь «dind»

$ docker-compose up -d
Создание сети «hello-docker_default» с драйвером по умолчанию
Создание hello-docker_backend_1 … выполнено
Создание hello-docker_frontend_1 … выполнено

$ docker ps
Команда Image Container Command создала
Порты состояния имена
951784341A0D Hello -Docker_Frontend «Nginx -g ‘Daemon of…» 34 секунды назад
Вверх 33 секунды 0.0.0.0:8080->80/TCP Hello-Docker_frontend_1
872C6A55316F Hello-Docker_backend «/usr/loc По умолчанию PS
Команда идентификатора контейнера создана
Порты состояния имена
ED92BC991BAD Docker: 19.03.3-DIND «Dockerd-Enterpoint…». 28 минут назад
    Up 28 минут   0.0.0.0:2375->2375/tcp, 2376/tcp   dind

$ docker-compose —context remote up -d
/tmp/_MEIb4sAgX/paramiko/client. py:837: UserWarning: Unknown ssh -ed25519 ключ хоста для 10.0.0.52: b’047f5071513cab8c00d7944ef9d5d1fd’
Создание сети «hello-docker_default» с драйвером по умолчанию
Создание hello-docker_backend_1 … выполнено
Создание hello-docker_frontend_1 … выполнено 9033 default docker 9033 default 9043 default 9043 default

контекст теперь «по умолчанию»

$ docker-compose-up -d
Создание сети «Hello-docker_default» с драйвером по умолчанию
Создание hello-docker_backend_1… Готово
Создание Hello-Docker_frontend_1… DED

$ Docker PS
Container Command Comum
077b5e5b72e8   hello-docker_frontend  «nginx -g ‘daemon of…»  Около минуты назад
  Примерно минуту назад   0.0.0.0:8080->80/tcp                       hello-docker_frontend_1
FC01878AD14E Hello-Docker_backend «/usr/local/bin/back…» около минуты назад
до около минуты Hello-Docker_backend_1
ED92BC991BAD Docker: 19.03.3-Dind «Dockerd-IntryPoint…». 34 минуты назад
  Up 34 минуты       0.

This entry was posted in Популярное