Docker Composeを使って複数のコンテナを管理する

f:id:ingnis:20201120144028j:plain

こんにちは、にしむらです。

今回は複数のコンテナを定義してアプリケーションを開発する方法です。 Docker Composeによって、Rubyとデータベース(MySQL)のコンテナを連携させて開発ができるようにしていきます。

動作環境

  • OS macOS 10.15.7
  • docker desktop community 3.0.1
  • docker-compose 1.27.4

Docker Composeとは

複数のコンテナを定義して実行するためのツールです。YAMLファイルを使って設定を行っていきます。

使用するファイル

使用するファイルは前回にdocker-compose.ymlを追加します。

.
├── Dockerfile
├── docker-compose.yml
└── app
    └── sample.rb

docker-compose.yml

version: '3'
services:
  web:                # sinatraコンテナをwebとして定義
    build: .          # カレントディレクトリのDockerfileでイメージがbuildされる
    ports:            # ポートの設定
      - "8000:4567"
    volumes:          # volumeのマウント
      - ./app:/sinatra_app
  db:                 # mysqlコンテナをdbとして定義
    image: mysql:5.7  # 公式のmysqlイメージをpullする
    environment:      # 環境変数
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: password
    ports:            # ポートの設定
      - "3306:3306"
    volumes:          # volumeのマウント、名前付きvolumeを利用する
      - db-data:/var/lib/mysql
volumes:              # dbで名前付きvolumeを利用するための定義
  db-data:

servicesに作成したいコンテナを記述していきます。webは前回から作成しているsinatraになります。 そして、今回dbを追加しsinatraで利用できる状態にしていきます。

参考 Compose ファイル・リファレンス — Docker-docs-ja 19.03 ドキュメント

手順

1.コンテナを起動する

コマンド docker-compose up -d を実行


解説

使い方 docker-compose up [オプション] [サービス...]

docker-compose.ymlservices毎にコンテナを起動します、イメージが存在しない場合は自動でbuildもしくはpullされます。 今回の場合は、webDockerfileをもとにbuildされて、dbはDocker Hubからmysql:5.7pullします。 イメージが既に存在する場合は、それをもとにコンテナが作成されます。 さらに、コンテナが作成済みの場合はそのコンテナを起動します。


イメージが存在しない場合の結果

Creating network "03_default" with the default driver
Creating volume "03_db-data" with default driver
Building web
Step 1/5 : FROM ruby:2.7.2-alpine
2.7.2-alpine: Pulling from library/ruby
801bfaa63ef2: Pull complete
ba81004cc3f9: Pull complete
b516164300bc: Pull complete
d0535b286e7c: Pull complete
dc21f12d6926: Pull complete
Digest: sha256:0c5bfb251217128d2f308c5bc6928ac041a25b36f2775fdf901ce95cdc09162f
Status: Downloaded newer image for ruby:2.7.2-alpine
 ---> f811257adce0
Step 2/5 : RUN gem install sinatra sinatra-contrib
 ---> Running in 6f5edbd9c6c8
Successfully installed rack-2.2.3
Successfully installed tilt-2.0.10
Successfully installed rack-protection-2.1.0
Successfully installed ruby2_keywords-0.0.4
Successfully installed mustermann-1.1.1
Successfully installed sinatra-2.1.0
Successfully installed multi_json-1.15.0
Successfully installed sinatra-contrib-2.1.0
8 gems installed
Removing intermediate container 6f5edbd9c6c8
 ---> 2794dbeff6e9
Step 3/5 : WORKDIR /sinatra_app
 ---> Running in 38a6c001f10d
Removing intermediate container 38a6c001f10d
 ---> bf8dea449ec5
Step 4/5 : EXPOSE 4567
 ---> Running in 55a7fb83685d
Removing intermediate container 55a7fb83685d
 ---> ace2c019de8a
Step 5/5 : CMD ["ruby", "sample.rb"]
 ---> Running in 331873389df3
Removing intermediate container 331873389df3
 ---> 9a7c53e6b1a0

Successfully built 9a7c53e6b1a0
Successfully tagged 03_web:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
a076a628af6f: Pull complete
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1831ac1245f4: Pull complete
37677b8c1f79: Pull complete
27e4ac3b0f6e: Pull complete
7227baa8c445: Pull complete
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
Creating 03_web_1 ... done
Creating 03_db_1  ... done


確認

コマンド docker-compose ps を入力して、webdbのStateがUpとなっていること。

  Name               Command             State                 Ports
----------------------------------------------------------------------------------
03_db_1    docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
03_web_1   ruby sample.rb                Up      0.0.0.0:8000->4567/tcp


2.ブラウザで確認

ブラウザで、URLhttp://localhost:8000 と入力して、「Hello docker!!」と表示されていればSinatraが正常に稼働しています。

コマンドdocker-compose stopと入力するとすべてのコンテナが停止します。再度、実行させたい場合は コマンドdocker-compose startと入力してください。 コンテナや作成したリソース(ネットワーク、ボリューム)をまとめて削除する場合は、docker-compose down -vと入力してください。

これで、データベースコンテナを追加できたので、sinatraからmysqlへアクセスする準備ができました。