MySQL道普請便り
第106回 Docker Composeを使って便利にMySQLを利用してみる
DockerでMySQLを利用する方法に関しては,
検証環境
今回はmacOS Mojavepip install docker-compose
などを利用してdocker-composeを追加でインストールする必要があります。
Docker Composeとは?
Dockerでよく使われるコンテナオーケストレーションツールの一種で,
- 複数のMySQLのバージョンを使うアプリケーションを切り替えて利用する場合
- MySQLのバージョンアップでどんな問題が発生するか調査したい場合
たとえば,
アプリケーション側の準備
今回は,
Gemfile
source "https://rubygems.org"
gem 'sinatra'
gem 'mysql2'
Rubyアプリケーションの内容は以下になります。
main.
require 'sinatra'
require 'mysql2'
require 'json'
get '/' do
get_json
end
def get_json
client = Mysql2::Client.new(username: 'root', host: 'db', database: 'data_store', password: 'password')
client.query('SELECT * FROM data').to_a.to_json
end
dataテーブル内にある情報を1件取得してjson形式で返すアプリケーションです。
続いてDockerfileとdocker-compose.
Dockerfile
FROM ruby:2.6-alpine3.9
ENV APP_ROOT /usr/src/app
WORKDIR $APP_ROOT
RUN apk add --no-cache mysql-client \
mysql-dev\
alpine-sdk
alpineのRubyのイメージをベースに必要なソフトウェアをインストールしています。そしてdocker-compose.
docker-compose.
version: "3.7"
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: data_store
sinatra:
build: .
command: ./start.sh
volumes:
- ./:/usr/src/app
depends_on:
- db
ports:
- "4567:4567"
見てみるとそれほど難しくないように見えると思います。versionはdocker-composeのバージョンを示していて,
sinatraでは今回作成したDockerイメージをビルドして利用します。commandではshellスクリプトを実行できるのですが,
途中で出てきたstart.chmod 755 start.
と忘れずに実行してください。
start.
#!/bin/sh
bundle install
until mysqladmin ping -h db -P 3306 --silent; do
>&2 echo "MySQL is unavailable - sleeping"
sleep 2
done
mysql -uroot -h db -ppassword data_store < ./initial.sql
bundle exec ruby main.rb -o 0.0.0.0
until mysqladmin ping -h db -P 3306 --silent
の部分で何をしているかというと,mysqladmin
を利用してMySQLが立ち上がるのを待っています。
完了したあとにDBの初期化を行って,
initial.
drop table if exists data_store.data;
CREATE TABLE data_store.data(name varchar(255));
INSERT INTO data_store.data VALUE ("test");
最後に設置したときのイメージを載せておきます。
$ ls Dockerfile Gemfile Gemfile.lock docker-compose.yml initial.sql main.rb sql start.sh
実際に動作を確認してみる
それでは,
$ docker-compose build kimurakouichirounoMacBook-Pro:demo koichiro.kimura$ docker-compose build db uses an image, skipping Building sinatra Step 1/4 : FROM ruby:2.6-alpine3.9 ---> 1fbb4d7710eb Step 2/4 : ENV APP_ROOT /usr/src/app ---> Using cache ---> ddeffb842a7e Step 3/4 : WORKDIR $APP_ROOT ---> Using cache ---> 52655a3119f8 Step 4/4 : RUN apk add --no-cache mysql-client mysql-dev alpine-sdk ---> Using cache ---> fff7623a1636 Successfully built fff7623a1636 Successfully tagged demo_sinatra:latest
今回dbで指定したimageは公式のものなので,Successfully built
が成功していたら,
$ docker-compose run sinatra -d
-d
を入れることで,
$ curl http://localhost:4567 [{"name":"test"}]
initial.
止める時はdocker-compose downとすることで,
$ docker-compose down Stopping demo_sinatra_1 ... done Stopping demo_db_1 ... done Removing demo_sinatra_1 ... done Removing demo_db_1 ... done Removing network demo_default
動作がうまく行かなかった場合
MySQLが起動しなくなった場合などに起動時のログを確認したい場合があると思います。その場合にはdocker-compose logs
コマンドを実行することで,
$ docker-compose logs
ちなみにですが,docker-compose down
をしてコンテナを一度落としてから起動しましょう。
またここで発見したエラーは,perror
というコマンドを利用して検索することもできます。
$ perror 28 OS error code 28: No space left on device
こちらも合わせて覚えておくと便利でしょう。
まとめ
今回は,
このような環境を整備しておくと,
バックナンバー
MySQL道普請便り
- 第141回 LIMIT句の利用について
- 第140回 オンラインスキーママイグレーションツール gh-ostを使ってみよう[その3]
- 第139回 オンラインスキーママイグレーションツール gh-ostを使ってみよう[その2]
- 第138回 オンラインスキーママイグレーションツール gh-ostを使ってみよう[その1]
- 第137回 MySQLTunerを使ってチューニングの足がかりを見つけてみる
- 第136回 CHECK制約を利用してみよう
- 第135回 MySQL 8.0で追加されたoptimizer_switchのフラグについて
- 第134回 DDLと暗黙的なコミットについて
- 第133回 Partial Revokesによる権限の一部剥奪について
- 第132回 Internal Temporary Table(内部テンポラリテーブル)について[その2]