クラウドソリューション事業部の青山です。
先日、弊社のDocker研修会で気づいたことがあります。
それは私がdockerコマンドとdocker-composeコマンドの違いを
意識せずにコマンドを実行していたことです。
本記事では具体的に、
dockerコマンドとdocker-composeコマンドの違いと、
docker-composeの便利さについて、
実際に環境構築することで実感したいと思います。
目次
- dockerコマンドとdocker-composeコマンドの違い
- dockerコマンドを使用して環境構築してみる
- イメージとは何か?
- イメージのダウンロードと環境構築
- docker-composeを使用して環境構築してみる
- docker-compose.ymlの準備と環境構築
- docker-composeコマンドは結局何をしているのか
- docker-composeとdocker composeの違い
Dockerはアプリケーション開発やデプロイメントにおいて
よく使用されているツールです。
開発するアプリケーションやサービスが
ローカルなコンテナ内に実現でき、
開発者は標準化された環境により
作業を効率よく進めることが可能となります。
Dockerの概要について詳しく知りたい場合
下記のドキュメントで確認していただくことができます
https://docs.docker.jp/get-started/overview.html
1. dockerコマンドとdocker-composeコマンドの違い
dockerコマンドは、個々のDockerコンテナの作成、起動、停止、削除など、
単一のコンテナの操作を行うために使用されます。
docker-composeコマンドは、複数のコンテナから構成される
マルチコンテナアプリケーションの定義と管理を行うために使用されます。
どうやって複数のコンテナを管理するかというと、
YAMLファイルで構成情報を定義することで、
複数のコンテナを一括で管理することができます。
つまり複数のコンテナ、サービスを組み合わせて環境を構築したい場合、
docker-composeコマンドを使用する方が適しています。
2. dockerコマンドを使用して環境構築してみる
docker で使用するコマンドについて
全て知っている方は案外少ないのではないでしょうか。
まず簡単にdocker コマンドについて簡単に解説します。
Dockerコマンドは、Docker CLI の基本コマンドです。
上位コマンドと呼ばれており、下位コマンドには docker build や
docker container、docker image などのコマンドがあります。
上位、下位の呼び方や、コマンド一覧は公式のドキュメントに記載があります。
https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/commandline/docker/
基本的に docker と目的に沿ったコマンドを組み合わせて、
コマンドを実行します。
公式ドキュメントを見ていただくと、下位コマンドが
意外とたくさんあることがわかっていただけるかと思います。
それでは構築に必要なイメージについて説明していきます。
イメージとは何か?
「Docker imageを使う」と聞いたことがある方、いるのではないでしょうか。
例えばLaravelの開発環境を構築する際に、
「LaravelのDocker image」を使うと、
ローカルにPHPやcomposerなどをインストールせずに、
簡単なコマンド実行だけでLaravelの開発環境が構築できます。
つまりDocker のイメージとは、
開発環境のテンプレートであると考えることができます。
ダウンロードしてコマンド実行することで、
テンプレート通りの開発環境をすぐに構築することができます。
イメージのダウンロードと環境構築
試しにLaravelのイメージを使用して、Laravelの開発環境が
構築済みのコンテナを起動するところまでやってみましょう。
まずイメージの検索コマンドで、Laravelのイメージを検索します。
docker search Laravel
上記コマンドを実行すると結果が表示されます。
この中からOKと書かれたイメージで、かつSTARSの多いもの、
ここではbitnami/laravelを選んでダウンロードします。
bitnami/laravelについて気になる方は
Docker Hubで確認することができます。https://hub.docker.com/r/bitnami/laravel
ではコマンドを実行してみましょう。
実行コマンドはdocker pull bitnami/laravel です。
コマンドを実行後、下記のステータスが表示されていれば
ダウンロードは完了です。
1Status: Downloaded newer image for bitnami/laravel:latest
ではダウンロードされたイメージを確認しましょう。
確認用のコマンドはdocker image ls です。
1% docker image ls
2REPOSITORY TAG IMAGE ID CREATED SIZE
3bitnami/laravel latest 026ac38b2134 30 hours ago 591MB
4
イメージを確認できたのでコンテナを起動してみます。
起動するコマンドはdocker run です。
今回はitオプションの後にイメージのIDを指定することで、
Laravelのコンテナだけ起動するようにします。
そのため実際に実行するコマンドは、
docker run -it ImageID になります。
- itオプションは、コンテナ起動と同時にコンテナに接続してターミナルを開くオプションです。
実行していただくとわかると思いますが、
DBのコンテナがないため起動に失敗します。
つまりdockerコマンドを使用して環境構築しようとすると、
環境構築に必要なコンテナを個別にdockerコマンドで起動して、
さらにコンテナ同士を接続するネットワークも構築する必要があるということです。
構築自体はコマンドで簡単にできますが、
複数のコンテナを構築して接続するとなると
手間がかかりそうだということがわかっていただけたかと思います。
1% docker run -it 026ac38b2134
2laravel 02:38:38.44
3laravel 02:38:38.44 Welcome to the Bitnami laravel container
4laravel 02:38:38.44 Subscribe to project updates by watching <https://github.com/bitnami/containers>
5laravel 02:38:38.45 Submit issues and feature requests at <https://github.com/bitnami/containers/issues>
6laravel 02:38:38.45
7laravel 02:38:38.45 INFO ==> ** Running Laravel setup **
8laravel 02:38:38.48 INFO ==> Configuring PHP options
9laravel 02:38:38.48 INFO ==> Setting PHP opcache.enable option
10laravel 02:38:38.49 INFO ==> Setting PHP expose_php option
11laravel 02:38:38.50 INFO ==> Setting PHP output_buffering option
12laravel 02:38:38.53 INFO ==> Validating settings in LARAVEL_* environment variables...
13laravel 02:38:38.57 WARN ==> Hostname mariadb could not be resolved, this could lead to connection issues
14laravel 02:38:38.58 INFO ==> Creating Laravel application in /app
15laravel 02:38:39.25 INFO ==> Regenerating APP_KEY
16laravel 02:38:39.39 Updating dependencies
17laravel 02:38:45.60 INFO ==> Trying to connect to the database server
18laravel 02:39:45.93 ERROR ==> Could not connect to the database
19
次はdocker-composeコマンドを試しますが、
その前に現在のイメージを一旦削除までしてしまいましょう。
docker psコマンドでコンテナが起動していないことを確認します。
1% docker ps
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ではイメージを削除してみましょう
docker image rm ImageID
するとエラーが表示されてイメージが削除できなかったことがわかります。
1% docker image rm 026ac38b2134
2Error response from daemon: conflict: unable to delete 026ac38b2134 (must be forced) - image is being used by stopped container 1a3e3c018186
エラー文を読むと、イメージを使用して構築されたコンテナを
先に削除しないと、イメージを削除できないということがわかります。
そのため先にコンテナを削除しましょう。
コンテナのIDはエラー文に記載されているのでそちらを使用します。
コンテナの削除コマンドは下記です。
docker rm ContainerID
実行できたら再度イメージの削除コマンドを実行していただき、
削除されたことを確認してください。
3. docker-composeを使用して環境構築してみる
それでは今度はdocker-composeコマンドを使用して環境構築してみます。
今回はdocker-composeコマンドの確認のため、
先ほど使用したbitnami/laravelのドキュメントに沿って行います。
https://hub.docker.com/r/bitnami/laravel
docker-compose.ymlの準備と環境環境
今回は複数のイメージを使用するため
docker-compose.ymlを準備する必要があります。
今回使用するDockerイメージは2つです。
まずファイルの格納先のディレクトリを作成して移動します。
1$ mkdir myapp
2$ cd myapp
次にdocker-compose.ymlをダウンロードします。
本来はdocker-compose.ymlに、必要な環境の設定をいちから記述しますが、
今回はすでに記述済みのファイルが用意されているのでそちらを使用します。
下記コマンドでダウンロードするように
指定されているのでコマンドを実行します。
1curl -LO <https://raw.githubusercontent.com/bitnami/containers/main/bitnami/laravel/docker-compose.yml>
ダウンロードできたら、ファイルを開いて記述を確認します。
services:の下に作成したいサービス名があり、
それぞれ使用するイメージや環境設定が
記載されているのがわかるかと思います。
今回はmariadbとmyappという2つのコンテナサービスを
使用することがわかります。
1version: '2'
2
3services:
4 mariadb:
5 image: docker.io/bitnami/mariadb:10.6
6 environment:
7 # ALLOW_EMPTY_PASSWORD is recommended only for development.
8 - ALLOW_EMPTY_PASSWORD=yes
9 - MARIADB_USER=bn_myapp
10 - MARIADB_DATABASE=bitnami_myapp
11 myapp:
12 image: docker.io/bitnami/laravel:10
13 ports:
14 - '8000:8000'
15 environment:
16 - DB_HOST=mariadb
17 - DB_PORT=3306
18 - DB_USERNAME=bn_myapp
19 - DB_DATABASE=bitnami_myapp
20 volumes:
21 - './my-project:/app'
22 depends_on:
23 - mariadb
イメージについて、例えば下記の箇所について
services:の下のmariadbというサービスは、
Docker Hubのbitnami/mariadb:10.6のイメージを
使用するように記述されています。
1services:
2 mariadb:
3 image: docker.io/bitnami/mariadb:10.6
それではdocker-compose up を実行して、動作を確認してみましょう。
実行すると起動ログが表示されます。
しばらく待っていると表示が止まり、サービスが動いてることが確認できます
1docker-test-myapp-1 | laravel 09:37:08.55 INFO ==> ** Laravel setup finished! **
2docker-test-myapp-1 | laravel 09:37:08.55 INFO ==> ** Starting Laravel project **
3docker-test-myapp-1 |
4docker-test-myapp-1 | INFO Server running on [<http://0.0.0.0:8000>].
5docker-test-myapp-1 |
6docker-test-myapp-1 | Press Ctrl+C to stop the server
http://localhost:8000に接続してみましょう。
Laravelのページが表示されました。
つまりdocker-compose コマンドで、2つのコンテナが起動して、
かつコンテナ同士のネットワークの設定も
正常に設定されたということがわかります。
これでLaravelを使用した開発環境が構築できました。
docker-compose コマンドがどれぐらい便利か
実感していただけたでしょうか?
docker-composeコマンドは結局何をしているのか
- 複数のコンテナを一括して起動、停止、管理し、依存関係や起動順序の管理も自動化している
- コンテナ同士のネットワーク接続を自動的に設定し、内部的な名前解決もサポートしている
さらに下記の項目もdocker-composeコマンドの便利な点になります。
- 環境変数を設定することが可能なので、異なるコンテナ間で共有される設定情報の管理が容易
- 開発環境から本番環境まで、一貫した環境を構築できる
上記をdockerコマンドだけで行おうとすると、
コンテナ間のネットワーキングや環境変数の設定が複雑になりますし、
起動順序や依存関係もこちらで考慮する必要性があります。
かなり手間がかかることが想像できます。
Dockerコンテナのネットワークについてより詳しく知りたい方は、
ドキュメントで確認することができます。https://docs.docker.jp/engine/userguide/networking/dockernetworks.html
4. docker-composeとdocker composeの違い
最後にdocker-composeとdocker composeの違いについて
簡単に説明します。
Dockerにはバージョンが2種類あります。
Compose V1 と V2 です。
V1で使用しているコマンドはdocker-composeコマンド。
V2で使用しているコマンドがdocker composeコマンドです。
Docker Desktop を利用中の場合、すでにCompose V2 が入っています。
docker-composeコマンドはdocker composeコマンドと
互換性があるため、
基本的には同様に引き続き使うことができます。
しかし非推奨となっていますので、今後も使用を続ける場合、注意が必要です。
- https://docs.docker.com/compose/#install-on-linuxDocker Compose の概要
- https://docs.docker.com/compose/migrate/Compose V1 と Compose V2 の機能的な違いは何ですか?
実際にdockerコマンドとdocker-composeコマンドを使ってみて、
その違いとdocker-composeの便利さを実感することができました。
皆さんもあまり使ってないコマンドや、
なんとなく使用しているコマンドを見つけたら、
掘り下げて色々試してみてください。
新しい発見があると思います。
お読みいただきありがとうございました。