序章

Docker Compose を使用すると、Dockerコンテナーのオーケストレーションプロセス(コンテナー内のリンクとボリュームの起動、シャットダウン、セットアップなど)を非常に簡単に処理できます。

この記事では、Docker Composeを使用してアプリケーションをインストールする実際の例を示します。この場合は、WordPressとPHPMyAdminを追加でインストールします。 WordPressは通常LAMPスタックで実行されます。つまり、Linux、Apache、MySQL / MariaDB、およびPHPです。 公式のWordPressDockerイメージにはApacheとPHPが含まれているため、心配する必要があるのはMariaDBだけです。

前提条件

この記事をフォローするには、次のものが必要です。

  • Ubuntu14.04ドロップレット
  • sudo権限を持つroot以外のユーザー( Ubuntu 14.04 を使用した初期サーバーセットアップでは、これをセットアップする方法について説明しています。)
  • Ubuntu14.04にDockerComposeをインストールして使用する方法の手順からインストールされたDockerとDockerCompose

ステップ1—WordPressをインストールする

公式のWordPressおよびMariaDBDockerイメージを使用します。 興味がある場合は、それぞれのGitHubページとDocker Hubページに、これらのイメージとその構成オプションに関する詳細情報があります。

データが保存されるフォルダーを作成し、WordPressコンテナーを実行するための最小限のdocker-compose.ymlファイルを作成することから始めましょう。

mkdir ~/wordpress && cd $_

次に、お気に入りのテキストエディタで~/wordpress/docker-compose.ymlを作成します(設定がない場合はnanoは簡単です)。

  1. nano ~/wordpress/docker-compose.yml

次のように貼り付けます。

〜/ wordpress / docker-compose.yml
wordpress:
  image: wordpress

これは、DockerComposeにwordpressという新しいコンテナーを起動し、DockerHubからwordpressイメージをダウンロードするように指示するだけです。

次のように画像を表示できます。

  1. docker-compose up

DockerがDockerHubからWordPressイメージをダウンロードして抽出し、しばらくすると、次のようなエラーメッセージが表示されます。

Output
wordpress_1 | error: missing WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP environment variables wordpress_1 | Did you forget to --link some_mysql_container:mysql or set an external db wordpress_1 | with -e WORDPRESS_DB_HOST=hostname:port? dockercompose_wordpress_1 exited with code 1

これは、データベースが見つからないと不平を言っているWordPressです。 ミックスにMariaDBイメージを追加し、それをリンクして修正しましょう。

ステップ2—MariaDBをインストールする

MariaDBイメージをグループに追加するには、テキストエディタでdocker-compose.ymlを再度開きます。

nano ~/wordpress/docker-compose.yml

docker-compose.ymlを以下に一致するように変更します(インデントに注意してください。YAMLファイルは空白に敏感です)

docker-compose.yml
wordpress:
  image: wordpress
  links:
    - wordpress_db:mysql
wordpress_db:
  image: mariadb

ここで行ったことは、wordpress_dbという新しいコンテナーを定義し、DockerHubのmariadbイメージを使用するように指示したことです。 また、wordpressコンテナに、wordpress_dbコンテナをwordpressコンテナにリンクし、mysqlwordpressコンテナ内)と呼ぶように指示しました。ホスト名mysqlwordpress_dbコンテナに転送されます)。

docker-compose upを再度実行すると、MariaDBイメージがダウンロードされ、まだそこにいないことがわかります。

Output
wordpress_db_1 | error: database is uninitialized and MYSQL_ROOT_PASSWORD not set wordpress_db_1 | Did you forget to add -e MYSQL_ROOT_PASSWORD=... ? wordpress_1 | error: missing required WORDPRESS_DB_PASSWORD environment variable wordpress_1 | Did you forget to -e WORDPRESS_DB_PASSWORD=... ? wordpress_1 | wordpress_1 | (Also of interest might be WORDPRESS_DB_USER and WORDPRESS_DB_NAME.) wordpress_wordpress_db_1 exited with code 1 wordpress_wordpress_1 exited with code 1 Gracefully stopping... (press Ctrl+C again to force)

WordPressはまだデータベースが見つからないという苦情を言っていますが、今では、rootパスワードが設定されていないというMariaDBからの新しい苦情があります。

2つのコンテナをリンクするだけでは十分ではないようです。 先に進み、MYSQL_ROOT_PASSWORD変数を設定して、実際にこれを起動できるようにします。

DockerComposeファイルをもう一度編集します。

  1. nano ~/wordpress/docker-compose.yml

これらの2行をwordpress_dbセクションのendに追加しますが、必ずexamplepassをより安全なパスワードに変更してください!

