Docker - コンテナリンク
コンテナリンクの紹介
こんにちは、Dockerの熱心な愛好家たち!今日は、コンテナリンクのエキサイティングな世界に飛び込みます。あなたの近所の親切なコンピュータ教師として、私はこの旅をガイドします。コードを一行も書いたことがない方でも大丈夫です。シートベルトを締めて、コンテナの海に帆を上げましょう!
コンテナリンクは、パーティで2人の友達を紹介するようなものです。コンテナがお互いに通信し、情報やリソースを共有することができます。パーティのポットラックディナー(Dockerホスト)で、各料理(コンテナ)が他の料理がどのようなものかを知る必要があることを考えてみてください。これがコンテナリンクの基本的な概念です!
コンテナリンクの重要性
「なぜコンテナリンクに興味を持つべきなのか?」と疑問に思うかもしれません。少しの話を聞いてください。かつて、遠く離れたデータセンターに住んでいたアプリケーションたちが、孤立して生活していました。彼らはお互いに話したり、データを共有したり、一緒に作業することができませんでした。それは孤独な存在でした。しかし、コンテナリンクが現れて、すべてが変わりました!
コンテナリンクは以下のことができます:
- 複雑な、複数のコンテナを持つアプリケーションを作成する
- コンテナ間でデータを共有する
- サービスを隔離することでセキュリティを向上させる
- アプリケーションをより簡単にスケーリングする
基本的なコンテナリンク
簡単な例から始めましょう。ウェブサーバーとデータベースの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で行います:
- ウェブコンテナの
/etc/hosts
ファイルにエントリを追加する - ウェブコンテナ内で環境変数を設定する
- ウェブコンテナがデータベースコンテナに接続できるようにする
ウェブコンテナの中を見てみましょう:
docker exec -it myweb bash
一旦中に入ると、以下のコマンドで/etc/hosts
ファイルを確認できます:
cat /etc/hosts
db
コンテナのIPアドレスのエントリが表示されるはずです。
環境変数
Dockerは環境変数も設定します。以下のコマンドで確認します:
env | grep DB_
DB_PORT
やDB_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
これにより、コンテナは名前を使って通信できるようになります!
ユーザー定義ネットワークの利点
ユーザー定義ネットワークは以下の利点があります:
- より良い隔離
- 自動DNS解決
- コンテナがネットワークから接続/切断されることを可能にする
実用的な例: 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