ここでは、docker-composeとDocker公式のMySQL8.0イメージを用います。
環境
ホスト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 mysql8
作業ディレクトリに移動します。
cd mysql8
mysqlのボリュームのマウント先となるディレクトリを作成しておきます。
mkdir db_data
docker-compose.ymlファイルを作成します。
MySQL8.0からはログイン認証方式がcaching_sha2_passwordになりました。
ここでは、MySQL5と同じログイン認証方式に変更します。
version: '3'
services:
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
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
-----------------------------------------------------------------------------------------
mysql8_db_1 docker-entrypoint.sh --def ... Up 0.0.0.0:13306->3306/tcp, 33060/tcp
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a00ce6a3f620 mysql:8.0 "docker-entrypoint.s…" 10 minutes ago Up 2 minutes 33060/tcp, 0.0.0.0:13306->3306/tcp mysql8_db_1
db_dataディレクトリの中身を確認してみます。
/var/lib/mysqlディレクトリとマウントされていることが確認できます。
ls db_data/
'#ib_16384_0.dblwr' auto.cnf binlog.000003 ca.pem ib_buffer_pool ibdata1 mysql.ibd public_key.pem server-key.pem undo_002
'#ib_16384_1.dblwr' binlog.000001 binlog.index client-cert.pem ib_logfile0 ibtmp1 performance_schema sample sys
'#innodb_temp' binlog.000002 ca-key.pem client-key.pem ib_logfile1 mysql private_key.pem server-cert.pem undo_001
MySQL8.0コンテナに接続およびサンプルデータベースの作成
docker execコマンドによりMySQL8.0コンテナに接続します。
「a00ce6a3f620」の部分は、コンテナ作成の都度変更されるものなので、適切なコンテナIDに変更してください。
$ docker exec -it a00ce6a3f620 /bin/bash
コンテナに接続後、mysqlコマンドによりMySQLに接続します。
rootのパスワードは、docker-compose.ymlファイルで指定したパスワードを用います。
mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.21 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
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.02 sec)
作成したテーブルにサンプルデータを追加します。
INSERT INTO table_sample (name) VALUES ('sample_00'), ('sample_01'), ('sample_02');
Query OK, 3 rows affected (0.00 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.00 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 a00ce6a3f620 sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" sample' > ./sample.sql
sample.sqlをテキストで開くと次のようになり、確かにダンプされていることが確認できます。
-- MySQL dump 10.13 Distrib 8.0.21, for Linux (x86_64)
--
-- Host: localhost Database: sample
-- ------------------------------------------------------
-- Server version 8.0.21
/*!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 */;
/*!50503 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 */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `table_sample` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!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 7:58:26
ダンプファイルのリストア
次のコマンドにより上記で作成したsampleデータベースのダンプファイルをリストアします。
docker exec -i a00ce6a3f620 sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" sample' < ./sample.sql