Просто хочу скачать. Обязательные для изучения материалы
Скачать 1.7 Mb.
|
|
Дело | Описание |
{{ item.task }} | {{ item.description }} |
Для работы с MongoDB нашему приложению необходима библиотека pymongo, которую необходимо добавить в качестве зависимостей следующим образом.
$ source venv/bin/activate
$ pip install pymongo
$ pip freeze > my_flask_app/requirements.txt
Обновление docker-compose.yml
В уже существующий docker-compose.yml необходимо добавить новый сервис mongodb, запускающийся из образа mongo версии 3.2, а также обновить сервис web, добавив параметр links, указывающий на сервис mongodb, чтобы контейнер web знал о контейнере mongodb после запуска.
$ cat docker-compose.yml web:
build: ./my_flask_app ports:
- "5000:5000"
volumes:
- ./my_flask_app:/app links:
- mongodb mongodb:
image: mongo:3.2
Параметр links — это инструкция для Docker, которая заставит его обновить файл /etc/hosts контейнера web, внеся туда информацию об IP-адресе контейнера mongodb.
Сборка и запуск обновленного Flask приложения
Обновите ваше приложение командой
$ docker-compose up -d --build
После успешного выполнения этой команды в браузере по адресу http://192.168.99.100:5000/ будет запущено ваше приложение, состоящее уже из двух контейнеров: web с простым Flask приложением и
mongodb с СУБД.
Заключение
Использование Docker Compose позволяет существенно сократить время, затрачиваемое на разработку, обновление и сопровождение ваших приложений. В следующих статьях я расскажу о том, как масштабировать ваше приложение.
Использование Swarm secrets в Docker Compose
-
Андрей Максимов
0 комментариев
Как уже упоминалось в статье
Docker Secrets — безопасное хранилище для чувствительных данных
, у вас есть 2 способа создания «секретов» в Docker Swarm:
•
На основе содержимого файла
•
Со стандартного потока ввода-вывода
Давайте посмотрим, как использовать эту функциональность вместе с Docker Compose в docker- compose.yml файлах. Для иллюстрации примера создайте директорию docker_secrets_with_compose, в которой мы продолжим работу:
- ./my_flask_app:/app links:
- mongodb mongodb:
image: mongo:3.2
Параметр links — это инструкция для Docker, которая заставит его обновить файл /etc/hosts контейнера web, внеся туда информацию об IP-адресе контейнера mongodb.
Сборка и запуск обновленного Flask приложения
Обновите ваше приложение командой
$ docker-compose up -d --build
После успешного выполнения этой команды в браузере по адресу http://192.168.99.100:5000/ будет запущено ваше приложение, состоящее уже из двух контейнеров: web с простым Flask приложением и
mongodb с СУБД.
Заключение
Использование Docker Compose позволяет существенно сократить время, затрачиваемое на разработку, обновление и сопровождение ваших приложений. В следующих статьях я расскажу о том, как масштабировать ваше приложение.
Использование Swarm secrets в Docker Compose
-
Андрей Максимов
0 комментариев
Как уже упоминалось в статье
Docker Secrets — безопасное хранилище для чувствительных данных
, у вас есть 2 способа создания «секретов» в Docker Swarm:
•
На основе содержимого файла
•
Со стандартного потока ввода-вывода
Давайте посмотрим, как использовать эту функциональность вместе с Docker Compose в docker- compose.yml файлах. Для иллюстрации примера создайте директорию docker_secrets_with_compose, в которой мы продолжим работу:
mkdir
docker_secrets_with_compose
cd
docker_secrets_with_compose/
На основе содержимого файла
Создайте файл my_db_password_1.txt с произвольным паролем:
LC_ALL
=C < /dev/urandom
tr
-dc
'_A-Z-a-z-0-9'
|
head
-c
32 > my_db_password1.txt
Далее создайте docker-compose.yml, который предназначен для создания сервиса test с
«секретом» my_db_password1:
version
:
'3.1'
services
:
test
:
image
:
'alpine'
command
:
'cat /run/secrets/my_db_password1'
secrets
:
- my_db_password1
secrets
:
my_db_password1
:
file
:
./my_db_password.txt
Запустите ваш сервис командой:
docker stack deploy
-c docker-compose.yml my_secret_service
Проверьте содержимое лога вашего сервиса:
docker service logs my_secret_service_test
Пароль должен совпадать с содержанием файла my_db_password.txt
Со стандартного потока ввода-вывода
Для иллюстрации этого подхода создайте отдельный «секрет» my_db_password2:
LC_ALL
=C < /dev/urandom
tr
-dc
'_A-Z-a-z-0-9'
|
head
-c
32 | docker secret create my_db_password2 -
В качестве вывода команды вы получите сгенерированный и запомненный «секрет», например:
qvfvffi1nxv260e8p3v9zcnyu
Дополните содержимое файла docker-compose.yml следующим новым сервисом (test2), который будет использовать уже существующий «секрет» (все по аналогии с дисками):
version
:
'3.1'
services
:
test
:
image
:
'alpine'
command
:
'cat /run/secrets/my_db_password1'
secrets
:
- my_db_password1
test2
:
image
:
'alpine'
command
:
'cat /run/secrets/my_db_password2'
secrets
:
- my_db_password2
secrets
:
my_db_password1
:
file
:
./my_db_password.txt my_db_password2
:
external
:
true
И обновите запущенный вами сервис:
docker stack deploy
-c docker-compose.yml my_secret_service
В логе my_secret_service_test2 будет вывод вашего пароля, созданного из стандартного потока ввода-вывода:
docker service logs my_secret_service_test2
Заключение
Использование «секретов» в Docker Swarm позволяет вам не только легко и просто управляться с приватными данными внутри ваших приложений, но и разделить зоны ответственности разработчиков и администраторов ваших приложений. Если у вас появились какие-либо вопросы, с удовольствием отвечу на них в комментариях внизу страницы. Приятной работы!
Portainer: управление Docker и Swarm при
помощи Web-UI
-
Андрей Максимов
2 комментариев
Для тех из вас, кому хочется управлять вашими Docker хостами или Swarm кластерами не только из командной строки, но и полчать эстетическое удовольствие используя красивый Web-UI интерфейс, рекомендую посмотреть на
Portainer
. Portainer — это проект с открытым исходным кодом, предоставляющий вам минимальный по размеру (3 Мб) образ Web-интерфейса для управления Docker
Engine или Swarm кластером.
Основная панель
Как видно из экрана, Portainer — это отличное решение, которое позволяет не только очень наглядно предоставлять полную информацию по вашим Docker хостам и кластерам, но и эффективно управлять ими, предоставляя вам множество возможностей, вкратце о которых ниже.
:
my_db_password1
:
file
:
./my_db_password.txt my_db_password2
:
external
:
true
И обновите запущенный вами сервис:
docker stack deploy
-c docker-compose.yml my_secret_service
В логе my_secret_service_test2 будет вывод вашего пароля, созданного из стандартного потока ввода-вывода:
docker service logs my_secret_service_test2
Заключение
Использование «секретов» в Docker Swarm позволяет вам не только легко и просто управляться с приватными данными внутри ваших приложений, но и разделить зоны ответственности разработчиков и администраторов ваших приложений. Если у вас появились какие-либо вопросы, с удовольствием отвечу на них в комментариях внизу страницы. Приятной работы!
Portainer: управление Docker и Swarm при
помощи Web-UI
-
Андрей Максимов
2 комментариев
Для тех из вас, кому хочется управлять вашими Docker хостами или Swarm кластерами не только из командной строки, но и полчать эстетическое удовольствие используя красивый Web-UI интерфейс, рекомендую посмотреть на
Portainer
. Portainer — это проект с открытым исходным кодом, предоставляющий вам минимальный по размеру (3 Мб) образ Web-интерфейса для управления Docker
Engine или Swarm кластером.
Основная панель
Как видно из экрана, Portainer — это отличное решение, которое позволяет не только очень наглядно предоставлять полную информацию по вашим Docker хостам и кластерам, но и эффективно управлять ими, предоставляя вам множество возможностей, вкратце о которых ниже.
Сервисы (Services)
Если ваш Docker Engine запущен в Swarm mode, вам становится доступно меню управления сервисами
Swarm кластера. Процесс создания сервиса продемонстрирован на экране ниже. Прямо из Web-UI вы можете задать все значимые параметры сервиса:
•
Имя самого сервиса
•
Имя образа, из которого будет запущен сервис
•
Указать сторонний Docker реестр
•
Режим работы планировщика
•
Мапинг портов, дисков, сетей
•
А также метки
Контейнеры (containers)
Помимо управления службами Portainer дает возможность управлять жизненным циклом контейнеров, запущенных на вашем хосте или кластере. Интерфейс создания контейнера ничем не отличается от интерфейса создания сервиса.
Если перейти в управление конкретным контейнером, то у вас появится возможность наблюдать за потреблением ресурсов конкретного контейнера, просмотра логов, а также подключению к интерактивной консоли (да, можно зайти внутрь работающего контейнера в терминальную сессию и выполнять нужные вам команды).
Образы (Images)
Не знаю как вам, а мне кажется очень удобной возможность выделить мышкой сразу 5-6 не используемых образов, а затем удалить их в один клик.
Более того, при клике на каждый конкретный образ можно изменить его тег, получить информацию о размере, дате создания, а также информацию из Dockerfile, такую как, например: CMD, ENTRYPOINT, EXPOSE, VOLUME и переменные окружения внутри контейнера из
ENV.
Сети (Networks)
Возможностей работы с сетями в Portainer пока не очень много. В списке с сетями отображается лишь скудная информация о типе сети и ее адресации.
Диски (Volumes)
В принципе все, что можно получить из docker volume inspect удобно и наглядно отображается в едином интерфейсе, дополняя остальную функциональность.
Кластеры (Swarm)
Состав кластера, а также количество задействованных узлов и доступных в кластере ресурсов можно узнать в меню Swarm. При выборе каждого конкретного узла кластера можно очень удобно очистить его от виртуальных машин и остановить на нем аллокацию.
Подключения (Endpoints)
Portainer очень удобно использовать вместе со своей Docker Machine, чтобы иметь возможность управлять сразу всеми вашими Docker хостами и кластерами, определить очередное подключение не составит труда в соответствующем меню. Опция поддержки TLS также имеется.
Запуск
В принципе, у Portainer очень достойная документация
, но зачем же в нее ходить, если можно получить команду для запуска прямо не покидая страницу обзора?
$ docker run -d -p 9000:9000 -v /.docker/machine/certs:/certs portainer/portainer -H tcp://192.168.99.100:2376 --tlsverify
Данная команда запустит контейнер, содержащий Portainer на 9000 порту вашего Docker Engine. Я запускаю Portainer на своем ноутбуке. Флаг -v смонтирует сертификаты из моей домашней директории внутрь контейнера, чтобы предоставить мне возможность управлять любым Docker хостом или Swarm кластером, настроенным при помощи моей Docker Machine с использованием TLS аутентификации
(очень удобно, когда вы администрируете множество хостов). Флаг -H указывает на IP адрес хоста,
которым Portainer будет управлять — это нужно исключительно для формирования primary подключения (см последний скриншот).
Приятной работы!
Docker Secrets — безопасное хранилище для
чувствительных данных
-
Андрей Максимов
0 комментариев
Важнейшим элементом для построения безопасных приложений является наличие безопасного способа общения ваших контейнеров друг с другом, а также с другими приложениями и системами. А это в свою очередь первоначально требует безопасного способа управления учетными записями, токенами, паролями, ключами, а также другими видами чувствительной информации, как правило называющейся в приложении просто «секретами». Начиная с версии 1.13 в Docker начал поддерживаться безопасный способ работы с такими чувствительными данными — Docker secrets. Этот безопасный способ работы реализуется в Docker кластере, работающем в так называемом режиме Swarm mode.
В данной статье будет рассмотрена работа чувствительными данными в Docker кластере такими как ключи, пароли и т.д.
Предполагается, что у вас уже есть Docker кластер, работающий в Swarm mode. А если еще нет, вы легко можете установить его, воспользовавшись инструкциями из статьи «
Установка отказоустойчивого
Docker Swarm кластера в Облаке КРОК
«, или же вы можете обновить свой Docker Engine до версии 1.13
и переведя его в этот режим работы, чтобы посмотреть на работу технологии и не устанавливать отдельный кластер:
$ docker swarm init
План
Мы запустим в контейнере простое Flask приложение (похожее на то, что описывалось в статье
«
Упаковка простого Flask приложения в Docker контейнер
«), которое будет считывать переданный ему пароль и выводить его в ответ на http запросы. Если же «секрета» с паролем не будет, приложение будет выдаваться сообщение об ошибке.
Вы можете найти образ готового контейнера на
Docker Hub
, а код приложения
GitHub
Создание приложения
Прежде чем переходить к описанию работы с «секретами», давайте создадим демонстрационное приложение. Для этого создайте директорию docker_secrets_example:
$ mkdir docker_secrets_example
$ cd docker_secrets_example
Создайте в нем файл requirements.txt, содержащий следующую информацию:
click
==
6.7
Flask
==
0.12
itsdangerous
==
0.24
Приятной работы!
Docker Secrets — безопасное хранилище для
чувствительных данных
-
Андрей Максимов
0 комментариев
Важнейшим элементом для построения безопасных приложений является наличие безопасного способа общения ваших контейнеров друг с другом, а также с другими приложениями и системами. А это в свою очередь первоначально требует безопасного способа управления учетными записями, токенами, паролями, ключами, а также другими видами чувствительной информации, как правило называющейся в приложении просто «секретами». Начиная с версии 1.13 в Docker начал поддерживаться безопасный способ работы с такими чувствительными данными — Docker secrets. Этот безопасный способ работы реализуется в Docker кластере, работающем в так называемом режиме Swarm mode.
В данной статье будет рассмотрена работа чувствительными данными в Docker кластере такими как ключи, пароли и т.д.
Предполагается, что у вас уже есть Docker кластер, работающий в Swarm mode. А если еще нет, вы легко можете установить его, воспользовавшись инструкциями из статьи «
Установка отказоустойчивого
Docker Swarm кластера в Облаке КРОК
«, или же вы можете обновить свой Docker Engine до версии 1.13
и переведя его в этот режим работы, чтобы посмотреть на работу технологии и не устанавливать отдельный кластер:
$ docker swarm init
План
Мы запустим в контейнере простое Flask приложение (похожее на то, что описывалось в статье
«
Упаковка простого Flask приложения в Docker контейнер
«), которое будет считывать переданный ему пароль и выводить его в ответ на http запросы. Если же «секрета» с паролем не будет, приложение будет выдаваться сообщение об ошибке.
Вы можете найти образ готового контейнера на
Docker Hub
, а код приложения
GitHub
Создание приложения
Прежде чем переходить к описанию работы с «секретами», давайте создадим демонстрационное приложение. Для этого создайте директорию docker_secrets_example:
$ mkdir docker_secrets_example
$ cd docker_secrets_example
Создайте в нем файл requirements.txt, содержащий следующую информацию:
click
==
6.7
Flask
==
0.12
itsdangerous
==
0.24
Jinja2
==
2.9.5
MarkupSafe
==
0.23
Werkzeug
==
0.11.15
wheel
==
0.24.0
Создайте и активируйте виртуальное окружение, а затем установите зависимости
$ virtualenv venv
$ source venv/bin/activate
$ pip install -r requirements.txt
Создайте файл app.py, который будет содержать код нашего приложения
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from
flask
import
Flask
from
flask
import
render_template app
=
Flask(__name__)
@
app.route(
'/'
)
def
index():
try
:
db_password
=
None f
=
open
(
'/run/secrets/db-password'
,
'r'
)
db_password
=
f.
readline
()
except
IOError
:
pass
finally
:
return
render_template(
'index.html'
,
password
=
db_password)
if
__name__
==
'__main__'
:
app.run(debug
=
True
,
host
=
'0.0.0.0'
)
А также необходимо создать директорию templates и поместить внутрь файл index.html со следующим содержимым:
<
title
>
Docker secrets demo
<
/
title
>
{% if password %}
<
p
>
Your secret password:
<
strong
>
{{ password }}
<
/
strong
><
/
p
>
{% else %}
<
strong
>
No password specified!
<
/
strong
>
{% endif %}
Внутри рабочей директории создайте файл Dockerfile со следующим содержимым, чтобы иметь возможность собирать ваш Docker образ:
FROM python:2.7
MAINTAINER Andrey Maksimov 'maksimov.andrei@gmail.com'
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "app.py"]
Структура вашего приложения на текущий момент без учета виртуального окружения (venv) будет следующей:
$ tree -I venv docker_secrets_example docker_secrets_example
├── Dockerfile
├── app.py
├── requirements.txt
└── templates
└── index.html
1 directory, 4 files
Проверка работоспособности приложения
Если на текущий момент вы все сделали правильно, вы можете запустить демонстрационное приложение и проверить его работоспособность, открыв в браузере адрес :
$ python app.py
* Running on (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger pin code: 237-318-490 127.0.0.1 - - [13/Feb/2017 19:02:46] "GET / HTTP/1.1"
200 -
127.0.0.1 - - [13/Feb/2017 19:02:47] "GET /favicon.ico
HTTP/1.1" 404 -
При этом в браузере будет отображаться:
Сборка образа
После того, как приложение заработало, его необходимо упаковать в контейнер. Для этого необходимо выполнить команду:
$ docker build -t amaksimov/docker_secrets_example:v0.1 .
Для корректной работы сервисов в Docker Swarm кластере, опубликуйте ваш собранный образ в вашем репозитории:
$ docker push amaksimov/docker_secrets_example:v0.1
Важно: если этого не сделать, в процессе запуска сервиса команда docker service create будет выдавать сложно интерпретируемую ошибку.
Работа с «секретами» (Docker secrets)
После того, как демонстрационный образ создан, можно переходить непосредственно к работе с
«секретами».
Как работают секреты
«Секреты» используются Docker сервисами посредством установления явной связи между сервисом и самими секретами. Сервисы, напомню, состоят из задач (отдельных контейнеров), которые могут выполняться на любом узле в пределах вашего кластера. Если ваш сервис состоит из нескольких задач
(контейнеров), связанный с ним «секрет» будет доступен для всех задач этого сервиса.
Docker Swarm кластер использует
Raft Consensus Algorithm для того, чтобы гарантировать, что узлы, участвующие в управлении кластером, договариваются о состоянии кластера. Часть этого процесса включает в себя репликацию состояния всех управляющих узлов кластера при помощи журнала.
Реализация «секретов» в кластере, работающем в Swarm mode режиме, использует алгоритм Raft.
«Секреты» в процессе создания записываются в raft-журнал, что позволяет им реплицироваться на каждый из управляющих узлов кластера. До тех пор, пока кластер работает, журнал Raft хранится в памяти каждого управляющего узла и реплицируется в зашифрованном виде.
В процессе запуска нового сервиса в кластере, если в процессе создания ему предоставлена возможность доступа к тому или иному «секрету», происходит монтирование текстового содержимого
«секретов» в директорию /run/secrets всем задачам (контейнерам) этого сервиса.
Команда docker secret позволяет нам задать «секреты», которые могут быть использованы сервисами, запущенными в Docker Swarm кластере. Есть два способа создания «секрета».
Создание «секрета» из файла
Создайте в рабочей директории файл password.txt который будет содержать секретную информацию, например, пароль к базе данных this-is-my-super-secret-password. Чтобы дать возможность вашим приложениям использовать этот секретный пароль, выполните коману:
$ docker secret create db-password password.txt
Эта команда создаст «секрет» с именем db-password, используя содержимое файла password.txt
Создание «секрета» со стандартных потоков ввода\вывода
Также вы можете создавать «секреты», используя информацию со стандартного потока ввода\вывода:
$ LC_ALL=C < /dev/urandom tr -dc '_A-Z-a-z-0-9' | head -c 32 | docker secret create db-password -
Эта команда также создаст «секрет» db-password, но уже используя сгенерированную информацию из /dev/urandom.
Просмотр «секретов» кластера
Все созданные в кластере секреты могут быть просмотрены при помощи команды:
$ docker secret ls
ID NAME CREATED
UPDATED
iokqhuhj7ix9a57joiarivv8n db-password 3 hours ago 3 hours ago
Удаление «секретов» из кластера
Удаление «секретов» также осуществляется достаточно просто:
$ docker secret rm db-password
Управление сервисом с «секретом»
Запуск
Для того, чтобы запустить ваш сервис и передать ему информацию о «секрете», необходимо выполнить команду:
$ docker service create --name docker_secrets_example -p 5000:5000
--secret db-password amaksimov/docker_secrets_example:v0.1
После чего можно будет убедиться в том, что ваше приложение прочитало файл с секретом:
Если же запустить ваш сервис без указания ключа —secret, например, командой:
$ docker service create --name docker_secrets_example -p 5000:5000 amaksimov/docker_secrets_example:v0.1
То, как и ожидается, ваше приложение об этом сразу же сообщит: