Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Docker – постоянное хранение данных

Оригинал: Docker - Persistence
Автор: Alex Collins
Дата публикации: 15 / 03 / 2014
Перевод: Н.Ромоданов
Дата перевода: март 2015 г.

Я уже писал о Docker. Одна важная особенность состоит в том, что в контейнерах Docker файлы не сохраняются, так что если вы создаете контейнер базы данных, вам, вероятно, такая возможность потребуется. Для этого существует модель, реализующая подобную возможность, которая, как правило, называется контейнером только для данных (data only container).

Рассмотрим следующий файл MySQL Dockerfile:

FROM centos

VOLUME /var/lib/mysql

RUN yum -y install mysql-server
RUN touch /etc/sysconfig/network

EXPOSE 3306

Когда вы его запустите, вы можете создать некоторые тестовые данные (для краткости я удалил часть выдаваемых данных):

$ docker build .
...
Successfully built b962491b87db
$ docker run -i -t b962491b87db bash
bash-4.1# service mysqld start
bash-4.1# mysql -u root
mysql> connect test;
mysql> create table a(a int);
Query OK, 0 rows affected (0.01 sec)

Теперь выйдите из контейнера (Ctrl+C) и давайте проверим наши данные:

docker run -i -t b962491b87db bash
bash-4.1# service mysqld start
bash-4.1# mysql -u root
mysql> connect test;
mysql> select * from a;
ERROR 1146 (42S02): Table 'test.a' doesn't exist

Надо же! Куда пропала моя таблица? Эта ситуация не должна удивить тех, кто хорошо знаком с Docker, но я попался, поскольку ожидал, что контейнеры ведут себя так, как виртуальные машины. Я запустил образ, а не контейнер, поэтому в нем все именно так, как это было изначально. А что, если я хотел бы поделиться файлом Dockerfile с кем-нибудь еще? В нем нет никаких данных. Фактически это именно то, что я хочу. Вместо того, чтобы предоставить контейнер, заполненный старыми тестовыми данными, я бы хотел, чтобы файл был пустой. Т.е. если я хочу передать его в эксплуатацию, я хочу, чтобы в нем не было никаких тестовых данных. Но когда мне нужно хранить мои тестовые данные, я могу пользоваться уже упомянутым ранее контейнером только для данных. Создаем следующий файл Dockerfile:

FROM centos

VOLUME /var/lib/mysql

CMD ["true"]

Теперь собираем и запускаем.

$ docker build .
...
Successfully built 5f2bca5b686e
$ docker run -name data 5f2bca5b686e

Вы заметили, что имя для контейнера я выбрал так, чтобы мне было оно удобным. Вы также заметили, что результат был выдан без какой-либо обработки. Это потому, что для этого нам даже не потребовалась что-либо делать.

Теперь, давайте попробуем еще раз (обратите внимание на аргумент -volumes-from):

$ docker run -i -t -volumes-from data b962491b87db bash
bash-4.1# service mysqld start 
bash-4.1# mysql -u root
mysql> connect test;
mysql> create table a(a int);
Query OK, 0 rows affected (0.01 sec)

Теперь выходим и выполним следующее:

$ docker run -i -t -volumes-from data b962491b87db bash
bash-4.1# service mysqld start
bash-4.1# mysql -u root
mysql> connect test;
mysql> select * from a;
Empty set (0.00 sec)

Отлично! Мои данные сохраняются!