MySQL + Docker Compose + Nodejs/Python — ステップバイステップガイド
MySQL は、これまでで最も人気のあるリレーショナル データベースの 1 つです。Docker および docker-compose で MySQL を使用すると、MySQL をデータベースとして使用する任意のアプリケーションの変更を非常に簡単かつ迅速にテストできます。このチュートリアルでは、MySQL を Docker および docker-compose で使用する方法を詳しく説明し、理解を容易にします。
TLDR コードはこちら。転がりましょう!
ローカル開発に Docker で MySQL を使用する理由
MySQL を含む任意のデータベースを Docker でローカル開発に使用する大きな理由は複数あります。そのいくつかは次のとおりです。
- プロジェクトごとに、またはその他の理由で、5.6、5.7、または 8 などの MySQL の任意のバージョンを使用するのは非常に簡単です。
- 通常、docker を使用すると、自分のマシンで実行すると、別のソフトウェア エンジニアのマシン、ステージング環境、および運用環境でも実行されますが、ある程度の互換性が維持されます。
- 新しいチーム メンバーは、docker やその他のツールが効率的にセットアップされているため、数日ではなく数時間で生産性を高めることができます。
前提条件
いくつかのコードと CLI コマンドで手を汚す前に、前提条件をいくつか以下に示します。
- このガイドでは、Docker および docker build、run、execute などの関連コマンドの基本的な知識が役に立ちます。
- Docker-compose に関する事前情報は非常に役立ちます。
- リレーショナル データベース、特に MySQL がどのように機能するかについての一般的な理解が有利になります。
MySQL を Docker で実行する
この初心者向けガイドでは、DockerHubの公式の MySQL Docker イメージを使用します。公式の MySQL Docker イメージには Alpine Linux バージョンはありませんが、Debian バージョンも 147 MB であり、Docker イメージには大きすぎません。
公式イメージを使用して MySQL 8.0 コンテナーを実行するには、次のコマンドを実行するだけです。
mkdir /tmp/mysql-data
docker run --name basic-mysql --rm -v /tmp/mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=ANSKk08aPEDbFjDO -e MYSQL_DATABASE=testing -p 3306:3306 -it mysql:8.0
--nameコンテナに名前を付けるbasic-mysql--rmコンテナが停止しているときにコンテナを削除するには-v /tmp/mysql-data:/var/lib/mysqlコンテナの再起動時にデータを保持するために追加されますが、ホストマシンが再起動すると、そのままの状態でデータが消えます。/tmp-e MYSQL_ROOT_PASSWORD=ANSKk08aPEDbFjDO -e MYSQL_DATABASE=testingroot ユーザーのパスワードを設定し、次の名前のデータベースを初期化します。testing-p 3306:3306ホスト ポート 3306 をコンテナー ポート 3306 にマップします。ポート 3306 は MySQL のデフォルト ポートです。-it mysql:8.0- - すべてのログが表示され、Debian フレーバーを実行する公式の MySQL イメージ バージョン 8.0 を使用しています。
2022-10-27 06:11:09+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
2022-10-27 06:11:10+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-10-27 06:11:10+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
2022-10-27 06:11:11+00:00 [Note] [Entrypoint]: Initializing database files
2022-10-27T06:11:11.957280Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2022-10-27T06:11:11.957392Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.31) initializing of server in progress as process 80
2022-10-27T06:11:11.987130Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
2022-10-27T06:11:12.013548Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2022-10-27T06:11:16.919522Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2022-10-27T06:11:20.772591Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2022-10-27 06:11:27+00:00 [Note] [Entrypoint]: Database files initialized
2022-10-27 06:11:27+00:00 [Note] [Entrypoint]: Starting temporary server
mysqld will log errors to /var/lib/mysql/729f35877b11.err
mysqld is running as pid 133
2022-10-27 06:11:40+00:00 [Note] [Entrypoint]: Temporary server started.
'/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
2022-10-27 06:11:44+00:00 [Note] [Entrypoint]: Creating database testing
2022-10-27 06:11:44+00:00 [Note] [Entrypoint]: Stopping temporary server
2022-10-27 06:11:48+00:00 [Note] [Entrypoint]: Temporary server stopped
2022-10-27 06:11:48+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
2022-10-27T06:11:48.661152Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2022-10-27T06:11:48.670274Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 1
2022-10-27T06:11:48.683339Z 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
2022-10-27T06:11:48.700826Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2022-10-27T06:11:51.317151Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2022-10-27T06:11:52.336910Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2022-10-27T06:11:52.336965Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2022-10-27T06:11:52.352191Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2022-10-27T06:11:52.548249Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2022-10-27T06:11:52.548394Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
docker exec -it basic-mysql /bin/bash
#once inside the container
mysql -u root -p
#put/paste the password, ANSKk08aPEDbFjDO, and once inside MySQL CLI run
show databases;
コンテナを停止するにはdocker stop basic-mysql
それはそれほど難しくはありませんでしたが、コマンドのパラメーターが覚えにくいだけでなく、簡単だとは思いませんでした。もう 1 つの側面は、MySQL を分離して実行したことです。Quotes API Node.js アプリケーションと MySQL コンテナーの間にリンクはありません。これは、次のセクションで説明するように、docker-compose の宣言型の性質が非常に役立つ場所です。
docker-compose で MySQL を実行する
初期インジェクション スクリプトを追加する
mkdir basic-mysql && touch ./basic-mysql/init.sql
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
USE testing;
DROP TABLE IF EXISTS `order`;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS coffee;
/*NEVER store passwords in clear text as it's done here!!!*/
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
password TEXT NOT NULL,
role ENUM('admin', 'consumer')
);
INSERT INTO
users (name, email, password, role)
VALUES
('test', '[email protected]', 'test', 'consumer'),
('admin', '[email protected]', 'admin', 'admin');
CREATE TABLE coffee (
id SERIAL PRIMARY KEY,
blend_name char(64),
origin char(64),
variety char(64),
notes char(64),
intensifier char(64),
price float
);
INSERT INTO
coffee (
blend_name,
origin,
variety,
notes,
intensifier,
price
)
VALUES
(
'Good-morning Symphony',
'Dipilto, Nicaragua',
'Kona',
'crisp, coating, concord grape, fresh wood, maple syrup',
'astringent',
23.7
),
(
'KrebStar Mug',
'Central Valley, Costa Rica',
'Yellow Bourbon',
'mild, tea-like, pineapple, barley, musty',
'delicate',
40.0
);
CREATE TABLE `order` (
id SERIAL PRIMARY KEY,
coffeeId BIGINT UNSIGNED NOT NULL,
userId BIGINT UNSIGNED NOT NULL,
quantity INT NOT NULL,
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_coffeeId FOREIGN KEY (coffeeId) REFERENCES coffee(id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_userId FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE
);
-- insert data into order table
INSERT INTO
`order` (coffeeId, userId, quantity)
VALUES
(1, 1, 2),
(2, 2, 1);
version: '3.8'
services:
basic-mysql:
container_name: basic-mysql
image: mysql:8.0
cap_add:
- SYS_NICE
restart: always
environment:
- MYSQL_DATABASE=testing
- MYSQL_ROOT_PASSWORD=ANSKk08aPEDbFjDO
ports:
- '3306:3306'
- '33060:33060'
command: --init-file /docker-entrypoint-initdb.d/init.sql
volumes:
- basic-mysql:/var/lib/mysql
- ./basic-mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
volumes:
basic-mysql:
driver: local
- 最新バージョンの 1 つである docker-compose ファイルバージョン 3.8を使用します。
- したがって、サービスとして定義する
dbと、各サービスは新しい docker run コマンドと同等になります - 続いて、docker-compose がこの DB サービスに公式の MySQL 8.0 イメージを使用するように指定します。
- に
cap_add設定すると、役に立たないエラー メッセージがSYS_NICE抑制されます。 - 次に、docker-compose に、このコンテナが失敗した場合に常に再起動するように依頼します。
- その後、MySQL データベースと root ユーザーのパスワード用に 2 つの環境変数を追加します。必要に応じて、別のユーザーを追加して、他の環境変数に対する権限を減らすことができます。
- 次に、 MySQL サーバーがコンテナー ポートで実行されているため、ホスト ポート
3306をコンテナー ポートにマップします。設定に応じて、ホスト ポートが変更される場合があります。33063306 - 次に、シード スクリプトを実行して、初期データを mysql データベースに挿入します。
testing - 次に、2 つのボリュームを追加します。最初の 1 つは、以下のボリュームにマッピングされた DB ボリューム
basic-mysqlです。これは基本的に、docker と docker-compose にボリュームを管理するように指示します。次に、指定された SQL ファイルでデータベースを初期化するinit.sqlスクリプトを追加します。testing
docker-compose up
[+] Running 1/1
⠿ Container basic-mysql Created 0.2s
Attaching to basic-mysql
basic-mysql | 2022-10-27 09:38:51+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
basic-mysql | 2022-10-27 09:38:51+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
basic-mysql | 2022-10-27 09:38:51+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
basic-mysql | '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
basic-mysql | 2022-10-27T09:38:52.620935Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
basic-mysql | 2022-10-27T09:38:52.628931Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 1
basic-mysql | 2022-10-27T09:38:52.649308Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
basic-mysql | 2022-10-27T09:38:53.380032Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
basic-mysql | 2022-10-27T09:38:53.698374Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
basic-mysql | 2022-10-27T09:38:53.698422Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
basic-mysql | 2022-10-27T09:38:53.705214Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
basic-mysql | 2022-10-27T09:38:53.904655Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
basic-mysql | 2022-10-27T09:38:53.904741Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
MySQL Workbenchなどの UI を介してデータベースに接続し、 テーブルが適切にシードされていることを確認します
Python スクリプトによる接続のテスト
依存関係がインストールされていることを確認します。実行pip install pymysqlまたはpip3 install pymysql
# main.py
import pymysql.cursors
# Connect to the database
connection = pymysql.connect(
host='localhost',
user='root',
password='ANSKk08aPEDbFjDO',
database='testing',
cursorclass=pymysql.cursors.DictCursor
)
with connection:
with connection.cursor() as cursor:
# Read a single record
sql = "SELECT * FROM `users`"
cursor.execute(sql)
result = cursor.fetchall()
print(result)
ノードスクリプトによる接続のテスト
依存関係がインストールされていることを確認します。走るnpm i mysql
// main.js
const mysql = require('mysql');
const con = mysql.createConnection({
host: "localhost",
user: "root",
password: "ANSKk08aPEDbFjDO",
database: "testing"
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
con.query("SELECT * FROM `users`", function (err, result, fields){
if (err) throw err;
console.log(result);
});
});
行動を求めます
このガイドが役に立ったら、拍手してフォローしてください。このリンクからmedium に参加して、mediumで私と他のすべての素晴らしいライターからのすべてのプレミアム記事にアクセスしてください。
コーディングのレベルアップ
私たちのコミュニティに参加してくれてありがとう!行く前に:
- ストーリーに拍手して作者をフォローしてください
- Level Up Coding の出版物のコンテンツをもっと見る
- フォローしてください: Twitter | リンクトイン| ニュースレター

![とにかく、リンクリストとは何ですか?[パート1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































