DockerでMySQL8.0を使用できるまでの手順をお伝えします。
ここでは、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
Docker×MySQL 環境構築