Есть две возможности создавать и запускать контейнер – с помощью 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>
Готово.