Docker: Ubuntu и MariaDB в контейнере

Автор: | 10/03/2015
 

docker_lxcЕсть две возможности создавать и запускать контейнер — с помощью Dockerfile и вручную (есть и ещё один вариант — загрузить и запустить уже готовый контейнер с MySQL/MariaDB из репозитория — но мы лёгких путей не ищем).

Тут будет рассмотрен ручной вариант.

Задача: поднять Docker-контейнер, в котором будет работать MariaDB с возможностью подключения к нему из других контейнеров или самого Docker-хоста.

Запускаем контейнер с Ubuntu:

# docker run -it ubuntu
root@10d639874a71:/#

Проверяем:

root@10d639874a71:/# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.3 LTS
Release:        14.04
Codename:       trusty

Устанавливаем необходимые пакеты, ключи и добавляем репозиторий:

# apt-get install software-properties-common
# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
# add-apt-repository 'deb http://ftp.heanet.ie/mirrors/mariadb/repo/10.0/ubuntu trusty main'

Обновляем список пакетов:

# apt-get update

Устанавливаем саму MariaDB:

# apt-get install mariadb-server

Проверяем:

# mysql --version
mysql  Ver 15.1 Distrib 10.0.21-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Выходим из контейнера:

# exit

Находим ID контейнера:

# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
4a1969eedcbe        ubuntu              "/bin/bash"         14 minutes ago      Exited (0) 24 seconds ago                       insane_wilson

И создаём новый образ:

# docker commit 4a1969eedcbe setevoy/ubuntu_14_mariadb_15.1:latest
fe27ddc919270bd8a2285b6bbc23ab10f4fe297ffe49d7f4df022b65b99a4449

Проверяем доступные образы:

# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
setevoy/ubuntu_14_mariadb_15.1   latest              fe27ddc91927        7 seconds ago       501.6 MB
ubuntu                           latest              91e54dfb1179        6 weeks ago         188.4 MB

Теперь у нас имеется образ с «голой» ОС и сервером MariaDB.

На машине-хосте создаём каталог, который будет монтироваться к нашему Docker-контейнеру и хранить данные MariaDB:

# mkdir -p /docker/vm/ubuntu/mariadb/data

Запускаем новый контейнер:

# docker run -v /docker/vm/ubuntu/mariadb/data:/var/lib/mysql -it -p 3306:3306 setevoy/ubuntu_14_mariadb_15.1:latest
root@0cd93869d669:/#

Тут мы указали, что локальный каталог /docker/vm/ubuntu/mariadb/data будет соответствовать каталогу /var/lib/mysql в контейнере, а порт 3306 на локальном хосте — порту 3306 контейнера. С помощью опций -t и -i — откроем консоль, что бы выполнить последние настройки MariaDB.

Проверить какие директории подключены можно с помощью docker inspect:

# docker inspect --format='{{.Mounts}}' 0cd93869d669
[{ /docker/vm/ubuntu/mariadb/data /var/lib/mysql   true}]

В контейнере проверяем настройки MariaDB:

# cat /etc/mysql/my.cnf | grep -E "datadir|bind-address"
datadir         = /var/lib/mysql
bind-address            = 0.0.0.0

Создаём необходимые базы и таблицы:

# mysql_install_db
Installing MariaDB/MySQL system tables in '/var/lib/mysql' ...
...

Проверяем каталог в контейнере:

# ls -l /var/lib/mysql/
total 110620
-rw-rw---- 1 mysql mysql    16384 Oct  2 15:10 aria_log.00000001
-rw-rw---- 1 mysql mysql       52 Oct  2 15:10 aria_log_control
-rw-rw---- 1 mysql mysql 50331648 Oct  2 15:10 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Oct  2 15:10 ib_logfile1
-rw-rw---- 1 mysql mysql 12582912 Oct  2 15:10 ibdata1
drwx------ 2 mysql root      4096 Oct  2 15:10 mysql
drwx------ 2 mysql mysql     4096 Oct  2 15:10 performance_schema

И на хосте:

# ls -l /docker/vm/ubuntu/mariadb/data/
total 110620
-rw-rw---- 1 messagebus fuse    16384 жов  2 18:10 aria_log.00000001
-rw-rw---- 1 messagebus fuse       52 жов  2 18:10 aria_log_control
-rw-rw---- 1 messagebus fuse 12582912 жов  2 18:10 ibdata1
-rw-rw---- 1 messagebus fuse 50331648 жов  2 18:10 ib_logfile0
-rw-rw---- 1 messagebus fuse 50331648 жов  2 18:10 ib_logfile1
drwx------ 2 messagebus root     4096 жов  2 18:10 mysql
drwx------ 2 messagebus fuse     4096 жов  2 18:10 performance_schema

