Швидке знайомство з Docker-контейнерами для Django-розробника


Розробка такого проекту як CloverR передбачає використання різних сервісів, нетипових для звичайного ноутбука, навіть якщо це ноутбук розробника. Postgresql, Redis, Celery і так далі. Бажання створити комфортне середовище розробки і тестування привело нас до необхідності використання якоїсь системи віртуалізації/ізоляції. Як варіант — деякий час використовувався Vagrant, але це все-таки ovrerhead і наші пошуки оптимального способу привели, на даний момент, до Docker.

Docker — платформа для запуску додатків в ізольованих контейнерах. Використання контейнерів в Linux дозволяє програмного забезпечення бути ізольованим від базової системи. На відміну від Virtualbox, виключаються системні витрати (overhead), необхідні для віртуалізації обладнання. Docker може допомогти в розробці та розгортання веб-додатків і сервісів. Давайте подивимося, як це відбувається.

Навіщо мені потрібен Docker?
Docker може бути використаний різними способами. Він може забезпечувати роботу сервісів у фоновому режимі, наприклад, PostgreSQL заданої версії. У docker може бути поміщено наше додаток (dockerizing application) і таким чином ми можемо використати образи подібних контейнерів для розгортання нашого додатка на продакшені.

Для python-розробників Docker може бути описаний як virtualenv для будь-якого додатка. Це може бути як Python-інтерпретатор так і який-небудь сервер. Це дуже зручно, коли ви хочете протестувати нові версії або бажаєте запустити застарілі програми на вашому сервері.

Установка Docker
Docker доступний в репозиторіях в різних Linux дистибутивах. OSX і MS Windows користувачі можуть використовувати VirtualBox, на якому встановлена система Linux для того, щоб запустити Docker.

Для встановлення останньої версії я використовую PPA для Ubuntu. Коли Docker встановлений, ви можете додати себе в групу «docker» для того, щоб надалі не требовлось використовувати sudo.

Перші контейнери
Коли Docker готовий, ми можемо запустити безліч контейнерів з registry.hub.docker.com, наприклад Python. Для запуску цього контейнера, просто виконайте:
docker run-it --rm python:3.4


Для початку запущений Docker скачає кілька файлів. Коли процес завершиться, ми отримаємо дефолтну консоль Python-інтерпретатора. Команда -it запускає контейнер в інтерактивному режимі і прив'язує її до консолі для взаємодії. --rm видалить поточний контейнер після виходу. «Python» — це назва оригіналу для контейнера. Після ":" ми бачимо тег, який зазвичай показує версію — в цьому випадку версія Python у контейнері.

Ми також можемо змінити поведінку контейнера, наприклад запустити власний скрипт. Для використання команди з командного рядка просто додайте наступне:

docker run-it --rm python:3.4 ls


Коли наш контейнер буде запущений, всередині нього запуститься команда «ls», яка покаже всі файли і фільтри у головній директорії.

Dockerfile
Файл Dockerfile містить «рецепт приготування» нашого контейнера. Якщо ми хочемо запустити скрипт на Python, ось що ми повинні написати:

FROM python:3.4
ADD ./test.py /
RUN ls-al
CMD python test.py


FROM вказує на базовий контейнер, в даному випадку — спосіб Python 3.4. Далі ми можемо використовувати ADD, RUN, ENV команди для конфігурації контейнера. RUN команда буде виконувати завдання, коли контейнер побудований. Команда CMD виконається на початку запуску контейнера. Операції побудови образів кешуються і пропускає наступні версії (RUN команда з прикладу запустить побудови першого білду, але не другого).

У терміналі ми можемо написати наступне:

docker build --tag=foo .
docker run-it --rm foo


Dockerfile на Django
django-ckeditor містить демонстраційне додаток, яке може бути запущено через manage.py і runserver. Спробуємо зробити Dockfile, який створить образ цього додатка:

FROM python:3.4
MAINTAINER Piotr Maliński <riklaunim@gmail.com>
ADD . /ckeditor
ENV DJANGO_SETTINGS_MODULE ckeditor_demo.settings
RUN pip install-r /ckeditor/ckeditor_demo_requirements.txt
RUN pip install /ckeditor
RUN python /ckeditor/manage.py validate
RUN python /ckeditor/manage.py collectstatic --noinput
CMD python /ckeditor/manage.py runserver 0.0.0.0:8080


