[Docker] 3.Docker-compose
Bài đăng này đã không được cập nhật trong 3 năm
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に投げましたのでご参考ください。
参考資料
参考ソース
All rights reserved