Запускаем сервер:

# service mysql start

В случае ошибки вида:

# service mysql start
* Starting MariaDB database server mysqld [ OK ]
* Checking for corrupt, not cleanly closed and upgrade needing tables.
root@c8464ca7ad51:/# ERROR 1045 (28000): Access denied for user ‘debian-sys-maint’@’localhost’ (using password: YES)

Проверьте пароль пользователя ‘debian-sys-maint‘:

# cat /etc/mysql/debian.cnf | grep pass
password = CjbIjC3AecIhHwi6

И установите ему права доступа:

# mysql -u root -p
Enter password:
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'CjbIjC3AecIhHwi6';
Query OK, 0 rows affected (0.00 sec)

Проверяем:

# mysql -u debian-sys-maint -pCjbIjC3AecIhHwi6
Welcome to the MariaDB monitor.  Commands end with ; or g.
...
MariaDB [(none)]>

Запускаем скрипт первоначальной настройки:

# mysql_secure_installation

Создадим отдельного пользователя docker, который сможет подключаться к этому серверу:

MariaDB [mysql]> GRANT ALL PRIVILEGES ON *.* TO 'docker'@'%' identified by 'password';
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Останавливаем MariaDB и выходим из контейнера:

# service mysql stop
 * Stopping MariaDB database server mysqld
# exit
exit

Сохраняем новый образ, на этот раз уже со всеми необходимыми настройками:

# docker ps -a
CONTAINER ID        IMAGE                                   COMMAND             CREATED             STATUS                         PORTS               NAMES
0cd93869d669        setevoy/ubuntu_14_mariadb_15.1:latest   "/bin/bash"         7 minutes ago       Exited (0) 22 seconds ago                          hopeful_euclid
# docker commit -m "MariabDB with /docker/vm/ubuntu/mariadb/data/" --author setevoy 0cd93869d669 setevoy/db_server_1
a93712ec6ac706dce9e694aabe9f6cdd9eb27dc98168c2cb1b07afee1436a323

Проверяем:

# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
setevoy/db_server_1              latest              a93712ec6ac7        About a minute ago   502.1 MB
# docker history setevoy/db_server_1
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
a93712ec6ac7        7 minutes ago       /bin/bash                                       6.697 kB            MariabDB with /docker/vm/ubuntu/mariadb/data/

Запускаем последний образ:

# docker run -v /docker/vm/ubuntu/mariadb/data:/var/lib/mysql -ti -p 3306:3306 setevoy/db_server_1
root@a5d4524dd1bc:/#

Проверяем MariaDB в нём:

# service mysql status
 * MariaDB is stopped.

# service mysql start
 * Starting MariaDB database server mysqld                                                                                                                                                                                            [ OK ]
 * Checking for corrupt, not cleanly closed and upgrade needing tables.

# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or g.
...
MariaDB [(none)]>

Всё работает, выходим:

# exit

Запускаем снова, но теперь с помощью опции -d — в режиме «демона» и с указанием на старт MariaDB:

# docker run --name mariadb_db1 -v /docker/vm/ubuntu/mariadb/data:/var/lib/mysql -d -p 3306:3306 setevoy/db_server_1 /usr/bin/mysqld_safe
37f5feabcfa39828c382e57a716b35cec1e54654bb6aa801286b883d83cda724

Проверяем:

# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
37f5feabcfa3        setevoy/db_server_1   "/usr/bin/mysqld_safe"   19 seconds ago      Up 18 seconds       0.0.0.0:3306->3306/tcp   mariadb_db1

Проверяем процесс MariaDB в самом контейнере:

# docker top 37f5feabcfa3 | grep mysql
root                28588               5980                0                   19:10               ?                   00:00:00            /bin/bash /usr/bin/mysqld_safe
message+            28800               28588               0                   19:10               ?                   00:00:00            /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-log-error --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root                28801               28588               0                   19:10               ?                   00:00:00            logger -t mysqld -p daemon.error

Проверяем логи контейнера:

# docker logs 37f5feabcfa3
151002 16:10:33 mysqld_safe Logging to syslog.
151002 16:10:33 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

И пробуем подключиться с хоста:

# mysql -u docker -p -h 127.0.0.1
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
...
mysql>

Готово.