Я використовую тут Python 3.4. Весь код з репозиторію буде доданий у папку «ckeditor» контейнера. Я також встановлюю DJANGO_SETTINGS_MODULE змінну оточення, додаю залежності і власне редактор. Далі валідація, збір статики і в кінці CMD для запуску сервера. Також зручно зробити сервер доступним зовні контейнера, для цього ми запускаємо його на 0.0.0.0 IP

dockebuild --tag=django-ckeditor .
dockerun-it --rm --publish=192.168.0.110:8080:8080 django-ckeditor


Опція--publish дозволяє зіставити (mapping) публічний IP/Port адреси із занедбаного локального контейнера з локальним. У цьому прикладі 192.168.0.110 це порт хоста. Публічний порт може бути доступний через 8080 з мого localhost. Без опції publish сервер буде доступний тільки з запущено IP адреси контейнера.
Конфігурація Dockerfile, яку я показав не ідеальна і буде працювати тільки з SQLite бази даних. Docker дозволяє запускати різні сервіси в різних контейнерах. Наприклад, давайте спробуємо, використовувати PostgreSQL базу даних у другому контейнері.
Так давайте запустимо примірник PostgreSQL:

docker run-d postgres:9.4


Конетйнер запускається у фоновому режимі, і ми можемо перевірити його статус і назву командою docker ps. Назви за замовчуванням задаються випадкові, наприклад «clever_ptolemy». Зараз ми створили базу даних на сервері, але спочатку нам потрібен IP-адресу. Ми можемо отримати його з docker inspect INSTANCE_NAME, яка покаже список змінних в контейнері, включаючи IP-адресу. Далі ми можемо створити базу даних:

createdb-h IP_ADDRESS DATABASE_NAME-U postgres


База даних створена і зараз ми можемо налаштувати її в контейнері додатка. Докер дозволяє зробити це, використовуючи змінні оточення. Для Django dj_database_url:
from import os environ

import dj_database_url

DATABASES = {'default': dj_database_url.parse(environ.get('DATABASE', 'postgres:///'))}


Тепер ми повинні передати env змінну з ім'ям бази даних в контейнер щоб змусити його працювати. Це може бути зробити так:

docker run-it --rm --link=POSTGRES_INSTANCE_NAME:OUR_NAME-e DATABASE=postgres://postgres@OUR_NAME/DATABASE_NAME --publish=192.168.0.110:8080:8080 django-ckeditor


Ім'я екземпляра бази даних ми можемо отримати виконавши команду «docker ps» в консолі. «OUR_NAME» це ярлик, який ми можемо використовувати пізніше-e значенні. У моєму випадку це виглядало так:

docker run-it --rm --link=clever_ptolemy:db-e DATABASE=postgres://postgres@db/ckeditor --publish=192.168.0.110:8080:8080 django-ckeditor python /ckeditor/manage.py syncdb 
docker run-it --rm --link=clever_ptolemy:db-e DATABASE=postgres://postgres@db/ckeditor --publish=192.168.0.110:8080:8080 django-ckeditor


Першою виконується команда syncdb, вона створить таблиці в базі даних. Далі запускається development сервер.

Інструмент Fig
Вищеописаний простий приклад вимагає безліч назв і лінків. Для того, щоб зробити процес простіше, є кілька інструментів типу fig. В YAML(fig.yml) файлі ми можемо вказати всі кроки і лінки, які потрібні:

ckeditor:
build: .
command: python /ckeditor/manage.py runserver 0.0.0.0:8080
links:
- db
ports:
- "8080:8080"
db:
image: postgres:9.4


Далі ми можемо зібрати командою fig build і запустити c fig up, яка покаже роботу додатка. У нас є кілька табличок і ми можемо запустити syncdb і для допомоги fig run COMMAND NAME, де Ім'я-це ім'я екземпляра fig.yml. Коли fig запустився, то ви можете перевірити список контейнерів командою «docker ps»

Ви можете прочитати більше про fig.yml syntax на сторінці програми. Також є Django-підручник, в якому наданий інший спосіб налаштування Postgres.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.