とあるお兄さんの雑記

基本的に技術系の内容を書きますが、何を書くかは私の気分です。

Dockerを学ぶ第5回~Docker Composeを使う~

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を設定します。設定方法は前回の記事を参考にしてください。

ポートフォワーディング設定方法

f:id:kurasher:20201219031439p:plain

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にアクセスすると、以下の画面があらわれるかと思います。 f:id:kurasher:20201219032015p:plain

各項目には、

データベース種類:MySQL
サーバ:db
ユーザ名root
パスワード:docker-compose.ymlMYSQL_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

versiondocker-composeのバージョンを指定します。特にこだわりが無い場合は最新のバージョンを記述すればよいです。

servicesは起動する各コンテナについての定義を書くところです。今回はwebと、dbという2つのserviceが定義されています。このwebdbが今回で言うコンテナにあたります。分かりやすい名前であれば、無理にwebdbと書く必要はありません。

webimageでベースとなるイメージを、webcontainer_nameで起動するコンテナ名を、webportsでポートフォワーディングの設定を、dbenvironment環境変数を定義しています。

これらを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人が持ち回りでカレンダーを担当しました。
社会人歴も短く、記事としてはまだまだ未熟な部分もあったとは思いますが、これらの記事がご覧いただいた方々の少しでもお役に立てれば幸いです。

参考

HTC Advent Calendar 2020

Docker Desktop で 開発用 Web アプリを起動してみよう

Docker入門(第六回)〜Docker Compose〜