サイドバーの壁紙
博主头像
tin博主等级

子の曰わく、我れ三人行なえば必ず我が師を得(う)。其の善き者を択びてこれに従う。其の善からざる者にしてこれを改む。

  • 累積執筆 72 記事
  • 累計作成 32 タグ
  • 累計受入 2 コメント

目 次CONTENT

記事目次

Docker入門から(第7回:docker-composeのインストール及び使用)

tin
tin
2023-03-18 / 0 コメント / 2 いいね! / 98 読み / 2,553 文字

背景:

前回の記事でマイクロサービス(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の場合は
    image-1679121152054

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#
image-1679129653618

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ファイルをチェック

2
  • 2

コメント欄