Docker Composeを使ってみる!
Docker Composeを使ってみる!
2021年5月19日
Docker Compose を使ってみる!
Docker の利用例として、Django で作成したアプリを docker 上で動かす際には、「Docker Compose」を利用しました。この記事では、Docker Compose について簡単にまとめてみました。
Docker Composer はどんな時に必要か?
最初に、知りたいのは「いつ」Docker Composer を使うかだと思います。 一言で言えば、複数のコンテナ(Container)を利用する場合に使います。
例えば、Web サーバーのコンテナとデータベースのコンテナを別々に動かして一つのサービスやアプリケーシんを作る場合です。前回の Django の例では、データベースや、HTTP のリクエストを管理する NGINX や、Django のアプリケーションサーバーなどを利用するために利用しています。
Docker Composer を利用する場合、その設定は「xxx.yml」という設定ファイルに記述します。 このファイルで、どのようにイメージを作成(build)して、利用する Docker コンテナをどのようにインターフェースして、どのようにサービスやアプリを起動するかをまとめて設定します。
少し、規模の大きなサービスやアプリの場合、複数のコンテナを組み合わせて利用する場合が殆どなので、Docker Composer は、そうした少し複雑で大きなサービスやアプリを Docker で動かす場合に必要になってきます。
最初に、知りたいのは「いつ」Docker Composer を使うかだと思います。 一言で言えば、複数のコンテナ(Container)を利用する場合に使います。
例えば、Web サーバーのコンテナとデータベースのコンテナを別々に動かして一つのサービスやアプリケーシんを作る場合です。前回の Django の例では、データベースや、HTTP のリクエストを管理する NGINX や、Django のアプリケーションサーバーなどを利用するために利用しています。
Docker Composer を利用する場合、その設定は「xxx.yml」という設定ファイルに記述します。 このファイルで、どのようにイメージを作成(build)して、利用する Docker コンテナをどのようにインターフェースして、どのようにサービスやアプリを起動するかをまとめて設定します。
少し、規模の大きなサービスやアプリの場合、複数のコンテナを組み合わせて利用する場合が殆どなので、Docker Composer は、そうした少し複雑で大きなサービスやアプリを Docker で動かす場合に必要になってきます。
Docker Compose の基本設定
Docker Compose を利用する場合でも、Docker を使う事には変わりありませんので、Dockerfile で Docker イメージの基本設定をすることに大きな違いはありません。しかし、全体の設定は、Docker Compose の設定ファイルである。「xxx.yml」で行います。
何を書くかというと:
- Compose file の形式のバージョン
- 最低一つのサービス(service)
- ボリューム(volumes)とネットワーク(networks)はオプション
Docker Compose を利用する場合でも、Docker を使う事には変わりありませんので、Dockerfile で Docker イメージの基本設定をすることに大きな違いはありません。しかし、全体の設定は、Docker Compose の設定ファイルである。「xxx.yml」で行います。
何を書くかというと:
- Compose file の形式のバージョン
- 最低一つのサービス(service)
- ボリューム(volumes)とネットワーク(networks)はオプション
サービス
これは、基本的なコンテナの設定です。目的によりますが、大きなサービスの場合機能ごとに別の Docker イメージを利用する場合には、例えば、「Web サーバ」と「データベース」のように分けて記述します。Docker Hub などに公開されている Docker イメージを利用する場合は、そのレポジトリーの情報などを記述して、Docker Hub から自動的に取得するようにします。
あるいは、DockerFile でイメージの作成(build)を行う場合は、Dockerfile の場所を指定します。既存の Docker イメージにデータを追加してカスタムのイメージにする場合も同様です。
これは、基本的なコンテナの設定です。目的によりますが、大きなサービスの場合機能ごとに別の Docker イメージを利用する場合には、例えば、「Web サーバ」と「データベース」のように分けて記述します。Docker Hub などに公開されている Docker イメージを利用する場合は、そのレポジトリーの情報などを記述して、Docker Hub から自動的に取得するようにします。
あるいは、DockerFile でイメージの作成(build)を行う場合は、Dockerfile の場所を指定します。既存の Docker イメージにデータを追加してカスタムのイメージにする場合も同様です。
ネットワーク
コンテナ間でコミュニケーションが必要な場合は、ネットワークを介してコミュニケーションができます。この場合、システムでアクセスするためのポートの指定などを行う必要があります。こうした記述も「xxx.yml」ファイルで指定します。
コンテナ間でコミュニケーションが必要な場合は、ネットワークを介してコミュニケーションができます。この場合、システムでアクセスするためのポートの指定などを行う必要があります。こうした記述も「xxx.yml」ファイルで指定します。
ボリューム
データを保存する場所をボリュームで指定します。Docker は3種類のボリュームの設定ができます。
- ホスト
- Named
- Anonymous
ホストは、ホストイメージの中のフォルダです。
データを保存する場所をボリュームで指定します。Docker は3種類のボリュームの設定ができます。
- ホスト
- Named
- Anonymous
ホストは、ホストイメージの中のフォルダです。
その他
他に設定する項目は、コンテナ/イメージ間の依存関係などです。また、設定の中で環境変数を参照することが可能です。サービスに必要な環境変数を予め設定しておいて、環境変数から必要な設定を取得するような用途に利用できます。データーベースのユーザー名やパスワードなどでも利用できます。
他に設定する項目は、コンテナ/イメージ間の依存関係などです。また、設定の中で環境変数を参照することが可能です。サービスに必要な環境変数を予め設定しておいて、環境変数から必要な設定を取得するような用途に利用できます。データーベースのユーザー名やパスワードなどでも利用できます。
Docker Composer を使う!
実際に Docker Composer を使う場合、各イメージ/コンテナの設定を Dockerfile で行います。こうした処理を「xxxx.yml」ファイルで記述しておいて、必要なイメージを作成します。
イメージが作成されれば、
$ docker-compose up
で Docker のコンテナ上サービスやアプリを起動することができます。この際、開発用と公開用で別の「xxx.yml」ファイルを使用する場合は、ファイル名を指定して設定を行うことができます。
$ docker-compose -f compose-yml-file.yml up -d
(*) 「-d」オプションをつけると、バックグラウンドで実行されます。
バックグラウンドで実行すると、他の用途でターミナル(シェル)を利用できるので便利です。
$ docker-compose down
を実行すると、サービスを停止できます。
で設定ファイルを使い分けることも可能です。
実際に Docker Composer を使う場合、各イメージ/コンテナの設定を Dockerfile で行います。こうした処理を「xxxx.yml」ファイルで記述しておいて、必要なイメージを作成します。
イメージが作成されれば、
$ docker-compose up
で Docker のコンテナ上サービスやアプリを起動することができます。この際、開発用と公開用で別の「xxx.yml」ファイルを使用する場合は、ファイル名を指定して設定を行うことができます。
$ docker-compose -f compose-yml-file.yml up -d
(*) 「-d」オプションをつけると、バックグラウンドで実行されます。
バックグラウンドで実行すると、他の用途でターミナル(シェル)を利用できるので便利です。
$ docker-compose down
を実行すると、サービスを停止できます。
で設定ファイルを使い分けることも可能です。
何が便利か??
Docker Compose を利用する一番の目的は、Docker イメージのモジュール化です。 基本的に、作ろうと思えば、一つの Docker イメージに全ての機能を作り込むことは可能です。 全てをまとめてしまった方がシンプルに見えますが、再利用が難しなるなどの欠点があります。
また機能を分けて設計した方が、公開している Docker イメージを取り込みやすくなります。また、テストやデバッグもやりやすくなる事が殆どです。
Docker Compose を利用する一番の目的は、Docker イメージのモジュール化です。 基本的に、作ろうと思えば、一つの Docker イメージに全ての機能を作り込むことは可能です。 全てをまとめてしまった方がシンプルに見えますが、再利用が難しなるなどの欠点があります。
また機能を分けて設計した方が、公開している Docker イメージを取り込みやすくなります。また、テストやデバッグもやりやすくなる事が殆どです。
まとめ
Docker 自体、とても便利な仕組みで、コンテナを利用して仮想化することで、Docker 環境下ならばどこでも同じ環境で実行することが簡単にできます。これでも十分に便利なのですが、少し規模の大きなサービスやアプリの場合、一つの大きなコンテナで実行するよりは、機能ごとにコンテナを分けた方が、開発もしやすくなりますし、テストやデバッグを効率よく行う事ができます。
また、細かく機能を分割することで Docker イメージの再利用がやりやすくなるため、部品化しやすくなります。こうした複数の Docker コンテナ・イメージで Docker を利用できるようにする仕組みが Docker Compose です。
一旦、「xxxx.yml」の設定ファイルを作成してしまえば、複数のイメージ・コンテナをコマンド一つで起動したり停止したりできます。また、開発用と公開用で別々の「xxx.yml」ファイルを指定することも可能ですので、開発環境とデバッグ環境の切り替えも簡単にできます。
Docker を利用する場合、ペアで Docker Compose を利用すると、ブロックの「レゴ」の要領で複雑なアプリやサービスも効率よく実装できるようになります。
Docker 自体、とても便利な仕組みで、コンテナを利用して仮想化することで、Docker 環境下ならばどこでも同じ環境で実行することが簡単にできます。これでも十分に便利なのですが、少し規模の大きなサービスやアプリの場合、一つの大きなコンテナで実行するよりは、機能ごとにコンテナを分けた方が、開発もしやすくなりますし、テストやデバッグを効率よく行う事ができます。
また、細かく機能を分割することで Docker イメージの再利用がやりやすくなるため、部品化しやすくなります。こうした複数の Docker コンテナ・イメージで Docker を利用できるようにする仕組みが Docker Compose です。
一旦、「xxxx.yml」の設定ファイルを作成してしまえば、複数のイメージ・コンテナをコマンド一つで起動したり停止したりできます。また、開発用と公開用で別々の「xxx.yml」ファイルを指定することも可能ですので、開発環境とデバッグ環境の切り替えも簡単にできます。
Docker を利用する場合、ペアで Docker Compose を利用すると、ブロックの「レゴ」の要領で複雑なアプリやサービスも効率よく実装できるようになります。
コメント
コメントを投稿