現在、Docker、イメージ、コンテナなどの用語はすべてのデータベース環境でかなり一般的であるため、本番環境と非本番環境の両方のセットアップでDocker上でMariaDBサーバーが実行されているのが普通です。ただし、用語を聞いたことがあるかもしれませんが、それらの違いを知っている可能性があります。このブログでは、これらの用語の概要と、MariaDBサーバーをデプロイするために実際にそれらを適用する方法について説明します。
Dockerとは何ですか?
Dockerは、コンテナーを使用してアプリケーションを作成、デプロイ、および実行するための最も一般的なツールです。これにより、アプリケーションに必要なすべてのパーツ(ライブラリやその他の依存関係など)をパッケージ化し、すべてを1つのパッケージとして出荷できるため、さまざまなマシン間でコンテナーをポータブルに共有できます。
コンテナーと仮想マシン画像とは何ですか?
関連リソースClusterControlとDockerMySQLonDockerブログシリーズMySQLonDocker-データベースをコンテナ化する方法イメージは仮想マシンテンプレートのようなものです。コンテナを実行するために必要なすべての情報が含まれています。これには、オペレーティングシステム、ソフトウェアパッケージ、ドライバー、構成ファイル、ヘルパースクリプトなどが含まれ、すべて1つのバンドルにまとめられています。
Dockerイメージは、スクリプトを作成できる人なら誰でも作成できます。そのため、コミュニティによって作成されている類似の画像が多数あり、それぞれにわずかな違いがありますが、共通の目的を果たしています。
Dockerコンテナとは何ですか?
Docker Containerは、Dockerイメージのインスタンスです。デフォルトでは、ホスト環境から完全に分離されて実行され、ホストファイルとポートにアクセスするように構成されている場合にのみアクセスします。
コンテナは仮想マシンと見なすことができますが、仮想オペレーティングシステム全体を作成する代わりに、アプリケーションが実行中のシステムと同じLinuxカーネルを使用できるようにします。アプリケーションは、ホストコンピューターでまだ実行されていないパーツとともに出荷される必要があるだけです。これにより、パフォーマンスが大幅に向上し、アプリケーションのサイズが小さくなります。
コンテナに加えられた変更は、同じDockerイメージではなく、別のレイヤーに記録されることに注意してください。つまり、コンテナを削除した場合、または同じDockerイメージに基づいて新しいコンテナを作成した場合、変更は反映されません。変更を保持するには、新しいDockerイメージにコミットするか、Dockerファイルを作成する必要があります。
DockerFileとは何ですか?
DockerFileは、Dockerイメージを生成するために使用されるスクリプトであり、適用する変更に基づいてDockerイメージを生成する手順があります。
DockerコンポーネントDockerファイルの例を見てみましょう。
$ vi Dockerfile
# MariaDB 10.3 with SSH
# Pull the mariadb latest image
FROM mariadb:latest
# List all the packages that we want to install
ENV PACKAGES openssh-server openssh-client
# Install Packages
RUN apt-get update && apt-get install -y $PACKAGES
# Allow SSH Root Login
RUN sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config
# Configure root password
RUN echo "root:root123" | chpasswd
これで、このDockerファイルから新しいDockerイメージを作成できます:
$ docker build --rm=true -t severalnines/mariadb-ssh .
作成された新しい画像を確認します:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
severalnines/mariadb-ssh latest a8022951f195 17 seconds ago 485MB
これで、次のセクションで説明するように、新しいイメージを共通のDockerイメージとして使用できます。
データベース管理に関するSevereninesDevOpsガイドオープンソースデータベースを自動化および管理するために知っておくべきことを学ぶ無料でダウンロードDockerfileを使用せずにDockerにMariaDBをデプロイする方法
Dockerの世界について詳しく知ったところで、Dockerを使用してMariaDBサーバーを作成する方法を見てみましょう。このため、Dockerがすでにインストールされていることを前提としています。
Dockerfileを使用して作成されたイメージを使用できますが、公式のMariaDBDockerイメージをプルします。
$ docker search mariadb
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mariadb MariaDB is a community-developed fork of MyS… 2804 [OK]
TAGを指定しない場合、デフォルトでは、最新のイメージバージョン(この場合はUbuntu18.04上のMariaDBサーバー10.3)がプルされます。
$ docker pull mariadb
ダウンロードした画像を確認できます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mariadb latest e07bb20373d8 2 weeks ago 349MB
次に、MariaDB Dockerディレクトリの下に2つのディレクトリを作成します。1つはdatadir用で、もう1つはMariaDB構成ファイル用です。両方をMariaDBDockerコンテナに追加します。
$ cd ~/Docker
$ mkdir datadir
$ mkdir config
スタートアップコンフィギュレーションはファイル/etc/mysql/my.cnfで指定され、.cnfで終わる/etc/mysql/conf.dディレクトリにあるすべてのファイルが含まれます。
$ tail -1 /etc/mysql/my.cnf
!includedir /etc/mysql/conf.d/
これらのファイルの内容は、/ etc / mysql / my.cnfで構成された繰り返しパラメーターをオーバーライドするため、ここで代替構成を作成できます。
最初のMariaDBDockerコンテナを実行してみましょう:
$ docker run -d --name mariadb1 \
-p 33061:3306 \
-v ~/Docker/mariadb1/config:/etc/mysql/conf.d \
-v ~/Docker/mariadb1/datadir:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=dbtest \
mariadb
この後、実行中のコンテナを確認できます:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
12805cc2d7b5 mariadb "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:33061->3306/tcp mariadb1
コンテナログ:
$ docker logs mariadb1
MySQL init process done. Ready for start up.
2019-06-03 23:18:01 0 [Note] mysqld (mysqld 10.3.15-MariaDB-1:10.3.15+maria~bionic) starting as process 1 ...
2019-06-03 23:18:01 0 [Note] InnoDB: Using Linux native AIO
2019-06-03 23:18:01 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2019-06-03 23:18:01 0 [Note] InnoDB: Uses event mutexes
2019-06-03 23:18:01 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2019-06-03 23:18:01 0 [Note] InnoDB: Number of pools: 1
2019-06-03 23:18:01 0 [Note] InnoDB: Using SSE2 crc32 instructions
2019-06-03 23:18:01 0 [Note] InnoDB: Initializing buffer pool, total size = 256M, instances = 1, chunk size = 128M
2019-06-03 23:18:01 0 [Note] InnoDB: Completed initialization of buffer pool
2019-06-03 23:18:01 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2019-06-03 23:18:01 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2019-06-03 23:18:01 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2019-06-03 23:18:01 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2019-06-03 23:18:02 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2019-06-03 23:18:02 0 [Note] InnoDB: Waiting for purge to start
2019-06-03 23:18:02 0 [Note] InnoDB: 10.3.15 started; log sequence number 1630824; transaction id 21
2019-06-03 23:18:02 0 [Note] Plugin 'FEEDBACK' is disabled.
2019-06-03 23:18:02 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2019-06-03 23:18:02 0 [Note] Server socket created on IP: '::'.
2019-06-03 23:18:02 0 [Note] InnoDB: Buffer pool(s) load completed at 190603 23:18:02
2019-06-03 23:18:02 0 [Note] Reading of all Master_info entries succeded
2019-06-03 23:18:02 0 [Note] Added new Master_info '' to hash table
2019-06-03 23:18:02 0 [Note] mysqld: ready for connections.
Version: '10.3.15-MariaDB-1:10.3.15+maria~bionic' socket: '/var/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
そして、Docker datadirパス(ホスト)のコンテンツ:
$ ls -l ~/Docker/mariadb1/datadir/
total 249664
-rw-rw---- 1 sinsausti staff 16384 Jun 3 20:18 aria_log.00000001
-rw-rw---- 1 sinsausti staff 52 Jun 3 20:18 aria_log_control
drwx------ 3 sinsausti staff 96 Jun 3 20:18 dbtest
-rw-rw---- 1 sinsausti staff 976 Jun 3 20:18 ib_buffer_pool
-rw-rw---- 1 sinsausti staff 50331648 Jun 3 20:18 ib_logfile0
-rw-rw---- 1 sinsausti staff 50331648 Jun 3 20:17 ib_logfile1
-rw-rw---- 1 sinsausti staff 12582912 Jun 3 20:18 ibdata1
-rw-rw---- 1 sinsausti staff 12582912 Jun 3 20:18 ibtmp1
-rw-rw---- 1 sinsausti staff 0 Jun 3 20:17 multi-master.info
drwx------ 92 sinsausti staff 2944 Jun 3 20:18 mysql
drwx------ 3 sinsausti staff 96 Jun 3 20:17 performance_schema
-rw-rw---- 1 sinsausti staff 24576 Jun 3 20:18 tc.log
次のコマンドを実行し、MYSQL_ROOT_PASSWORD変数で指定されたパスワードを使用してMariaDBコンテナーにアクセスできます。
$ docker exec -it mariadb1 bash
[email protected]:/# mysql -p -e "SHOW DATABASES;"
Enter password:
+--------------------+
| Database |
+--------------------+
| dbtest |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
ここで、作成されたdbtestを確認できます。
Dockerコマンド
最後に、Dockerを管理するための便利なコマンドをいくつか見てみましょう。
- 画像検索
$ docker search Image_Name
- 画像のダウンロード
$ docker pull Image_Name
- インストールされているイメージを一覧表示する
$ docker images
- コンテナを一覧表示します(フラグ-aを追加すると、停止したコンテナも表示されます)
$ docker ps -a
- Dockerイメージを削除する
$ docker rmi Image_Name
- Dockerコンテナを削除します(コンテナを停止する必要があります)
$ docker rm Container_Name
- Dockerイメージからコンテナーを実行します(コンテナーポートをローカルホストにマッピングできるフラグ-pを追加します)
$ docker run -d --name Container_Name -p Host_Port:Guest_Port Image_Name
- コンテナの停止
$ docker stop Container_Name
- コンテナの開始
$ docker start Container_Name
- コンテナログを確認する
$ docker logs Container_Name
- コンテナ情報を確認する
$ docker inspect Container_Name
- リンクされたコンテナを作成します
$ docker run -d --name Container_Name --link Container_Name:Image_Name Image_Name
- ローカルホストからコンテナに接続します
$ docker exec -it Container_Name bash
- ボリュームが追加されたコンテナを作成します
$ docker run -d --name Container_Name --volume=/home/docker/Container_Name/conf.d:/etc/mysql/conf.d Image_Name
- 新しいイメージへの変更をコミットします
$ docker commit Container_ID Image_Name:TAG
結論
Dockerは、Dockerfileを使用して開発環境を簡単に共有したり、Dockerイメージを公開したりするための非常に便利なツールです。これを使用することで、全員が同じ環境を使用していることを確認できます。同時に、既存の環境を再作成または複製することも役立ちます。 Dockerは、ボリュームの共有、プライベートネットワークの使用、ポートのマップなどを行うことができます。
このブログでは、MariaDBサーバーをスタンドアロンサーバーとしてDockerにデプロイする方法を説明しました。レプリケーションやGaleraClusterなどのより複雑な環境を使用する場合は、bitnami/mariadbを使用してこの構成を実現できます。