以前はAmazonLinux2でDocker環境構築、DockerでMySQL環境構築別々にを紹介しましたが、
WEB系プロジェクトを開発する際には少なくともDBとAP同時に必要と思われますので、
今回は1つのdockercomposeファイルで複数コンテナ(mysql,nodejs)管理する方法を紹介します。
※内容が多いですので、2つ文章に分けて発表します。

事前条件

  1. EC2インスタンス作成済
  2. 上記のインスタンスにDockerをインストール済
    前回ブログ参照:Amazon Linux2 でDockerのインストール(ハンズオン)

docker composeインストール

#インストール
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#権限設定
sudo chmod +x /usr/local/bin/docker-compose
#バージョン確認
docker-compose --version

#その他コマンド(必要な場合実行)
#削除
#sudo rm /usr/local/bin/docker-compose

ファイル、フォルダの準備

1. 階層図

docker
├── docker-compose.yml
├── .env
├── mysql
│   ├── conf
│   │   └── my.cnf
│   ├── datadir
│   ├── initdb
│   │   └── 1_init.sql
│   └── logs
└── node
    ├── Dockerfile
    └── myapp
        ├── package.json
        └── src
            └── index.js

2. コマンド

mkdir ./docker
mkdir ./docker/mysql
mkdir ./docker/mysql/conf
mkdir ./docker/mysql/datadir
mkdir ./docker/mysql/initdb
mkdir ./docker/mysql/logs
mkdir ./docker/node
mkdir ./docker/node/myapp
mkdir ./docker/node/myapp/src

3. mysqlコンテナ用設定ファイル

①db設定ファイル

./docker/mysql/conf/my.cnf

# MySQLサーバーへの設定
[mysqld]
# 文字コード/照合順序の設定
character-set-server = utf8mb4
collation-server = utf8mb4_bin

# タイムゾーンの設定
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# mysqlクライアントツールの設定
[client]
# 文字コードの設定
default-character-set = utf8mb4

②データ初期化用スクリプト

./docker/mysql/initdb/1_init.sql

-- ダータベース作成
create database testdb;
-- テーブル作成
create table testdb.user (id int,name varchar(256));
-- テストデータ作成
insert into testdb.user values(1,'ユーザー1');
insert into testdb.user values(2,'ユーザー2');
insert into testdb.user values(3,'ユーザー3');
-- 権限設定
grant ALL PRIVILEGES on testdb.* to test;

4. node用ファイル

①Dockerfile

./docker/node/Dockerfile

FROM node:12.21

# コンテナのワークスペースフォルダを指定する
WORKDIR /usr/src/app

#package.jsonファイルはホストからコピーする
COPY ./myapp/package*.json ./

# 必要なパッケージのインストール
RUN npm install
EXPOSE 8005 
CMD [ "npm", "start" ]

②テスト用ファイル

./docker/node/myapp/src/index.js

var mysql = require('mysql');
var express = require('express');
var app = express();
var port = process.env.PORT || 8005;
console.log(port);

var responseStr = "MySQL Data:";
app.get('/',function(req,res){
   var connectionOptions = {
     host: process.env.MYSQL_HOST,
     port: process.env.MYSQL_PORT ,
     user: process.env.MYSQL_USER,
     password: process.env.MYSQL_PASS,
     database: process.env.MYSQL_DB
   };
   console.log('MySQL Connection config:');
   console.log(connectionOptions);

   var connection = mysql.createConnection(connectionOptions);
   var queryStr = "SELECT * FROM testdb.user ";
   connection.connect();
   connection.query(queryStr, function (error, results, fields) {
     if (error) throw error;
     responseStr = JSON.stringify(results);
     if(responseStr.length == 0)
        responseStr = 'No records found';
     console.log(responseStr);
     res.status(200).send(responseStr);
   });
   connection.end();
});

app.listen(port, function(){
    console.log('Sample mySQL app listening on port ' + port);
});

③パッケージファイル

./docker/node/myapp/package.json

{
    "name": "mysql-db-example",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
      "start": "node ./src/index.js"
    },
    "author": "",
    "license": "ISC",
    "dependencies": {
      "express": "^4.16.4",
      "mysql": "^2.17.1"
    }
  }

続き

Docker Cmposeで複数コンテナ管理②(ハンズオン)へ
https://cloud5.jp/docker-cmpose-2/

Last modified: 2021-04-06

Author