前書き
Docker Composeを使用すると、Dockerコンテナーのオーケストレーションプロセス(コンテナー内のリンクとボリュームの起動、シャットダウン、セットアップなど)を非常に簡単に処理できます。
この記事では、Docker Composeを使用してアプリケーション(この場合は追加のPHPMyAdminを使用したWordPress)をインストールする実際の例を示します。 WordPressは通常、LAMPスタックで実行されます。これは、Linux、Apache、MySQL / MariaDB、およびPHPを意味します。 公式のWordPress DockerイメージにはApacheとPHPが含まれているため、心配する必要があるのはMariaDBだけです。
前提条件
この記事を読むには、次のものが必要です。
-
Ubuntu 14.04ドロップレット
-
sudo権限を持つroot以外のユーザー(Initial Server Setup with Ubuntu 14.04は、これを設定する方法を説明しています)。
-
How To Install and Use Docker Compose on Ubuntu 14.04の手順からインストールされたDockerおよびDocker Compose
[[step-1 -—- installing-wordpress]] ==ステップ1—WordPressのインストール
公式のhttps://hub.docker.com//wordpress/[WordPress] and https://hub.docker.com/ / mariadb / [MariaDB] Dockerイメージを使用します。 興味がある場合は、GitHubおよびDocker Hubの各ページにこれらの画像とその構成オプションに関する詳細情報があります。
データを保存するフォルダーを作成し、WordPressコンテナーを実行するための最小限のdocker-compose.yml
ファイルを作成することから始めましょう。
mkdir ~/wordpress && cd $_
次に、お気に入りのテキストエディタで~/wordpress/docker-compose.yml
を作成します(設定がない場合はnanoは簡単です)。
nano ~/wordpress/docker-compose.yml
そして、以下を貼り付けます:
~/wordpress/docker-compose.yml
wordpress:
image: wordpress
これは、Docker Composeにwordpress
という新しいコンテナを起動し、Docker Hubからwordpress
イメージをダウンロードするように指示するだけです。
次のように画像を表示できます。
docker-compose up
Dockerがダウンロードされ、Docker HubからWordPressイメージが抽出されます。しばらくすると、次のようなエラーメッセージが表示されます。
Outputwordpress_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イメージをミックスに追加し、それをリンクして修正します。
[[step-2 -—- installing-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
という新しいコンテナを定義し、Docker Hubのmariadb
イメージを使用するように指示したことです。 また、wordpress
コンテナにwordpress_db
コンテナをwordpress
コンテナにリンクし、それをmysql
(wordpress
コンテナ内でホスト名mysql
と呼ぶように指示しました。 )sはwordpress_db
コンテナに転送されます)。
docker-compose up
を再度実行すると、MariaDBイメージがダウンロードされていることがわかります。また、まだ十分ではないこともわかります。
Outputwordpress_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はまだデータベースを見つけることができないと不平を言っており、現在、MariaDBからrootパスワードが設定されていないという新しい不満があります。
2つのコンテナをリンクするだけでは十分ではないようです。 先に進み、MYSQL_ROOT_PASSWORD
変数を設定して、実際にこれを起動できるようにします。
Docker Composeファイルをもう一度編集します。
nano ~/wordpress/docker-compose.yml
これらの2行をwordpress_db
セクションのendに追加しますが、make sure to change examplepass
to a more secure password!
docker-compose.yml
wordpress_db:
...
environment:
MYSQL_ROOT_PASSWORD: examplepass
...
これにより、MYSQL_ROOT_PASSWORD
というwordpress_db
コンテナ内に、必要なパスワードを使用して環境変数が設定されます。 MariaDB Dockerイメージは、起動時にこの環境変数をチェックするように構成されており、MYSQL_ROOT_PASSWORD
として定義されたパスワードを持つrootアカウントでDBをセットアップします。
また、WordPressインストールが実際に読み込まれたときに接続できるように、ポートを前方に設定します。 wordpress
セクションの下に、次の2行を追加します。
docker-compose.yml
wordpress:
...
ports:
- 8080:80
...
最初のポート番号はホスト上のポート番号であり、2番目のポート番号はコンテナ内のポートです。 そのため、この構成では、ホストのポート8080のリクエストをコンテナ内のデフォルトのWebサーバーポート80に転送します。
[.note]#Note: 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
にコンテナをバックグラウンドで実行するように指示され、ターミナルを引き続き使用できるようになります。
docker-compose up -d
画面の周りにたくさんのテキストが飛んでいるのが見えます。 落ち着いたら、Webブラウザーを開き、ポート8080でDigitalOceanボックスのIP
を参照します(たとえば、サーバーのIPアドレスが123.456.789.123の場合は、http://123.456.789.123:8080と入力する必要があります。 )sをブラウザに挿入します。)
新しいWordPressインストールページが表示され、通常どおりインストールとブログを完了することができます。
これらは両方とも公式のDockerイメージであり、Dockerのすべてのベストプラクティスに従っているため、これらの各イメージには事前定義された永続的なボリュームがあります。つまり、コンテナーを再起動しても、ブログの投稿はそのままです。 Dockerボリュームの操作について詳しくは、Docker data volumes tutorialをご覧ください。
[[step-3 -—- adding-a-phpmyadmin-container]] ==ステップ3—PhpMyAdminコンテナを追加する
素晴らしい、それは比較的痛みがなかった。 ちょっと空想してみましょう。
これまでは、公式画像のみを使用してきましたが、Dockerチームは正確な画像を作成するために多大な労力を費やしています。 WordPressコンテナに環境変数を設定する必要がないことに気づいたかもしれません。 適切に設定されたMariaDBコンテナにリンクするとすぐに、すべてが機能しました。
これは、WordPress Dockerコンテナ内に、wordpress_db
コンテナからMYSQL_ROOT_PASSWORD
変数を実際に取得し、それを使用してWordPressに接続するスクリプトがあるためです。
公式の画像領域から少し離れて、community contributed PhpMyAdmin imageを使用してみましょう。 先に進み、docker-compose.yml
をもう一度編集します。
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
コンテナ内からホスト名%への参照を意味します(t5)sはwordpress_db
コンテナに転送されます)、ホストシステムのポート8181でポート80を公開し、最後にMariaDBのユーザー名とパスワードを使用していくつかの環境変数を設定します。 このイメージは、wordpress
イメージのように、wordpress_db
コンテナの環境からMYSQL_ROOT_PASSWORD
環境変数を自動的に取得しません。 実際には、wordpress_db
コンテナからMYSQL_ROOT_PASSWORD: examplepass
行をコピーし、ユーザー名を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
次に、アプリケーショングループを再度起動します。
docker-compose up -d
PhpMyAdminがインストールされているのがわかります。 終了したら、サーバーのIPアドレスに再度アクセスします(今回はポート8181を使用します。例: http://123.456.789.123:8181)。 PhpMyAdminログイン画面が表示されます。
先に進み、YAMLファイルで設定したユーザー名root
とパスワードを使用してログインすると、データベースを参照できるようになります。 サーバーには、WordPressインストールからのすべてのデータを含むwordpress
データベースが含まれていることがわかります。
この方法で好きなだけコンテナを追加し、好きな方法でそれらをすべてリンクできます。 ご覧のように、このアプローチは非常に強力です。個々のコンポーネントの構成と前提条件を処理し、それらをすべて同じサーバー上でセットアップする代わりに、Legoブロックのようにピースをプラグインし、コンポーネントを断片的に追加します。 Docker Swarmなどのツールを使用すると、これらのコンテナーを複数のサーバー上で透過的に実行することもできます。 ただし、これはこのチュートリアルの範囲外です。 興味があれば、Dockerはいくつかの[ドキュメント]https://docs.docker.com/swarm/install-w-machine/を提供します。
[[step-4 -—- creating-the-wordpress-site]] ==ステップ4—WordPressサイトの作成
新しいWordPressサイトのすべてのファイルはDockerコンテナー内に格納されているため、コンテナーを停止して再起動するとファイルはどうなりますか?
デフォルトでは、WordPressコンテナのドキュメントルートは永続的です。 これは、Docker HubからのWordPressイメージがこのように構成されているためです。 WordPressサイトに変更を加え、アプリケーショングループを停止してから再度開始した場合、Webサイトには変更が残っています。
試してみよう。
WebブラウザーからWordPressにアクセスします(例: http://123.456.789.123:8080)。 すでに存在するHello World!投稿を編集します。 次に、次のコマンドですべてのDockerコンテナーを停止します。
docker-compose stop
WordPressサイトをもう一度読み込んでみてください。 Webサイトがダウンしていることがわかります。 Dockerコンテナーを再度起動します。
docker-compose up -d
再度、WordPressサイトをロードします。 ブログサイトと以前に行った変更が表示されます。 これは、コンテナが停止している場合でも、行った変更が保存されることを示しています。
[[step-5 -—- storing-the-document-root-on-the-host-filesystem-optional]] ==ステップ5—ドキュメントルートをホストファイルシステムに保存する(オプション)
ホストとコンテナ間でファイルを共有するために、Dockerデータボリュームを使用して、ホストファイルシステムにWordPressのドキュメントルートを保存することができます。
[.note]#Note: Dockerデータボリュームの操作の詳細については、Docker data volumes tutorial。
#を参照してください。
やるだけやってみよう。 docker-compose.yml
ファイルをもう一度開きます。
nano ~/wordpress/docker-compose.yml
wordpress:
セクションに次の行を追加します。
~/wordpress/docker-compose.yml
wordpress:
...
volumes:
- ~/wordpress/wp_html:/var/www/html
...
現在実行中のdocker-compose
セッションを停止します。
docker-compose stop
ボリュームをホストファイルシステムにマップできるように、既存のコンテナーを削除します。
docker-compose rm wordpress
WordPressをもう一度起動します。
docker-compose -d
プロンプトが返されたら、WordPressが再び稼働しているはずです—今回はホストファイルシステムを使用してドキュメントルートを保存します。
~/wordpress
ディレクトリを見ると、wp_html
ディレクトリが含まれていることがわかります。
ls ~/wordpress
すべてのWordPressソースファイルがその中にあります。 行った変更は、WordPressコンテナーによってリアルタイムで反映されます。
このエクスペリエンスは通常よりも少しスムーズでした。WordPressDockerコンテナは、起動時に/var/www/html
が空かどうかをチェックし、そこにファイルを適切にコピーするように構成されています。 通常、このステップは自分で行う必要があります。
結論
完全なWordPressを展開して実行してください。 同じ方法を使用して、Docker Hubで利用可能なイメージを使用する非常に幅広いシステムを展開できるはずです。
が作成する各コンテナーに対して、永続的であるボリュームとそうでないボリュームを必ず把握してください。
ハッピードッキング!