こんにちは、にしむらです。
今回は複数のコンテナを定義してアプリケーションを開発する方法です。 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.yml
のservices
毎にコンテナを起動します、イメージが存在しない場合は自動でbuild
もしくはpull
されます。
今回の場合は、web
はDockerfile
をもとにbuild
されて、db
はDocker Hubからmysql:5.7
をpull
します。
イメージが既に存在する場合は、それをもとにコンテナが作成されます。
さらに、コンテナが作成済みの場合はそのコンテナを起動します。
イメージが存在しない場合の結果
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
を入力して、web
とdb
の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へアクセスする準備ができました。