HTC Advent Calendar 2020の25日目を担当します、kurasherです。
第5回はDocker Composeです。
環境
Windows 10 Pro バージョン 1903 Docker Toolbox Dockerバージョン: 18.09.1 VirtualBox: 6.1.16
Docker Composeとは
通常、アプリケーションはデータベースやサーバーなど複数の組み合わせで出来ています。API単体で一つのアプリケーションは非常に珍しいです。
Dockerでは基本的に一つのコンテナに一つのアプリケーションを推奨しており、データベースならデータベースのコンテナ、サーバーならサーバーのコンテナのように分けられます。
これら複数のコンテナをDockerfileにまとめ一つずつ手動で起動していくのは非常に手間がかかり、途中人為的なミスも発生しかねません。
となると、複数のコンテナを同時に起動、停止、イメージの作成などを扱えないかという考えが浮かびます。この複数のコンテナを自動で同時に動かす方法が、Docker Composeです。
Docker-composeを試す
実際に複数のコンテナを立ててみましょう。
以下の記事を参考にします。参考にするというか、以下の記事の内容をそのままこちらに書いちゃってるんですが。
Docker Desktop で 開発用 Web アプリを起動してみよう
docker-compose.yml
docker-compose.ymlの説明は後にするとして、以下のように書きます。
version: "3.3" services: web: image: adminer container_name: adminer_con ports: - 8080:8080 db: image: mysql container_name: mysql_con environment: MYSQL_ROOT_PASSWORD: password
Docker Toolbox使っている人向けのポートフォワーディング設定(該当者のみ)
Docker Toolbox使っている人向けのポートフォワーディング設定です。Docker Desktopを使っている人は関係ないため飛ばしていただいて大丈夫です。
今回もポートフォワーディングが必要なので、VirtualBoxを起動し、以下の図のようにRule2
を設定します。設定方法は前回の記事を参考にしてください。
docker compose起動
上記で用意したdocker-compose.ymlファイルがあるディレクトリで、下記のコマンドを実行します。
$ docker-compose up -d
-d
はバックグラウンドで起動することを意味します。
今回はadminer
というイメージとMySQL
のイメージを取得して、コンテナを起動します。初めてイメージをpullしてくる場合、docker-compose up -d
コマンドをたたくと以下のように出力されます。
$ docker-compose up -d Creating network "test_default" with the default driver Pulling web (adminer:)... latest: Pulling from library/adminer 801bfaa63ef2: Pull complete 30e209609427: Pull complete 320f26ee9b1c: Pull complete 4612e05a72cf: Pull complete a7d577b440bd: Pull complete 1f67ee0e7b40: Pull complete b4c84ce97d3b: Pull complete 2e1a66d6657a: Pull complete ea3ec22f9c6f: Pull complete 0ee36b42e0ff: Pull complete 418366333583: Pull complete 4f911d97b55e: Pull complete 0aa14ee37402: Pull complete d34c5a5f3112: Pull complete 384e9dd44a6b: Pull complete Pulling db (mysql:)... latest: Pulling from library/mysql 6ec7b7d162b2: Pull complete fedd960d3481: Pull complete 7ab947313861: Pull complete 64f92f19e638: Pull complete 3e80b17bff96: Pull complete 014e976799f9: Pull complete 59ae84fee1b3: Pull complete ffe10de703ea: Pull complete 657af6d90c83: Pull complete 98bfb480322c: Pull complete 9f2c4202ac29: Pull complete a369b92bfc99: Pull complete Creating adminer_con ... done Creating mysql_con ... done $
複数(今回は2つ)のコンテナが起動しているかを確認してみます。以下のように出てくればコンテナが起動されているはずです。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b33dd61bca46 mysql "docker-entrypoint.s…" 9 minutes ago Up 9 minutes 3306/tcp, 33060/tcp mysql_con a0d847359c82 adminer "entrypoint.sh docke…" 9 minutes ago Up 9 minutes 0.0.0.0:8080->8080/tcp adminer_con
localhost:8080にアクセスすると、以下の画面があらわれるかと思います。
各項目には、
データベース種類:MySQL
サーバ:db
ユーザ名root
パスワード:docker-compose.yml
のMYSQL_ROOT_PASSWORDで設定したパスワード
データベース:(空白)
と設定すればログインできます。が、今回の趣旨と離れるため、説明はスキップします。
docker compose停止
以下のコマンドで停止します。
$ docker-compose down Stopping mysql_con ... done Stopping adminer_con ... done Removing mysql_con ... done Removing adminer_con ... done Removing network test_default $
docker-compose.yml解説
version: "3.3" services: web: image: adminer container_name: adminer_con ports: - 8080:8080 db: image: mysql container_name: mysql_con environment: MYSQL_ROOT_PASSWORD: password
version
でdocker-compose
のバージョンを指定します。特にこだわりが無い場合は最新のバージョンを記述すればよいです。
services
は起動する各コンテナについての定義を書くところです。今回はweb
と、db
という2つのserviceが定義されています。このweb
とdb
が今回で言うコンテナにあたります。分かりやすい名前であれば、無理にweb
、db
と書く必要はありません。
web
のimage
でベースとなるイメージを、web
のcontainer_name
で起動するコンテナ名を、web
のports
でポートフォワーディングの設定を、db
のenvironment
で環境変数を定義しています。
これらをdocker run
する場合のコマンドのオプションと比較すると
設定内容 | docker run コマンド |
docker-compose.yml |
---|---|---|
ベースイメージ | コマンドの最後に指定 | image: |
コンテナ名 | --name コンテナ名 |
container_name: |
ポートフォワーディング | -p ホストのポート:ゲストのポート |
ports: |
環境変数 | -e 環境変数設定 |
environment: |
となります。
docker-composeの起動と停止の解説
解説するほどのものではないですが、一応書いておきます。
起動
$ docker-compose up -d
停止
$ docker-compose down
これだけです。起動のところで-d
をつけていますが、必須ではありません。ただ、つけていた方があとあと楽かと思います。
まとめ
今回はDocker Composeについて学びました。コンテナが2つだけだったため、ありがたみが分かりにくかったかもしれませんが、複数のものを一回のコマンドだけで操作できるのは魅力的ですよね!
以下に、これまでのコマンド一覧を載せています。今まで学んだコマンドを思い出しながら、Dockerに慣れ親しんでいきましょう。
やること | Dockerコマンド |
---|---|
イメージの取得 | docker pull イメージ名 |
イメージの一覧表示 | docker images |
イメージの一覧表示 | docker image ls |
コンテナの起動 | docker run イメージ名 |
コンテナ名を指定してコンテナを起動 | docker run --name コンテナ名 イメージ名 |
起動中のコンテナの一覧表示 | docke ps |
起動中のコンテナの一覧表示 | docke container ls |
停止中のコンテナも含めてコンテナの一覧表示 | docker ps -a |
停止中のコンテナも含めてコンテナの一覧表示 | docker container ls -a |
停止中のコンテナの削除 | docker container rm コンテナID |
停止中のコンテナの削除 | docker container rm コンテナ名 |
イメージの削除 | docker rmi イメージID |
イメージの削除 | docker rmi イメージ名 |
イメージを探す | docker search イメージ名 |
イメージの一覧表示 | docker images |
起動していないコンテナのコンテナ操作 | docker run -it コンテナ名 イメージ名 コンテナ内で実行するコマンド |
起動中のコンテナのコンテナ操作 | docker exec -it コンテナ名 イメージ名 コンテナ内で実行するコマンド |
コンテナをバックグラウンドで起動 | docker run -d イメージ名 |
コンテナを停止後自動的にコンテナを削除するオプション | docker run --rm イメージ名 |
起動中コンテナの停止 | docker stop コンテナ名 |
イメージの作成 | docker build -t イメージ名:タグ名 . |
docker-compose起動 | docker-compose up -d |
docker-compose停止 | docker-compose down |
最後に
HTC Advent Calendar 2020の5回にわたってDockerについて学んできました。
しかし、たった5回で完全に理解できるほどDockerは簡単なものではありません。
しかし、Dockerを全く知らず、ひとまず動かしてみたいと思った方にとって、これら5回は有益なものになってくれればなと思っています。
Dockerに限った話ではありませんが、読むだけではなく、実際に手を動かして自分の目で確かめてみることで習得の一歩を踏み出せると思います。
私の記事だけでなく他の人の記事も参考にしながらDockerについて学び、より高みを目指していただければと思います。
また、HTC Advent Calendar 2020では、私含め、5人が持ち回りでカレンダーを担当しました。
社会人歴も短く、記事としてはまだまだ未熟な部分もあったとは思いますが、これらの記事がご覧いただいた方々の少しでもお役に立てれば幸いです。