DevOps инженер в компании Островок.ру • 10 лет в индустрии веб-разработки из них 5 лет в Островке • Основной язык разработки – Python • Опыт работы с Докером – 2 года • Докеризировал около 50 прод-приложений, из них 80% были на Python • В Островке ответственный за кучу терабайт фоток и географию, а также за докеризацию приложений и подготовку их к выкладке в продакшен 2
сборки/запуска контейнеров ◦ Актуальные инструкции для всех ОС https://docs.docker.com/engine/installation/ ◦ Ванлайнер для любого Линукса curl -sSL https://get.docker.com/ | sh • Docker Compose ◦ Инструмент для запуска многоконтейнерных приложений с удобным конфигом в формате yaml. Можно трактовать как обертку вокруг docker cli ◦ Актуальные инструкции для всех ОС https://docs.docker.com/compose/install/ ◦ Всегда можно поставить как pip install docker-compose • Docker Machine ◦ Утилита для провиженинга удаленных докер-хостов, также удобна для создания локального докер-хоста для Mac OS X и Windows, используя virtualbox driver ◦ Актуальные инструкции для всех ОС https://docs.docker.com/machine/ 5
автоматизации деплоя приложения в среде виртуализации на уровне ОС (в виде контейнеров) • Docker-контейнеры содержат внутри себя все, что нужно для запуска приложения: библиотеки, системные утилиты и, конечно, ваш код • Доставляя свое приложекие в контейнерах вы гарантируете окружение, в котором оно будет запущено, и имеете возможность отлаживать его у себя локально в том же виде, как оно работает в продакшене • Важно понимать, что Docker – это НЕ замена LXC или Hypervisor, это инструмент для доставки вашего приложения 7
прописывая инструкции в Dockerfile (ставим нужный софт, копируем файлы) • Docker использует файловую систему, которая позволяют писать образ слоями (напрмер AUFS) и позволяет ускорять сборку образов и запуск контейнеров • Каждая инструкция в Dockerfile – это отдельный слой. Есть правила кэширования этих слоев (это ускоряет сборку) 8
релиз a. Собираем образ (локально или на CI) b. Пушим образ в репозиторий с указанием тэга (версии) 3. Доставляем a. Пулим образ нужной версии на прод-хосте b. Останавливаем и удаляем старый контейнер c. Запускаем контейнер из нового образа 4. Если что-то пошло не так a. Останавливаем и удаляем текущий контейнер b. Запускаем контейнер для той версии образа, на которой все работало 10
данные, используйте volumes или внешние хранилища, например S3 (в зависимости от задачи) • В примерах в документации вы встретите команду docker commit, она не нужна, все что нужно прописывайте в Dockerfile 11
demo • Мы пишем на Python 3 • Статику (css, js, img) раздаем из того же контейнера • Мы не думаем о HTTPS, так как за нас это делает абстрактный фронтэнд (например: nginx, haproxy, hipache или AWS ELB) • Мы пока не думаем о логах и мониторинге, это отдельная тема 13
количество слоев и ускорит push/pull образа • Удаляйте все что не нужно было только для билда сразу в том же шаге, это уменьшит размер образа • Мы устанавливаем и в этом же слое удаляем пакеты build-essential и python3-dev для уменьшения размера образа. Если вам надо будет поставить питонячий пакет требующий сборки, сделайте это либо там же где я ставлю circus, либо не удаляйте билдовые зависимости. • Установку системный зависимостей делаем отдельным шагом, чтобы он закэшировался и последуящая сборка проходила на много быстрее 16
нет необходимости создавать virtualenv для своих зависимостей, можно делать установку прямо в системный python COPY requirements.txt /opt/demo/app/ RUN pip3 install --no-cache-dir -r /opt/demo/app/requirements.txt Шаг с установкой зависимостей мы также сделали отдельным слоем, чтобы он закэшировался, так же как и шаг с системными зависимостями. При таком подходе время сборки контейнера будет занимать только копирование исходников и сборка статики. 17
DSN можно с помощью библиотеки dj_database_url DATABASES = { 'default': dj_database_url.config( env='DATABASE_URL', default='postgres://localhost/demo')} Тоже самое с каталогом, куда будет писать manage.py collectstatic STATIC_ROOT = os.getenv('STATIC_ROOT') 23
образа. По- умолчанию build ищет Dockerfile в текущей директории, но можно указать и полный путь. Контекстом для сборки является указанная директория, ссылка или поток docker build -t demo . Подробнее про сборку читайте в документации https://docs.docker.com/engine/reference/builder/ https://docs.docker.com/engine/reference/commandline/build/ 25
чтобы запустить контейнер локально, но для того чтобы запустить его на другои хосте, надо запушить его в репозиторий. Сначала надо проставить образу правильное имя с которым мы будет записывать его в репозиторий docker tag demo myrepo/demo:0.1.2 Затем надо залогиниться (еще это еще ни разу не делали) и пушить docker login --username=myuser [email protected] docker push myrepo/demo:0.1.2 26
Если мы это делаем не там, где собирали, то предварительно образ надо спулить docker pull myrepo/demo:0.1.2 docker run --name=web -p 80:80 -d myrepo/demo:0.1.2 В итоге, на хосте будет образ с именем myrepo/demo:0.1.2 и запущенный контейнер с именем web и опубликованым 80 портом. В запущенном контейнере можно исполнять команды с момощью exec docker exec web ps auxwf docker exec -it web bash 27
и стартуем контейнеры, описанные в docker-compose.yml docker-compose up -d База свежая, на нее надо накатить все миграции docker exec -it web /opt/demo/app/manage.py migrate 30
Hub https://hub.docker.com/ • Amazon предоставляет свой Registry (но он доступен не во всех регионах) https://aws.amazon.com/ecr/ • Google не отстает https://cloud.google.com/container-registry/ • А вообще довольно просто поднять свой Docker Registry https://cloud. google.com/container-registry/ ◦ Не забывайте про TLS ◦ Храните данные на Amazon S3, а не локально 32
воспользоваться тем же docker- compose (больше профита в комбинации с Docker Machine) • Если требуется релизить более, чем на один хост, пишите скрипт для автоматизации (например на Ansible) • Есть официальные решения для релиза большого кластера контейнеров ◦ Docker Swarm https://docs.docker.com/swarm/ ◦ Docker Universal Control Plane https://docs.docker.com/ucp/ • Есть также популярные большие софтины ◦ Google Kubernetes http://kubernetes.io/ ◦ Apache Mesos http://mesos.apache.org/ 33
SEM teams • Go Developers for Backend and APIs teams • Analyst Developer (Graph Theory) • Android and iOS Developer 35 • More positions at https://jobs. lever.co/ostrovok.ru • Email your resume hr@ostrovok. ru