背景:
前回の記事でマイクロサービス(API)+MySQL+Redisを構築してみました。
3つのコンテナがあるため、Run MySQL⇒Run Redis⇒Run APIという流れで、
1つ整ったプロジェクトは初めて構築完了します。
3回のRunがあるし、順番にも気をつける必要があります。ちょっと不便ですね。
今回はdocker-composeという便利ツールを使って3つのコンテナを1発で起動します。
1. docker-composeとは
- docker composeは、複数のDockerコンテナを定義し、起動および管理するためのツールです。Docker Composeを使用すると、複数のコンテナを簡単に管理できます。コンテナの起動順序、ネットワークの設定、環境変数の設定などを定義することができます。
- docker composeは、YAML形式で記述された構成ファイル(docker-compose.yml)を使用して、コンテナの構成を定義します。このファイルには、起動するコンテナのイメージ、ボリューム、ポートのマッピング、環境変数、依存関係などが記述されます。また、Docker Composeを使用することで、Dockerコンテナをクラウド上で簡単にスケールアップすることができます。
- docker-composeとdokcer compseの違いについて
👇下記の公式サイトをご参照ください。
Composeの発展
⇒簡単に言えば、docker-composeとdokcer compseはどちらでも使えますが、
dokcer compseは新しいバージョンなので、使い慣れましょう。
2. インストール方法:
2-1. 公式サイト
英 語:https://docs.docker.com/compose/install/
日本語:https://docs.docker.jp/compose/index.html
2-2. インストールタイプ(2023/03/18時点の情報)
2-2-1. タイプ 1: Docker Desktop をインストールする
- Linux
- Mac
- Windows
※Docker Desktop には、Compose の前提条件である Docker Engine および Docker CLI とともに Docker Compose が含まれています。
また、システム要件があるめ、自分には向いてないです。Linuxの場合は
2-2-2. タイプ 2: Compose プラグインをインストールする
2-2-3. タイプ 3: Compose スタンドアロンをインストールする
⇒ ノート:タイプ 3はサポートされなくなりました。しかし、まだ使えそうです。
- タイプ 3手順の抜粋:
curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose -v
- タイプ 3がなくなったら:
GitHub 上にある Compose リポジトリのリリースページ から最新バージョンをダウンロードして、サーバに配置するのも可能です。(v2.16.0は2023/03/18時点の最新バージョンです。)
👇は手動でダウンロードしてインストールする流れです。
cd /usr/local/bin
wget https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64
mv docker-compose-linux-x86_64 ./docker-compose
chmod +x docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
- 上記はCentOS7.9で検証済み
要するに、最新バージョンのdocker-compose実行ファイルをダウンロードして、
実行権限を付与して、必要の場合、/usr/binにdocker-composeのリンク(sudo ln -sで)を作成します。
2-3. 参考:Ubuntuでのインストール
⇒ Ubuntuでdockerをインストールする(docker-composeを含む)
2-4. docker-composeとdokcer compseの違いについて
下記の公式サイトをご参照ください。
Composeの発展
⇒簡単に言えば、docker-composeとdokcer compseはどちらでも使えますが、
dokcer compseは新しいバージョンなので、使い慣れましょう。
3. dokcer-composeでマイクロサービス+MySQL+Redisを構築
dokcer-composeを使わない場合の構築は下記の記事をご参照ください
マイクロサービス(API)の開発+MySQL+Redis+Swagger
3-1. 今回プロジェクト用のdocker networkを作成
[root@localhost tinkouka]# docker network create tin_net
3ed4dcc91e2ed4ad552b540ebd86bdbc2e22ee9f3b1f77286ebb9d6cb1aa04c2
[root@localhost tinkouka]# docker network ls | grep tin
3ed4dcc91e2e tin_net bridge local
[root@localhost tinkouka]#
3-2. マイクロサービスの「application.properties」を修正
docker networkを使うため、IPの指定ではなく、サービス名を指定すること。
MySQについて:
修正前:spring.datasource.url=jdbc:mysql://192.168.1.13:3306/db2023?useUnicode=true&characterEncoding=utf-8&useSSL=false
修正後:spring.datasource.url=jdbc:mysql://mysql:3306/db2023?useUnicode=true&characterEncoding=utf-8&useSSL=false
Redisについて:
修正前:spring.redis.host=192.168.1.13
修正後:spring.redis.host=redis
3-3. jarを作成、サーバにアップロード
[root@localhost tinkouka]# pwd
/tinkouka
[root@localhost tinkouka]# ll
total 56864
-rw-r--r--. 1 root root 58218859 Mar 18 17:15 docker_boot-1.0-SNAPSHOT.jar
-rw-r--r--. 1 root root 569 Mar 17 21:12 Dockerfile
drwxr-xr-x. 5 root root 42 Mar 18 17:09 mysql
drwxr-xr-x. 3 root root 36 Mar 18 17:09 redis
[root@localhost tinkouka]#
3-4. Dockerfaileを作成して、Dockerfaileでマイクロサービスのイメージを作成
- Dockerfile
# ベースイメージ:java
FROM openjdk:8
# 作者
MAINTAINER tinkouka
# VOLUME命令は、一時ファイルのディレクトリを「/tmp」として指定し、
# ホストの「/var/lib/docker」ディレクトリに一時ディレクトリを作成して、それをコンテナの「/tmp」にリンクしました。
VOLUME /tmp
# jarをコンテナに入れる、また「tin-docker.jar」にリネーム
ADD docker_boot-1.0-SNAPSHOT.jar tin-docker.jar
ENTRYPOINT ["java","-jar","/tin-docker.jar"]
# 6001ポート
EXPOSE 6001
- Dockerfileを実行
[root@localhost tinkouka]# docker build -t tin-docker:1.1 .
[+] Building 0.9s (7/7) FINISHED
<省略>
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:51b7c16cba603c6c244c9e49413814fbb53c8ce850c88bee4a57e6df942f6bec 0.0s
=> => naming to docker.io/library/tin-docker:1.1 0.0s
[root@localhost tinkouka]# docker images | grep tin-docker
tin-docker 1.1 51b7c16cba60 About a minute ago 584MB
[root@localhost tinkouka]#
3-5. docker-compose.yamlファイルを作成
注目ポイント:depends_onの定義(この定義により、コンテナの起動順番が決まりますね)
version: "3"
services:
microService:
image: tin-docker:1.1
container_name: ms01
ports:
- "6001:6001"
volumes:
- /tinkouka/microService:/data
networks:
- tin_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /tinkouka/redis/redis.conf:/etc/redis/redis.conf
- /tinkouka/redis/data:/data
networks:
- tin_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2023'
MYSQL_USER: 'tin'
MYSQL_PASSWORD: '123'
ports:
- "3326:3306"
volumes:
- /tinkouka/mysql/conf:/etc/mysql/conf.d
- /tinkouka/mysql/logs:/logs
- /tinkouka/mysql/data:/var/lib/mysql
networks:
- tin_net
command: --default-authentication-plugin=mysql_native_password #外部のアクセスを有効にする
networks:
tin_net:
3-6. docker-compose.yamlを実行。
これで一発で3コンテナを起動できます。(マイクロサービス+MySQL+Redis)
[root@localhost tinkouka]# docker-compose up -d
[+] Running 7/7
⠿ redis Pulled 9.5s
⠿ bb79b6b2107f Pull complete 4.3s
⠿ 1ed3521a5dcb Pull complete 4.4s
⠿ 5999b99cee8f Pull complete 4.6s
⠿ 3f806f5245c9 Pull complete 5.3s
⠿ f8a4497572b2 Pull complete 5.4s
⠿ eafe3b6b8d06 Pull complete 5.5s
[+] Running 4/4
⠿ Network tinkouka_tin_net Created 0.4s
⠿ Container tinkouka-redis-1 Started 1.1s
⠿ Container tinkouka-mysql-1 Started 1.1s
⠿ Container ms01 Started 1.8s
[root@localhost tinkouka]#
[root@localhost tinkouka]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e67df21516f2 tin-docker:1.1 "java -jar /tin-dock…" 16 seconds ago Up 14 seconds 0.0.0.0:6001->6001/tcp, :::6001->6001/tcp ms01
0da36ba5c833 redis:6.0.8 "docker-entrypoint.s…" 16 seconds ago Up 14 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp tinkouka-redis-1
33be2173cc7b mysql:5.7 "docker-entrypoint.s…" 16 seconds ago Up 14 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp tinkouka-mysql-1
[root@localhost tinkouka]#
3-7. MySQLコンテナにテーブルを作って、テストしよう
3-7-1. テーブルを作る
docker exec -it コンテナID /bin/bash
mysql -uroot -p
create database db2023;
use db2023;
CREATE TABLE `t_user` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'user-name',
`password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'password',
`sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT 'sex 0=female,1=male',
`deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'delete-flag,default 0=not delete,1=delete',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'update-time',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'create-time',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='user-table';
3-7-2. ブラウザで機能確認
http://自分のIP:6001/swagger-ui.html#
3-7-3. データ追加後のMySQLを確認
mysql> select count(*) from t_user;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.01 sec)
4. まとめ(常用コマンド)
docker-composeの使用で複数のコンテナを一括で管理できますね。
コンテナ達の新規起動はdocker-compose up
またはdocker-compose up -d
;
コンテナ達の起動はdocker-compose start
;
コンテナ達の停止はdocker-compose stop
;
コンテナ達の撤去(停止及び削除)はdocker-compose down
;
コンテナ達の一覧はdocker-compose ps
補足:
docker-compose -h
: docker-composeのマニュアルを開く
docker-compose config -q
: docker-compose.yamlファイルをチェック
コメント欄