Docker

План

  1. Что такое докер и для чего это нужно
  2. Отличия докера от вагранта
  3. Практическое применение
    1. первые шаги
    2. запускаем кирпичи в докере

Что такое докер и для чего это нужно

Определение

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

Переводим

Докер разделяет ядро ОС на все контейнеры (Docker container), работающие как отдельные процессы.

Отличия докера от вагранта

Вагрант

  • медленная загрузка;
  • возможная плата за предоставление дополнительного пространства;
  • не все виртуальные машины (VM) поддерживают совместимое использование;
  • поддерживающие VM часто требуют сложной настройки;
  • образ может быть слишком большим, так как «дополнительная ОС» добавляет гигабайт пространства в проект поверх операционной системы, а в большинстве случаев на сервер ставится несколько VM, которые занимают еще больше места.

Докер

Контейнеры используют другой подход: они предоставляют схожий с виртуальными машинами уровень изоляции, но благодаря правильному задействованию низкоуровневых механизмов основной операционной системы делают это с в разы меньшей нагрузкой. Докер предоставил стандартный API, который сильно упростил создание и использование контейнеров, и позволил сообществу вместе работать над библиотеками по работе с контейнерами.

Преимущества

  • Ускоренный процесс разработки. Нет необходимости устанавливать вспомогательные инструменты вроде PostgreSQL, Redis, Elasticsearch: их можно запускать в контейнерах.
  • Удобная инкапсуляция приложений.
  • Понятный мониторинг.
  • Простое масштабирование

Практика

Терминология

  • Images (образы) - Схемы нашего приложения, которые являются основой контейнеров. В примере выше мы используем команду docker pull чтобы скачать образ.

  • Containers (контейнеры) - Создаются на основе образа и запускают само приложение. Мы создадим контейнер командой docker run, и используем образ, скачанный ранее. Список запущенных контейнеров можно увидеть с помощью команды docker ps.

  • Docker Daemon (демон Докера) - Фоновый сервис, запущенный на хост-машине, который отвечает за создание, запуск и уничтожение Докер-контейнеров. Демон — это процесс, который запущен на операционной системе, с которой взаимодействует клиент.

  • Docker Client (клиент Докера) - Утилита командной строки, которая позволяет пользователю взаимодействовать с демоном. Существуют другие формы клиента, например, Kitematic, с графическим интерфейсом.

  • Docker Hub - Регистр Докер-образов. Грубо говоря, архив всех доступных образов. Если нужно, то можно содержать собственный регистр и использовать его для получения образов.

Первые шаги

Играемся

Установка Докер пропущена - по соответствуующей ОС инструкции.

docker run ubuntu /bin/echo 'Hello world'
  • docker run
  • ubuntu
  • /bin/echo 'Hello world'
docker run -it --rm ubuntu /bin/bash
  • -it
  • --rm
docker ps -a 
docker rm -f $(docker ps -aq)

Сделаем что-нибудь более полезное

docker run -d --name test-nginx -p 90:90 -v $(pwd):/usr/share/nginx/html:ro nginx:latest
docker inspect test-nginx

Как сделать образ, Dockerfile

Образы это основы для контейнеров. Для простоты, можно относиться к образу как к git-репозиторию. Образы можно коммитить с изменениями, и можно иметь несколько версий. Если не указывать конкретную версию, то клиент по умолчанию использует latest. Например, можно скачать определенную версию образа. Dockerfile: это текстовый файл с инструкциями и аргументами. Краткое описание инструкций, которые мы собираемся использовать в примере:

  • FROM – задать базовый образ
  • RUN – выполнить команду в контейнере
  • ENV – задать переменную среды
  • WORKDIR – установить рабочий каталог
  • VOLUME – создать точку монтирования для тома
  • CMD – установить исполняемый файл для контейнера
FROM ubuntu:latest  
RUN apt-get update  
RUN apt-get install --no-install-recommends --no-install-suggests -y curl  
ENV SITE_URL http://google.com/  
WORKDIR /data  
VOLUME /data  
CMD sh -c "curl -L $SITE_URL > /data/results"