docker-compose.yml
wordpress_db:
...
  environment:
    MYSQL_ROOT_PASSWORD: examplepass
...

これにより、wordpress_dbコンテナ内にMYSQL_ROOT_PASSWORDという環境変数が希望のパスワードで設定されます。 MariaDB Dockerイメージは、起動時にこの環境変数をチェックするように構成されており、MYSQL_ROOT_PASSWORDとして定義されたパスワードを持つrootアカウントでDBをセットアップします。

その間、ポートフォワードを設定して、WordPressインストールが実際にロードされたら接続できるようにします。 wordpressセクションの下に、次の2行を追加します。

docker-compose.yml
wordpress:
...
  ports:
    - 8080:80
...

最初のポート番号はホストのポート番号であり、2番目のポート番号はコンテナ内のポートです。 したがって、この構成では、ホストのポート8080での要求が、コンテナー内のデフォルトのWebサーバーのポート80に転送されます。

注: WordPressをホストのデフォルトのWebサーバーポート80で実行する場合は、前の行を80:80に変更して、ホストのポート80へのリクエストがポートに転送されるようにします。 WordPressコンテナ内の80。

完全なdocker-compose.ymlファイルは次のようになります。

docker-compose.yml
wordpress:
  image: wordpress
  links:
    - wordpress_db:mysql
  ports:
    - 8080:80
wordpress_db:
  image: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: examplepass

この構成では、実際に先に進んでWordPressを起動できます。 今回は、-dオプションを指定して実行します。これにより、docker-composeにコンテナーをバックグラウンドで実行するように指示され、ターミナルを引き続き使用できるようになります。

  1. docker-compose up -d

