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

スタックの構成-MySQLコンテナのDockerデプロイメントを簡素化する

    Docker 1.13には、compose-file supportと呼ばれる待望の機能が導入されています。これにより、単一の長いコマンドの代わりに、単純な構成ファイルを使用してコンテナーを定義できます。以前の「MySQLonDocker」ブログの投稿をご覧になると、複数の長いコマンドラインを使用してコンテナーとサービスを実行していました。 compose-fileを使用することにより、コンテナーを簡単に指定してデプロイできます。これにより、複数のパラメータを持つ長いコマンドを覚えておく必要がないため、人為的エラーのリスクが軽減されます。

    このブログ投稿では、MySQLのデプロイメントに関する簡単な例を使用して、compose-fileの使用方法を紹介します。 Docker Engine 1.13が3つの物理ホストにインストールされており、Swarmモードがすべてのホストに構成されていることを前提としています。

    作成ファイルの概要

    作成ファイルでは、Dockerコマンドに渡す必要のあるすべての引数を記憶しようとするのではなく、すべてをYAML形式で指定します。ここでサービス、ネットワーク、ボリュームを定義できます。定義はDockerによって取得され、コマンドラインパラメーターを「dockerrun | network|volume」コマンドに渡すのと非常によく似ています。

    はじめに、単純なスタンドアロンのMySQLコンテナをデプロイします。作成ファイルの作成を開始する前に、まず実行コマンドを知っておく必要があります。 Dockerブログシリーズの最初のMySQLから抜粋して、次の「dockerrun」コマンドを作成しましょう。

    $ docker run --detach \
    --name=test-mysql \
    --publish 6603:3306 \
    --env="MYSQL_ROOT_PASSWORD=mypassword" \
    -v /storage/docker/mysql-datadir:/var/lib/mysql \
    mysql

    docker-composeコマンドは、現在のディレクトリで「docker-compose.yml」というデフォルトのファイルを検索します。したがって、最初に必要なディレクトリを事前に作成しましょう:

    $ mkdir -p ~/compose-files/mysql/single
    $ mkdir -p /storage/docker/mysql-datadir
    $ cd ~/compose-files/mysql/single

    YAMLでは、次のように書く必要があります:

    version: '2'
    
    services:
      mysql:
        image: mysql
        container_name: test-mysql
        ports:
          - 6603:3306
        environment:
          MYSQL_ROOT_PASSWORD: "mypassword"
        volumes:
          - /storage/docker/mysql-datadir:/var/lib/mysql

    上記のコンテンツを「〜/ compose-files / mysql / single/docker-compose.yml」に保存します。現在のディレクトリ〜/ compose-files / mysql / singleにいることを確認してから、次のコマンドを実行して起動します。

    $ docker-compose up -d
    WARNING: The Docker Engine you're using is running in swarm mode.
    
    Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
    
    To deploy your application across the swarm, use `docker stack deploy`.
    
    Creating test-mysql

    コンテナがデタッチモードで実行されているかどうかを確認します:

    [[email protected] single]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    379d5c15ef44        mysql               "docker-entrypoint..."   8 minutes ago       Up 8 minutes        0.0.0.0:6603->3306/tcp   test-mysql

    おめでとう!これで、1つのコマンドで実行されるMySQLコンテナができました。

    スタックのデプロイ

    作成ファイルは物事を簡素化し、インフラストラクチャがどのように見えるべきかについてのより明確なビューを提供します。専用ネットワークの下でMySQLインスタンスを使用して、Drupalで実行されているWebサイトで構成されるコンテナースタックを作成し、それらをリンクしてみましょう。

    上記と同様に、このスタックを構築するための正しい順序でコマンドラインバージョンを見てみましょう。

    $ docker volume create mysql_data
    $ docker network create drupal_mysql_net --driver=bridge
    $ docker run -d --name=mysql-drupal --restart=always -v mysql_data:/var/lib/mysql --net=drupal_mysql_net -e MYSQL_ROOT_PASSWORD="mypassword" -e MYSQL_DATABASE="drupal" mysql
    $ docker run -d --name=drupal -p 8080:80 --restart=always -v /var/www/html/modules -v /var/www/html/profiles -v /var/www/html/themes -v /var/www/html/sites --link mysql:mysql --net=drupal_mysql_net drupal

    作成を開始するには、まず新しいスタック用のディレクトリを作成しましょう。

    $ mkdir -p ~/compose-files/drupal-mysql
    $ cd ~/compose-files/drupal-mysql

    次に、以下のようにdocker-compose.ymlの書き込みコンテンツを作成します。

    version: '2'
    
    services:
      mysql:
        image: mysql
        container_name: mysql-drupal
        environment:
          MYSQL_ROOT_PASSWORD: "mypassword"
          MYSQL_DATABASE: "drupal"
        volumes:
          - mysql_data:/var/lib/mysql
        restart: always
        networks:
          - drupal_mysql_net
    
      drupal:
        depends_on:
          - mysql
        image: drupal
        container_name: drupal
        ports:
          - 8080:80
        volumes:
          - /var/www/html/modules
          - /var/www/html/profiles
          - /var/www/html/themes
          - /var/www/html/sites
        links:
          - mysql:mysql
        restart: always
        networks:
          - drupal_mysql_net
    
    volumes:
      mysql_data:
    
    networks:
      drupal_mysql_net:
        driver: bridge

    それらを起動します:

    $ docker-compose up -d
    ..
    Creating network "drupalmysql_drupal_mysql_net" with driver "bridge"
    Creating volume "drupalmysql_mysql_data" with default driver
    Pulling drupal (drupal:latest)...
    ..
    Creating mysql-drupal
    Creating drupal

    Dockerは次のようにデプロイを実行します:

    1. ネットワークを作成する
    2. ボリュームを作成する
    3. 画像をプルする
    4. mysql-drupalを作成します(コンテナー「drupal」はそれに依存しているため)
    5. drupalコンテナを作成する

    この時点で、私たちのアーキテクチャは次のように説明できます。

    次に、両方のコンテナが相互にリンクされているため、インストールウィザードページでMySQLホストとして「mysql」を指定できます。それでおしまい。それらを破棄するには、同じディレクトリで次のコマンドを実行するだけです。

    $ docker-compose down

    対応するコンテナは終了し、それに応じて削除されます。 docker-composeコマンドは、Dockerを実行している個々の物理ホストにバインドされていることに注意してください。 Swarm全体で複数の物理ホストで実行するには、「dockerstack」コマンドを使用して異なる方法で処理する必要があります。これについては次のセクションで説明します。

    Docker上のSevereninesMySQL:データベースをコンテナ化する方法Dockerコンテナ仮想化の上でMySQLサービスを実行することを検討する際に理解する必要があるすべてを発見するホワイトペーパーをダウンロードする

    群れ全体でスタックを構成する

    まず、Dockerエンジンがv1.13で実行されており、Swarmモードが有効で準備完了状態になっていることを確認します。

    $ docker node ls
    ID                           HOSTNAME       STATUS  AVAILABILITY  MANAGER STATUS
    8n8t3r4fvm8u01yhli9522xi9 *  docker1.local  Ready   Active        Reachable
    o1dfbbnmhn1qayjry32bpl2by    docker2.local  Ready   Active        Reachable
    tng5r9ax0ve855pih1110amv8    docker3.local  Ready   Active        Leader

    Docker Swarmモードでスタック機能を使用するには、DockerComposeバージョン3形式を使用する必要があります。 MySQLバックエンドとしての3ノードのGaleraセットアップを除いて、上記と同様のセットアップをデプロイします。このブログ投稿ですでに詳細に説明しました。

    まず、新しいスタック用のディレクトリを作成します。

    $ mkdir -p ~/compose-files/drupal-galera
    $ cd ~/compose-files/drupal-galera

    次に、次の行を「docker-compose.yml」に追加します。

    version: '3'
    
    services:
    
      galera:
        deploy:
          replicas: 3
          restart_policy:
            condition: on-failure
            delay: 30s
            max_attempts: 3
            window: 60s
          update_config:
            parallelism: 1
            delay: 10s
            max_failure_ratio: 0.3
        image: severalnines/pxc56
        environment:
          MYSQL_ROOT_PASSWORD: "mypassword"
          CLUSTER_NAME: "my_galera"
          XTRABACKUP_PASSWORD: "mypassword"
          DISCOVERY_SERVICE: '192.168.55.111:2379,192.168.55.112:2379,192.168.55.207:2379'
          MYSQL_DATABASE: 'drupal'
        networks:
          - galera_net
    
      drupal:
        depends_on:
          - galera
        deploy:
          replicas: 1
        image: drupal
        ports:
          - 8080:80
        volumes:
          - drupal_modules:/var/www/html/modules
          - drupal_profile:/var/www/html/profiles
          - drupal_theme:/var/www/html/themes
          - drupal_sites:/var/www/html/sites
        networks:
          - galera_net
    
    volumes:
      drupal_modules:
      drupal_profile:
      drupal_theme:
      drupal_sites:
    
    networks:
      galera_net:
        driver: overlay

    使用したGaleraイメージ(severalnines / pxc56)には、各Docker物理ホストにインストールされた実行中のetcdクラスターが必要であることに注意してください。前提条件の手順については、このブログ投稿を参照してください。

    作成ファイルの重要な部分の1つは、restart_policyセクションのmax_attemptsパラメーターです。失敗した場合の再起動回数に厳しい制限を指定する必要があります。これにより、デフォルトでは、Swarmスケジューラーがコンテナーの再起動の試行をあきらめることがないため、デプロイメントプロセスがより安全になります。これが発生した場合、スケジューラーがコンテナーを目的の状態に戻すことができないと、プロセスループは物理ホストのディスクスペースを使用できないコンテナーでいっぱいにします。これは、MySQLのようなステートフルサービスを処理する場合の一般的なアプローチです。一貫性のない状態で実行するのではなく、完全に停止することをお勧めします。

    それらをすべて開始するには、docker-compose.ymlが存在する同じディレクトリで次のコマンドを実行するだけです。

    $ docker stack deploy --compose-file=docker-compose.yml my_drupal

    スタックが2つのサービス(drupalとgalera)で作成されていることを確認します:

    $ docker stack ls
    NAME       SERVICES
    my_drupal  2

    作成したスタック内の現在のタスクを一覧表示することもできます。結果は、「dockerservicepsmy_drupal_galera」コマンドと「dockerservicepsmy_drupal_drupal」コマンドを組み合わせたバージョンです。

    $ docker stack ps my_drupal
    ID            NAME                IMAGE                      NODE           DESIRED STATE  CURRENT STATE           ERROR  PORTS
    609jj9ji6rxt  my_drupal_galera.1  severalnines/pxc56:latest  docker3.local  Running        Running 7 minutes ago
    z8mcqzf29lbq  my_drupal_drupal.1  drupal:latest              docker1.local  Running        Running 24 minutes ago
    skblp9mfbbzi  my_drupal_galera.2  severalnines/pxc56:latest  docker1.local  Running        Running 10 minutes ago
    cidn9kb0d62u  my_drupal_galera.3  severalnines/pxc56:latest  docker2.local  Running        Running 7 minutes ago

    CURRENT STATEをRUNNINGとして取得したら、ポート8080でDockerホストのIPアドレスまたはホスト名のいずれかに接続することでDrupalのインストールを開始できます。この場合、docker3を使用しました(drupalコンテナーはdocker1にデプロイされています)。http ://192.168.55.113:8080/。インストールを続行し、MySQLホストとして「galera」を指定し、データベース名として「drupal」を指定します(MYSQL_DATABASE環境変数の下のcompose-fileで定義されています):

    それでおしまい。スタックの展開は、Compose-fileを使用して簡略化されました。この時点で、私たちのアーキテクチャは次のようになっています。

    最後に、スタックを削除するには、次のコマンドを実行するだけです。

    $ docker stack rm my_drupal
    Removing service my_drupal_galera
    Removing service my_drupal_drupal
    Removing network my_drupal_galera_net

    長いコマンドラインで作業する場合と比較して、compose-fileを使用すると、時間を節約し、人的エラーのリスクを減らすことができます。これは、マルチコンテナーDockerアプリケーションを操作する前に習得するのに最適なツールであり、複数のデプロイメント環境(dev、test、staging、pre-prod、prodなど)を処理し、MySQLGaleraClusterのようにはるかに複雑なサービスを処理します。幸せなコンテナ化


    1. MySQLでのMyISAMの操作

    2. ALTERTABLEステートメントに「ONDELETECASCADE」を追加する方法

    3. いつテーブル値関数を使用しますか?

    4. SQLServerで列をNullからNotNullに変更する方法