Сделаем образ

docker build . -t test-curl  
docker images
docker run --rm -v $(pwd)/vol:/data/:rw test-curl
cat ./vol/results

Соединение между контейнерами, Docker compose, Кирпичи в докере

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

Можно организовать межконтейнерное взаимодействия непосредственно средствами самого докера, но есть для этого специальный модный инструмент - Docker Compose. Основная его задача - обращаться с группой контейнеров как с единой сущностью. Чтобы думать о "запуске приложений" (иными словами, "запуске оркестрированного кластера контейнеров") вместо "запуска контейнеров".

FROM ruby:2.5.1
RUN apt-get update -qq && apt-get install -y nodejs libxml2-dev libxslt1-dev libpq-dev postgresql
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
host: db
version: '2'
services:
  web:
    build: .
    ports:
      - '5001:5001'
    volumes:
      - .:/myapp
    command: bundle exec rails s -p 5001 -b 0.0.0.0
    depends_on:
      - db
    environment:
      DATABASE_URL: postgres://postgres@db/brigzz_development
  db:
    image: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_DB: brigzz_development
    volumes:
      - ./tmp/db_dump:/db_dump

Проверяем

docker-compose --project-name app-test -f docker-compose.yml up
docker-compose build
docker-compose up -d
docker-compose ps
docker-compose down
docker-compose run web rake db:migrate

Всегда давайте явные имена вашим томам. Это простое правило избавит вас от проблемы в будущем.

Как залить БД

sudo -u postgres pg_dump -Fc -c -O brigzz_production > brigzz_production_backup_20180417
rsync -zavP [email protected]:/home/webmaster/brigzz_production_backup_20180417 ./tmp/db_dump

docker-compose build
docker-compose up -d db
docker-compose exec db pg_restore -U postgres -Fc --no-owner -n public -d brigzz_development /db_dump/brigzz_production_backup_20180417
docker-compose exec db psql -U postgres -d brigzz_development
docker-compose up -d web
docker-compose exec web rails c

http http://localhost:5001/api/v1/bundles
http http://localhost:5001/api/v1/blocks/189

Краткий свод по командам

docker pull <image> - pull скачивает образ <image> из регистра Докера и сохраняет его локально
docker run - запустить докер-контейнер
docker ps - выводит на экран список всех запущенных контейнеров
docker ps -a - список всех контейнеров, которые мы запускали
docker rm <image> - удалить контейнер
docker rm $(docker ps -a -q -f status=exited)
docker images - список доступных локально образов

docker exec -it [container-id] bash

docker run -d -P --name static-site prakhar1989/static-site
-d открепит (detach) терминал, 
-P сделает все открытые порты публичными и случайными, 
--name это имя, которое мы хотим дать контейнеру
docker port static-site

docker search elasticsearch

Прочая фигня

Это просто инструмент, в котором могут попадаться косяки.

Где применить

Из полезного и очевидного, типа как для дома и семьи

  • Организация проектного окружения - без регистрации и смс в смысле без проблем с версиями и взаимными зависимостями

Чего нет

Ну кроме краткости

  • Деплоя в контейнере + публикации контейнеров
  • Организация межконтейнерного взаимодействия

Ссылки

  1. https://proglib.io/p/docker/
  2. https://habrahabr.ru/post/310460 /
  3. https://docs.docker.com/compose/rails/#define-the-project
  4. https://blog.codeship.com/running-rails-development-environment-docker/
  5. https://blog.codeship.com/using-docker-for-rails-development/
  6. https://blog.codeship.com/using-docker-compose-for-ruby-development/

https://gitlab.redde.ru/domido/brigzz/commit/5e195b63fca1e21715d9290aa8bd9109c4783dd1

-- after_action only: [:index] { set_pagination_header(:blocks) }

after_action -> { set_pagination_header(:blocks) }, only: [:index]

results matching ""

    No results matching ""