ここでは、docker-composeとDocker公式のMariaDB 10.5イメージを用います。
環境
ホストOS
ホストOSはUbuntu 20.04を用いております。
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"
Docker
snapによりインストールしたDockerを用いております。
ただし、sudo権限なしでもdockerコマンドを使用できるようにしております。
docker version
Client:
Version: 19.03.11
API version: 1.40
Go version: go1.13.12
Git commit: dd360c7
Built: Mon Jun 8 20:23:26 2020
OS/Arch: linux/amd64
Experimental: false
Server:
Engine:
Version: 19.03.11
API version: 1.40 (minimum version 1.12)
Go version: go1.13.12
Git commit: 77e06fd
Built: Mon Jun 8 20:24:59 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit:
docker-init:
Version: 0.18.0
GitCommit: fec3683
docker-compose
docker-compose version
docker-compose version 1.25.5, build unknown
docker-py version: 4.2.1
CPython version: 3.5.2
OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016
docker-composeでMySQL8.0を使用するための手順
今回作業するディレクトリを作成します。
mkdir mariadb10.5
作業ディレクトリに移動します。
cd mariadb10.5
mariadbのボリュームのマウント先となるディレクトリを作成しておきます。
mkdir db_data
docker-compose.ymlファイルを作成します。
version: '3'
services:
db:
image: mariadb:10.5
volumes:
- ./db_data:/var/lib/mysql
ports:
- "13306:3306"
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_password
volumes:
db_data:
次のコマンドにより、全体をバックグラウンドで起動させます。
docker-compose up -d
次のコマンドにより、コンテナを確認します。
docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------
mariadb105_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:13306->3306/tcp
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c44604908f0 mariadb:10.5 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:13306->3306/tcp mariadb105_db_1
db_dataディレクトリの中身を確認してみます。
/var/lib/mysqlディレクトリとマウントされていることが確認できます。
ls db_data/
aria_log.00000001 aria_log_control ib_buffer_pool ib_logfile0 ibdata1 ibtmp1 multi-master.info mysql performance_schema
MariaDB10.5コンテナに接続およびサンプルデータベースの作成
docker execコマンドによりMariaDBコンテナに接続します。
「3c44604908f0」の部分は、コンテナ作成の都度変更されるものなので、適切なコンテナIDに変更してください。
docker exec -it 3c44604908f0 bash
コンテナに接続後、mysqlコマンドによりMariaDBに接続します。
rootのパスワードは、docker-compose.ymlファイルで指定したパスワードを用います。
mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.5.5-MariaDB-1:10.5.5+maria~focal mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
次のコマンドによりデータベースを作成します。
CREATE DATABASE sample;
Query OK, 1 row affected (0.01 sec)
作成したデータベースを使うようにします。
USE sample;
Database changed
次のコマンドによりテーブルを作成します。
CREATE TABLE table_sample (id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(10));
Query OK, 0 rows affected (0.008 sec)
作成したテーブルにサンプルデータを追加します。
INSERT INTO table_sample (name) VALUES ('sample_00'), ('sample_01'), ('sample_02');
Query OK, 3 rows affected (0.003 sec)
Records: 3 Duplicates: 0 Warnings: 0
SELECTにより表示させてみます。
SELECT * FROM table_sample;
+----+-----------+
| id | name |
+----+-----------+
| 1 | sample_00 |
| 2 | sample_01 |
| 3 | sample_02 |
+----+-----------+
3 rows in set (0.000 sec)
ここまでで、確認用のデータベースを準備できましたので、次のコマンドによりMySQLから抜けます。
exit
次のコマンドによりコンテナから抜けます。
exit
Enter password:
Python3から接続してみる
sample.pyとして、次の内容を書き込みます。
import mysql.connector
con = mysql.connector.connect(db="sample",
host="localhost",
port=13306,
user="root",
password="root_password")
cur = con.cursor()
query = "SELECT id, name FROM table_sample"
cur.execute(query)
rows = cur.fetchall()
print(rows)
cur.close()
con.close()
sample.pyを実行します。
table_sampleテーブルが取得できることが確認できます。
python3 sample.py
[(1, 'sample_00'), (2, 'sample_01'), (3, 'sample_02')]
ダンプファイルの作成
次のコマンドにより上記で作成したsampleデータベースのダンプファイルが作成できます。
docker exec 3c44604908f0 sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" sample' > ./sample.sql
sample.sqlをテキストで開くと次のようになり、確かにダンプされていることが確認できます。
-- MariaDB dump 10.17 Distrib 10.5.5-MariaDB, for debian-linux-gnu (x86_64)
--
-- Host: localhost Database: sample
-- ------------------------------------------------------
-- Server version 10.5.5-MariaDB-1:10.5.5+maria~focal
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `table_sample`
--
DROP TABLE IF EXISTS `table_sample`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `table_sample` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `table_sample`
--
LOCK TABLES `table_sample` WRITE;
/*!40000 ALTER TABLE `table_sample` DISABLE KEYS */;
INSERT INTO `table_sample` VALUES (1,'sample_00'),(2,'sample_01'),(3,'sample_02');
/*!40000 ALTER TABLE `table_sample` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2020-09-08 21:52:49
ダンプファイルのリストア
次のコマンドにより上記で作成したsampleデータベースのダンプファイルをリストアします。
$ docker exec -i 3c44604908f0 sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" sample' < ./sample.sql