Mikhail Voronin

Использование Docker-контейнеров

     

 Linux  System Administration

Что такое Docker?

Docker - это набор компонентов, обеспечивающих LXC высокоуровневыми сервисами управления и развёртывания. Определение LXC дано в Википедии:
LXC (англ. Linux Containers) — система виртуализации на уровне операционной системы для запуска нескольких изолированных экземпляров операционной системы Linux на одном узле. LXC не использует виртуальные машины, а создает виртуальное окружение с собственным пространством процессов и сетевым стеком. Все экземпляры LXC используют один экземпляр ядра операционной системы.
Насколько я знаю, в данный момент работы над аналогичными технологиями ведутся в Apple и Microsoft. На момент написания статьи Docker работает через VirtualBox в операционных системах Mac OS и Windows.

Как установить Docker?

В официальной документации всё очень хорошо описано. Есть руководства для пользователей Windows, Mac и Linux.

Как использовать Docker?

Если вы разработчик, то скорее всего вы используете базы данных в своей работе, возможно, Key-Value хранилища и прочее. Бывает, что вам нужна определенная версия СУБД, а не та, что доступна в репозитории вашего дистрибутива. Да и устанавливать в свою систему множество разнообразного ПО не хочется - память не бесконечная. Всё это ПО можно установить и запустить в контейнерах Docker.
Ещё одна хорошая новость состоит в том, что не нужно самостоятельно устанавливать популярное ПО - уже есть готовые контейнеры, которые можно скачать и запустить. Ниже я приведу несколько примеров.

Установка PostgreSQL

Вот ссылка на официальное руководство.
Для того чтобы запустить PostgreSQL контейнере Docker нужно всего лишь выполнить одну команду:
  1. $ docker run --name img-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
Этой команде передана переменная POSTGRES_PASSWORD, название говорит само за себя. Ещё можно передать переменную POSTGRES_USER, по умолчанию создается пользователь с именем "postgres". img-postgres это имя вашего нового контейнера.
Всё хорошо, но теперь хотелось бы подключиться к PostgreSQL. Для этого можно поискать IP-адрес нашего контейнера (мы ведь помним, что в контейнере создается новый сетевой стек).
  1. $ docker inspect img-postgres | grep IPAddress
  2. "SecondaryIPAddresses": null,
  3. "IPAddress": "172.17.0.2",
  4. "IPAddress": "172.17.0.2",
И теперь можем подключиться к базе.
  1. $ psql -U postgres -h 172.17.0.2 -p 5432
Ещё можно пробросить порт 5432 контейнера на интерфейс обратной петли нашего хоста.
  1. $ docker run --name img-postgres -p 54321:5432 -e POSTGRES_PASSWORD=mysecretpassword -d postgres
Тогда чтобы подключится надо использовать такую команду:
  1. $ psql -U postgres -h 127.0.0.1 -p 54321
Для того чтобы сделать резервную копию базы, можно воспользоваться командой exec
  1. $ docker exec img-postgres pg_dump -U postgres mydb > mydb_dump.sql

Установка MongoDB

Установка контейнера с MongoDB мало чем отличается от установки контейнера с PostgreSQL. Полное руководство по установке можно найти здесь.
  1. $ docker run --name img-mongo -p 27017:27017 -d mongo
Для того чтобы подключится к Mongo, надо поставить приложение-клиент (в Ubuntu это mongodb-clients).

Установка Memcached

Здесь можно ознакомиться с руководством по установке.
  1. $ docker run --name img-memcache -p 11211:11211 -d memcached

Запуск команд из контейнера

Для примера, возьмем команду pg_dump и сделаем резервную копию базы данных.
  1. $ docker exec CONTAINER_NAME pg_dump -U postgres DATABASE_NAME > dump.sql
Подробнее о команде exec можно почитать в соответствующем руководстве (man docker-exec).

Управление Docker-контейнерами

Вывести список всех запущенных контейнеров docker ps
Вывести список всех контейнеров docker ps --all
Запустить контейнер docker run CONTAINER_NAME
Выключить (остановить) контейнер docker stop CONTAINER_NAME
Принудительно выключить контейнер (убить) docker kill CONTAINER_NAME
Удалить контейнер docker rm CONTAINER_NAME
Показать проброшенные порты docker port CONTAINER_NAME
Показать информацию о контейнере docker inspect CONTAINER_NAME

Дополнительная информация