たくさんのテキストが画面のそばを飛んでいるのがわかります。 落ち着いたら、Webブラウザーを開き、ポート8080でDigitalOceanボックスのIPを参照します(たとえば、サーバーのIPアドレスが 123.456.789.123 の場合は、httpと入力する必要があります。 ://123.456.789.123:8080 をブラウザに追加します。)

新しいWordPressインストールページが表示され、通常どおりインストールとブログを完了できるはずです。

これらは両方とも公式のDockerイメージであり、Dockerのすべてのベストプラクティスに従っているため、これらの各イメージには事前定義された永続的なボリュームがあります。つまり、コンテナーを再起動しても、ブログの投稿はそのまま残ります。 Dockerボリュームの操作について詳しくは、Dockerデータボリュームチュートリアルをご覧ください。

ステップ3—PhpMyAdminコンテナを追加する

素晴らしい、それは比較的痛みがなかった。 少し凝ってみよう。

これまでは公式の画像のみを使用してきましたが、Dockerチームはこれを正確に確認するために多大な労力を費やしています。 WordPressコンテナに設定するための環境変数を指定する必要がないことに気付いたかもしれません。 適切に構成されたMariaDBコンテナーにリンクするとすぐに、すべてが機能しました。

これは、WordPress Dockerコンテナー内に、wordpress_dbコンテナーからMYSQL_ROOT_PASSWORD変数を実際に取得し、それを使用してWordPressに接続するスクリプトがあるためです。

公式の画像領域から少し離れて、コミュニティが提供するPhpMyAdmin画像を使用してみましょう。 先に進み、docker-compose.ymlをもう一度編集します。

  1. nano docker-compose.yml

ファイルの最後に以下を貼り付けます。

docker-compose.yml
phpmyadmin:
  image: corbinu/docker-phpmyadmin
  links:
    - wordpress_db:mysql
  ports:
    - 8181:80
  environment:
    MYSQL_USERNAME: root
    MYSQL_ROOT_PASSWORD: examplepass

examplepass は、前に設定したwordpress_dbコンテナとまったく同じルートパスワードに置き換えてください。

これは、コミュニティメンバーcorbinuによってdocker-phpmyadminを取得し、mysqlという名前のwordpress_dbコンテナーにリンクします(phpmyadminコンテナー内からの意味)ホスト名mysqlへの参照はwordpress_dbコンテナーに転送され、ホストシステムのポート8181でポート80を公開し、最後にMariaDBのユーザー名とパスワードを使用していくつかの環境変数を設定します。 このイメージは、wordpressイメージのように、wordpress_dbコンテナの環境からMYSQL_ROOT_PASSWORD環境変数を自動的に取得しません。 実際には、MYSQL_ROOT_PASSWORD: examplepass行をwordpress_dbコンテナーからコピーし、ユーザー名をrootに設定する必要があります。

完全なdocker-compose.ymlファイルは次のようになります。

docker-compose.yml
wordpress:
  image: wordpress
  links:
    - wordpress_db:mysql
  ports:
    - 8080:80
wordpress_db:
  image: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: examplepass
phpmyadmin:
  image: corbinu/docker-phpmyadmin
  links:
    - wordpress_db:mysql
  ports:
    - 8181:80
  environment:
    MYSQL_USERNAME: root
    MYSQL_ROOT_PASSWORD: examplepass

次に、アプリケーショングループを再度起動します。

  1. docker-compose up -d

PhpMyAdminがインストールされているのがわかります。 完了したら、サーバーのIPアドレスに再度アクセスします(今回はポート8181を使用します。例: http://123.456.789.123:8181 )。 PhpMyAdminのログイン画面が表示されます。

先に進み、YAMLファイルで設定したユーザー名rootとパスワードを使用してログインすると、データベースを参照できるようになります。 サーバーにwordpressデータベースが含まれていることに気付くでしょう。このデータベースには、WordPressインストールからのすべてのデータが含まれています。

この方法で好きなだけコンテナを追加し、好きな方法でそれらをすべてリンクすることができます。 ご覧のとおり、このアプローチは非常に強力です。個々のコンポーネントの構成と前提条件を処理し、それらをすべて同じサーバーに設定する代わりに、レゴブロックのようにそれらをつなぎ合わせて、コンポーネントを少しずつ追加することができます。 Docker Swarm などのツールを使用すると、これらのコンテナーを複数のサーバー上で透過的に実行することもできます。 ただし、これはこのチュートリアルの範囲外です。 興味があれば、Dockerにはドキュメントがいくつか用意されています。

ステップ4—WordPressサイトを作成する

新しいWordPressサイトのすべてのファイルはDockerコンテナー内に保存されているため、コンテナーを停止して再開すると、ファイルはどうなりますか?

デフォルトでは、WordPressコンテナのドキュメントルートは永続的です。 これは、DockerHubのWordPressイメージがこのように構成されているためです。 WordPressサイトに変更を加え、アプリケーショングループを停止して再開しても、Webサイトには変更が加えられたままになります。

試してみよう。

WebブラウザからWordPressにアクセスします(例: http://123.456.789.123:8080 )。 すでに存在するHelloWorld!投稿を編集します。 次に、次のコマンドを使用してすべてのDockerコンテナを停止します。

  1. docker-compose stop

WordPressサイトをもう一度読み込んでみてください。 Webサイトがダウンしていることがわかります。 Dockerコンテナーを再起動します。

  1. docker-compose up -d

もう一度、WordPressサイトをロードします。 ブログサイトと以前に行った変更が表示されます。 これは、コンテナが停止している場合でも、行った変更が保存されることを示しています。

手順5—ドキュメントルートをホストファイルシステムに保存する(オプション)

Dockerデータボリュームを使用してホストファイルシステムにWordPressのドキュメントルートを保存し、ホストとコンテナ間でファイルを共有することができます。

注: Dockerデータボリュームの操作の詳細については、Dockerデータボリュームのチュートリアルを参照してください。

やるだけやってみよう。 docker-compose.ymlファイルをもう一度開きます。

nano ~/wordpress/docker-compose.yml

wordpress:セクションに、次の行を追加します。

〜/ wordpress / docker-compose.yml
wordpress:
...
  volumes:
    - ~/wordpress/wp_html:/var/www/html
    ...

現在実行中のdocker-composeセッションを停止します。

  1. docker-compose stop

ボリュームをホストファイルシステムにマップできるように、既存のコンテナを削除します。

  1. docker-compose rm wordpress

WordPressを再起動します:

  1. docker-compose -d

プロンプトが戻ったら、WordPressが再び稼働しているはずです。今回は、ホストファイルシステムを使用してドキュメントルートを保存します。

~/wordpressディレクトリを見ると、wp_htmlディレクトリが含まれていることがわかります。

  1. ls ~/wordpress

すべてのWordPressソースファイルはその中にあります。 行った変更は、WordPressコンテナによってリアルタイムで取得されます。

このエクスペリエンスは通常よりも少しスムーズでした。WordPressDockerコンテナーは、起動時に/var/www/htmlが空かどうかをチェックし、そこにファイルを適切にコピーするように構成されています。 通常、この手順は自分で行う必要があります。

結論

完全なWordPressをデプロイして実行する必要があります。 同じ方法を使用して、DockerHubで利用可能なイメージを使用して非常に多種多様なシステムをデプロイできるはずです。 どのボリュームが永続的で、どのボリュームが作成する各コンテナー用ではないかを必ず把握してください。

ハッピードッカー!