<Docker>最小構成!DBのみを構築する(MariaDB)

Docker

今回はDockerを使用し、MariaDBを構築します。yamlファイルさえ作成すれば、初回の構築・起動は40秒台、2回目以降の起動は0.5秒で完了します。

<Docker>最小構成!DBのみを構築する(MariaDB)

この記事が対象とする環境
ホスト(HOST) ※実行マシン
Windows
Docker Desktop v4.22.1
ゲスト(GUEST)※Dockerコンテナ
MariaDB v11.0

Docker Desktop起動

WindowsでDocker環境を構築する場合、「Docker Desktop」というアプリケーションが必要になります。こちらのサイトからダウンロードしてインストールしましょう。

Docker Desktop
Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today ...

Docker Desktopを起動すると次のような画面が表示されます(※バージョンによって見た目に違いがあるかもしれません)Docker Desktopを起動したら、いったんはそのままにしておいてください。

環境設定ファイルの作成

フォルダ構成


your root/
|-- compose.yaml
`-- db/
   |-- cnf/
   |   `-- db.conf
   |-- data/
   `-- sql/
         `-- init.sql

compose.yaml

Docker Composeで使用する環境構築コマンドを作成します。「compose.yaml」はテキストファイルで、Dockerで構築する環境の構成・動作を記載します。「docker-compose.yml」となっているのは古い記事で、現在の推奨は「compose.yaml」となります。基本的にはDocker環境を作成したいルートフォルダに配置します。細かい説明は次のファイル中にコメントで残してあります。

your root\compose.yaml

services:
  #データベース
  db:
    #イメージ+バージョン ※latestを常に最新が適用されるが意図しない挙動になる可能性あり
    image: mariadb:11.0
    #コンテナ名
    container_name: db
    #設定
    environment: 
      #rootスーパーユーザーのパスワード
      MARIADB_ROOT_PASSWORD: root
      #データベース名
      MARIADB_DATABASE: database
      #接続ユーザー名
      MARIADB_USER: db-user
      #接続パスワード
      MARIADB_PASSWORD: db-pass
      #タイムゾーン
      TZ: 'Asia/Tokyo' 
    volumes: 
      #永続化(ローカルフォルダ:コンテナフォルダ) ※永続化することでコンテナ停止してもデータが消失しない
      - ./db/data:/var/lib/mysql
      #DB初期設定(フォルダ内の拡張子.cnfのファイルをアルファベット順に実行)
      #ボリュームが永続化されており、2回目以降の起動の場合は実行されない
      - ./db/cnf:/etc/mysql/conf.d
      #コンテナ起動時の実行SQL(フォルダ内の拡張子.sh/.sql/.sql.gzのファイルをアルファベット順に実行)
      #ボリュームが永続化されており、2回目以降の起動の場合は実行されない
      - ./db/sql:/docker-entrypoint-initdb.d
    #ポート(外部ポート:内部ポート)
    ports:
      - 3306:3306

db.cnf

MariaDBの設定ファイルです。ファイル名は任意に付けることができ、ファイル名のアルファベット順に実行されます。文字コードの指定のみ記載してみました。

your root\db\cnf\db.cnf

[mysqld]
character_set_server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

init.sql

コンテナ起動時に実行したいSQLを記述します。ファイル名は任意に付けることができ、ファイル名(拡張子.sh/.sql/.sql.gz)のアルファベット順に実行されます。次の例では「test」テーブルを作成し、1行レコードを挿入しています。SQLの実行が不要な場合、ファイルを配置しなければOKです。

your root\db\sql\init.sql

CREATE TABLE `test` (
  `code` varchar(5) DEFAULT NULL
);
INSERT INTO test values('123');

Docker起動

コマンドプロンプトを起動し、次のコマンドを実行します。コンテナ名「db」というデータベースが起動したことを確認できます。初回構築時のみ[pull]が発生します。

docker-compose up -d
[+] Running 9/9
 ✔ db 8 layers [⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled    10.1s
   ✔ 44ba2882f8eb Pull complete                      2.5s
   ✔ 08b8223d0cb6 Pull complete                      2.5s
   ✔ ef2696fb09d6 Pull complete                      3.1s
   ✔ 6ae32c298a0d Pull complete                      3.1s
   ✔ 737007b25ac8 Pull complete                      3.1s
   ✔ 0dbe827889a7 Pull complete                      6.7s
   ✔ c66389b6a4b9 Pull complete                      6.7s
   ✔ a0724dc11b95 Pull complete                      6.7s
[+] Running 2/2
 ✔ Network yourroot_default  Created                 0.0s
 ✔ Container db              Started                 2.1s

Docker Desktopでもコンテナが起動していることを確認できます。

Dockerを起動するとdataフォルダ内にファイルが沢山作成されており、これらがDBの実体となります。

データベース接続確認

MariaDBが起動したので、実際に接続して確認します。DBへの接続は好きなツールを使用してください。今回は「A5:SQL Mk-2」を使用します。

A5:SQL Mk-2 - フリーのSQLクライアント/ER図作成ソフト (松原正和)

「compose.yaml」に記載しているDB接続情報を入力します。

接続が成功するとデータベースが作成されていることを確認できます。

Docker停止

最後にDockerを停止しましょう。停止せずにDocker Desktopを終了したり、Windowsシャットダウンしたりすると、最悪の場合、データベースに関連するファイルが破損し、起動できなくなる可能性があります。

docker-compose down
[+] Running 2/2
 ✔ Container db                  Removed    0.6s
 ✔ Network dockerdbonly_default  Removed    0.3s

札幌在住エンジニア。JavaやPHPやWordPressを中心とした記事が中心です。

【SE歴】四半世紀以上
【Backend】php / java(spring) / c# / AdobeFlex / c++ / VB / cobol
【Frontend】 vue.js / jquery他 / javascript / html / css
【DB】oracle / mysql / mariadb / sqlite
【infrastructure】aws / oracle / gcp
【license】aws(saa-c03) / oracle master / XML Master / Sun Certified Programmer for the Java 2 Platform 1.4

Nobelをフォローする
Docker
Nobelをフォローする

コメント

タイトルとURLをコピーしました