Docker - コンテナリンク

コンテナリンクの紹介

こんにちは、Dockerの熱心な愛好家たち!今日は、コンテナリンクのエキサイティングな世界に飛び込みます。あなたの近所の親切なコンピュータ教師として、私はこの旅をガイドします。コードを一行も書いたことがない方でも大丈夫です。シートベルトを締めて、コンテナの海に帆を上げましょう!

Docker - Container Linking

コンテナリンクは、パーティで2人の友達を紹介するようなものです。コンテナがお互いに通信し、情報やリソースを共有することができます。パーティのポットラックディナー(Dockerホスト)で、各料理(コンテナ)が他の料理がどのようなものかを知る必要があることを考えてみてください。これがコンテナリンクの基本的な概念です!

コンテナリンクの重要性

「なぜコンテナリンクに興味を持つべきなのか?」と疑問に思うかもしれません。少しの話を聞いてください。かつて、遠く離れたデータセンターに住んでいたアプリケーションたちが、孤立して生活していました。彼らはお互いに話したり、データを共有したり、一緒に作業することができませんでした。それは孤独な存在でした。しかし、コンテナリンクが現れて、すべてが変わりました!

コンテナリンクは以下のことができます:

  1. 複雑な、複数のコンテナを持つアプリケーションを作成する
  2. コンテナ間でデータを共有する
  3. サービスを隔離することでセキュリティを向上させる
  4. アプリケーションをより簡単にスケーリングする

基本的なコンテナリンク

簡単な例から始めましょう。ウェブサーバーとデータベースの2つのコンテナを作成し、リンクします。

ステップ1: データベースコンテナを作成する

まず、データベースコンテナを作成します。この例ではMySQLを使用します。

docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=secret mysql:latest

これを分解すると:

  • -d: バックグラウンドでコンテナを実行する
  • --name mydb: コンテナに名前を付ける
  • -e MYSQL_ROOT_PASSWORD=secret: ルートパスワードの環境変数を設定する
  • mysql:latest: 最新のMySQLイメージを使用する

ステップ2: ウェブサーバーコンテナを作成する

次に、ウェブサーバーコンテナを作成し、データベースにリンクします。

docker run -d --name myweb --link mydb:db -p 80:80 nginx:latest

ここで起こっていること:

  • --link mydb:db: この魔法のオプションで、私たちはmydbコンテナをリンクし、ウェブコンテナ内でdbと呼びます
  • -p 80:80: ホストのポート80をコンテナのポート80にマッピングする

リンクの理解

--linkオプションを使用すると、Dockerは以下のことを私たち behalfで行います:

  1. ウェブコンテナの/etc/hostsファイルにエントリを追加する
  2. ウェブコンテナ内で環境変数を設定する
  3. ウェブコンテナがデータベースコンテナに接続できるようにする

ウェブコンテナの中を見てみましょう:

docker exec -it myweb bash

一旦中に入ると、以下のコマンドで/etc/hostsファイルを確認できます:

cat /etc/hosts

dbコンテナのIPアドレスのエントリが表示されるはずです。

環境変数

Dockerは環境変数も設定します。以下のコマンドで確認します:

env | grep DB_

DB_PORTDB_NAMEなどの変数が表示されるはずです。これにより、アプリケーションがデータベースに接続するのが簡単になります。

レガシーリンクとユーザー定義ネットワーク

ここで告白があります。私たちが刚刚使用した--linkフラグは、実際にはDockerではレガシーと見なされています。これは、スマートフォンの時代にフリップフォンを使用するのと同じです。動作はしますが、より良いオプションが利用可能です。

コンテナをリンクする現代的な方法は、ユーザー定義ネットワークを使用することです。それを見てみましょう:

ステップ1: ネットワークを作成する

docker network create mynetwork

ステップ2: ネットワーク上でコンテナを実行する

docker run -d --name mydb --network mynetwork -e MYSQL_ROOT_PASSWORD=secret mysql:latest
docker run -d --name myweb --network mynetwork -p 80:80 nginx:latest

これにより、コンテナは名前を使って通信できるようになります!

ユーザー定義ネットワークの利点

ユーザー定義ネットワークは以下の利点があります:

  1. より良い隔離
  2. 自動DNS解決
  3. コンテナがネットワークから接続/切断されることを可能にする

実用的な例: WordPressとMySQL

知識を実際に使ってみましょう。WordPressをMySQLで設定する例を見てみましょう。

ステップ1: ネットワークを作成する

docker network create wordpress-network

ステップ2: MySQLコンテナを実行する

docker run -d --name wordpress-db --network wordpress-network -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpresspassword mysql:5.7

ステップ3: WordPressコンテナを実行する

docker run -d --name wordpress-site --network wordpress-network -e WORDPRESS_DB_HOST=wordpress-db -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpresspassword -e WORDPRESS_DB_NAME=wordpress -p 8080:80 wordpress:latest

ブラウザでhttp://localhost:8080にアクセスすると、WordPressの設定ページが表示されるはずです!

結論

おめでとうございます!あなたは刚刚コンテナリンクの世界への第一歩を踏み出しました。私たちは基本的なリンクからユーザー定義ネットワークまで、そして実際のWordPressサイトをコンテナで設定するまで多くのことをカバーしました。

コンテナリンクは、私たちのアプリケーションが協調して働くことを可能にします。これはオーケストラを指揮するようなものです。各コンテナは楽器であり、適切にリンクされると、美しい音楽を生み出します。

Dockerの旅を続ける中で、さまざまなコンテナとネットワークオプションを試してみてください。練習を重ねるほど、これらの概念に慣れていくでしょう。

ハッピーコンテナライズ、そしてDockerイメージが常に無事にビルドされることを祈っています!

メソッド 説明
レガシーリンク --linkフラグを使用してコンテナを接続 docker run --name myweb --link mydb:db nginx:latest
ユーザー定義ネットワーク コンテナ間の通信のためのカスタムネットワークを作成 docker network create mynetwork
環境変数 コンテナをリンクするとDockerが自動で設定 DB_PORT, DB_NAME, など
DNS解決 コンテナ名を使用して通信可能に mysql://wordpress-db:3306
ポートマッピング コンテナのポートをホストに公開 -p 8080:80

Credits: Image by storyset