sql >> データベース >  >> RDS >> MariaDB

MariaDBサーバーをDockerコンテナにデプロイする方法

    現在、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を使用してこの構成を実現できます。


    1. 集計関数を使用したSQLGROUPBYCASEステートメント

    2. OracleINTERSECTオペレーターの説明

    3. バックエンドパフォーマンスの改善パート2/3:データベースインデックスの使用

    4. SQLServerで結果をページ分割するための最良の方法は何ですか