1. Docker-compose
1.1 Docker-compose とは ?
- Chapter2にてDockerfileを利用により環境を構築するとわかりました。
- でも、DockerHubにある複数Imageを流用するとか、色々な提案に共有のデータベースを作成したい場合はどうやるべきですか?
➡ 別別のContainerを繋げるようにdocker-composeが生成される。
1.2 インストール
DockerCompose をダウンロードしインストールする。
インストールしてからインストールされているかチェックする。
docker-compose -v
2. 利用仕方
2.1 背景
下記通りにdocker-composeを作成する
- ① Container1: アプリは
Springフレームワーク
利用する - ② Container2: データベースは
MySQL
です
今回のデモは簡単的なシナリオ:①アプリは②データベースに接続しデータを取得し表示する。
2.2 作成手順
① 要求に応じてロカールで簡単的アプリを作成する
ブラウザ上:
MySQL:
② Docker上にアプリをデプロイする
1. ファイルごとの役割説明
-
docker-composer.yml
プロジェクトのContainerを定義・設定する -
Dockerfile
[Docker] 2.Dockerfileにて説明済み
2. ファイル中身
- docker-composer.yml
ポイントとしては environment 変数。SpringコンテナーとMySQLコンテナーを連携するため。
services: spring-webapp: # Image名 image: compose-1 # Container名 container_name: spring-container # Dockerファイルからビルドする build: . # Port定義 ports: - "9008:8080" networks: - employee-mysql # アプリ内利用するの変数 environment: DATASOURCE: jdbc:mysql://mysql-database:3306/testdb?allowPublicKeyRetrieval=true&useSSL=false # データベースを先に起動すると定義 depends_on: - mysql-database mysql-database: # Image名 (DockerHubからpullする) image: mysql:8 container_name: mysql-container restart: always networks: - employee-mysql environment: - MYSQL_ROOT_PASSWORD=root networks: employee-mysql:
- Dockerfile
FROM tomcat:8-jdk15-openjdk-oracle RUN rm -rf /usr/local/tomcat/webapps/HelloSpringMySQL.war COPY webroot/webapps/HelloSpringMySQL.war /usr/local/tomcat/webapps/ CMD ["catalina.sh","run"]
3. Docker上にアプリをビルドする
compose-1
コンテナーをビルドする
例では単純にDocker ImageをPullするから、このステップが要らなくてもいいですが
実際にはWebappのImageをPullしたら色々Commandを実施しないと(Dockerfileに参考)ので、このポストにて実際的な例を出したいとおもう。
docker build -t compose-1 .
- composerを起動し上のコンテナーを
mysql
コンテナーに繋げる
docker-compose up
docker-compose
の中でdocker-compose.ymlにて定義されたmysql-container
とspring-container
コンテナーを起動したことを確認できる
- 結果:
アプリが正常にデプロイ出来ましたが、データベースが初期されてないので、エラー500が出ている。
③ データベースを初期し確認する
1. データベースを初期する
docker container exec -it d9388157a7f4 bash mysql -u root -p create database testdb; use testdb; CREATE TABLE hello ( ID int NOT NULL AUTO_INCREMENT, test varchar(255) NOT NULL, PRIMARY KEY (ID)
); INSERT INTO hello (test) VALUES ("Duy");
2.結果確認
- 結果:
二つのContainer (WebAppとDB)を連携できるようになりました。
ソースコードはGithubに投げましたのでご参考ください。