この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
以前はAmazonLinux2でDocker環境構築、DockerでMySQL環境構築別々にを紹介しましたが、
WEB系プロジェクトを開発する際には少なくともDBとAP同時に必要と思われますので、
今回は1つのdockercomposeファイルで複数コンテナ(mysql,nodejs)管理する方法を紹介します。
※内容が多いですので、2つ文章に分けて発表します。
事前条件
- EC2インスタンス作成済
- 上記のインスタンスに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/