Viblo CTF
+5

[Docker] 3.Docker-compose

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-containerspring-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