ユーザーから寄せられる最も一般的な質問のいくつかは、DockerでのMariaDBのサポート、特に特定の開発または本番環境での使用方法に関するものです。この一連の記事では、DockerとMariaDBのいくつかのユースケースについて説明します。
MariaDBにDockerを選択する理由
- Dockerコンテナを使用して、任意の環境内でアプリケーションをテスト、デプロイ、リリースできます。
- Dockerのデプロイは簡単に自動化でき、デプロイ環境を作成して、ステージングと本番環境で簡単に再現できます。
- Dockerは軽量の仮想化です。ハイパーバイザーは必要ありません。MariaDBDockerコンテナは、目立ったオーバーヘッドなしに、通常のMariaDBインストールと同じように機能するはずです。
- Dockerは不可知論者です。OSにDockerをインストールすると、CentOS、Debian、Ubuntu、さらにはMac OS XとWindowsのいずれを実行していても、コンテナを実行する手順はまったく同じです。
Dockerコンテナに関するいくつかの重要なポイント
- Dockerコンテナは不変です。開始後に簡単に変更することはできません(アタッチしてすべてを壊さない限り)。
- デフォルトでは、上記の理由により、データは永続的ではありません。 Dockerは、データボリュームを使用してこれを修正します。 MariaDBコンテナーは、ボリュームを使用してデータを保持します(これについては後で詳しく説明します)。
DockerでのMariaDBの状態
MariaDBは、Dockerチームとコミュニティによる多くの努力のおかげで、Dockerで常に非常によくサポートされてきました。現在まで、Dockerは5.5、10.0、10.1の3つのMariaDBリリースすべてをサポートしています。 MariaDB Dockerコンテナには、次の特徴があります。
- MariaDBルートパスワードは、環境変数を介して設定または生成できます。
- 上記と同じプロセスで、新しいユーザーと空のデータベースを作成できます。
- インスタンスにはデフォルトの/var/ lib / mysql永続データボリュームがあり、dockerに内部で管理させたり、選択したディレクトリにマウントしたりできます。
- コンテナインスタンスは、既存のデータボリューム(バックアップなど)にマウントできます。
- ネットワークポートは、ホスト側の任意のポートにバインドできます。
- MariaDBナレッジベースには、Dockerに関する広範なドキュメント記事があります。読んでください!
Dockerのユースケース#1:マルチテナンシー
MariaDBとDockerの一般的な使用例は、同じ物理ホスト上でMariaDBの複数のインスタンスを実行することです。 MySQL Sandboxなどの既存のソリューションはすでに存在しますが、Dockerが提供する柔軟性、使いやすさ、パワーを提供するソリューションはありません。
私たちのポイントを説明するために、MariaDBの3つの異なるインスタンスを開始しましょう。それぞれが、異なるメジャーバージョンを実行しています。
docker run -d -p 3301:3306 -v ~/mdbdata/mdb55:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 -v ~/mdbdata/mdb10:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb10 mariadb:10.0
docker run -d -p 3303:3306 -v ~/mdbdata/mdb11:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb11 mariadb:10.1
Dockerは、リポジトリから公式のmariadbイメージを自動的にプルし、それらを起動します。これで、提供されたポートとパスワードを使用して、これらのインスタンスのいずれかに簡単に接続できます。
$ mysql -u root -padmin -h 127.0.0.1 -P3302 Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 2 Server version: 10.0.22-MariaDB-1~jessie mariadb.org binary distribution
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
各インスタンスは、〜/ mdbdataの下にある永続データボリュームを使用することに注意してください。 ディレクトリ–Dockerがこのディレクトリツリーを自動的に作成します。
これで、Dockerの高度な機能について詳しく見ていきましょう。 DockerはLinuxコントロールグループ(cgroups)をサポートしており、リソースの使用を制限、説明、または分離するために使用できます。 MariaDB 10.1インスタンス( mdb11 という名前)が必要だとします。 )他の2つのインスタンスよりも高いCPU優先度を持つ。この場合、 mdb10のCPUシェアを下げることができます。 およびmdb55 。各インスタンスにはデフォルトで最大1024のCPU共有があるため、 mdb55を再作成してみましょう。 およびmdb10 それぞれ512個のCPU共有を持つコンテナ。
前文で、Dockerコンテナは不変であると述べました。コンテナのパラメータを変更する場合は、それらを削除する必要があります。 〜/ mdbdataで永続データボリュームを定義しているため、これは問題ではありません。したがって、コンテナを再作成しても、データベースの実際のコンテンツは永続します。
docker rm -f mdb55 mdb10
docker run -d -p 3301:3306 --cpu-shares=512 -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --cpu-shares=512 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
それぞれ512個のCPU共有を持つ2つのMariaDBインスタンスを再作成しました。ただし、これはソフト制限であり、プロセスがCPUサイクルをめぐって競合する場合にのみ適用されます。他のインスタンスがアイドル状態の場合、どのインスタンスもすべてのCPUを最大100%使用できます。実際には、これは、3つのインスタンスすべてがCPUを同時に使用する場合、それぞれ512の共有を持つ最初の2つのコンテナー( mdb55 )のそれぞれを意味します。 およびmdb10 )はすべてのCPUの最大25%を使用できますが、1024の共有を持つ3番目のコンテナはすべてのCPUの最大50%を使用できます。
もう1つのオプションは、インスタンスを特定のCPUコアにバインドすることです。そこで、コンテナーを再作成して、それを実行しましょう。
docker rm -f mdb55 mdb10 mdb11
docker run -d -p 3301:3306 --cpuset-cpus=0 -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --cpuset-cpus=1 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
docker run -d -p 3303:3306 --cpuset-cpus=2-3 -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb11 mariadb:10.1
上記の例では、4 CPUコアシステムが与えられた場合、私のコンテナは mdb55 およびmdb10 mdb11 に対して、それぞれが個別の単一CPUコアで実行されます 両方のコアが残ります。
また、コンテナがディスクとメモリリソースにアクセスする方法を制御することもできます。これは、ビジー状態のシステムで間違いなく役立ちます。たとえば、負荷テストインスタンスのすべてのディスクを使用して開発クエリが暴走することは望ましくありません。メモリ制限は単純ですが、ブロックIO共有はCPU共有と同じように機能しますが、デフォルトのブロックIO共有が10〜1000の範囲で500である点が異なります。
最初の2つのコンテナを512Mのメモリと250ブロックのIO共有に制限しましょう:
docker rm -f mdb55 mdb10
docker run -d -p 3301:3306 --blkio-weight=250 --memory=512M -v ~/mdbdata/mdb55:/var/lib/mysql --name mdb55 mariadb:5.5
docker run -d -p 3302:3306 --blkio-weight=250 --memory=512M -v ~/mdbdata/mdb10:/var/lib/mysql --name mdb10 mariadb:10.0
CPU共有の例で見たのと同様に、3つのインスタンスがIOをめぐって競合する場合、最初の2つのコンテナーはそれぞれ使用可能なIO容量の25%に制限され、3番目のコンテナーは残りの容量に制限されます。 50%。
Dockerランタイムの制約には、この記事でここで話していることよりもはるかに多くのものがあります。考えられるすべてのオプションについては、Dockerの広範な実行リファレンスをお読みください。