20210110のMySQLに関する記事は8件です。

DockerでMySQL環境を0 -> 1で作る

本記事でやること

DockerでMySQL環境を作る
Databaseを作る
テーブルを作る
データをいれる

環境

Docker
mysql 5.7

DockerでMySQL環境を作る

本記事で使う親フォルダを作る

$ mkdir mysql-sample

そして、 docker-compose.yml を作る

docker-compose.yml
version: "3"
services:
  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mysql
    volumes:
      - "./mysql/db-data/:/var/lib/mysql" # データ永続化
      - "./mysql/my.cnf:/etc/mysql/conf.d/my.cnf" # 日本語をデータとして使うために必要

MySQL関連のデータをおく場所として mysql フォルダを作る.

そして、MySQLの設定ファイルはmy.cnfに書く。

msql/my.cnf
[mysqld]
character-set-server=utf8

これによりmysqlのデータとして日本語を入力することができる

mysql-sample
├── docker-compose.yml
└── mysql
    └── my.cnf

mysql clientはmysqlのイメージに含まれている。
本記事ではそれを使う。

docker-compose up -d

でコンテナを立ち上げる。
すると、mysqlが初期化され、
プロジェクトのmysqlフォルダ以下に db-data というフォルダができる

スクリーンショット 2021-01-10 22.08.55.png

Attach Shellでコンテナに入る

mysql clientを以下で起動

$ mysql -u root -p

パスワードは docker-compose.yml で設定した mysql

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

...

mysql> 

これでmysqlを起動するまで完了

databaseを作る

dbを全て表示

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.04 sec)

mysql> 

ここに新しく sample というdbを追加する

mysql> create database sample;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample             |
| sys                |
+--------------------+
5 rows in set (0.02 sec)

mysql> 

このdbを操作するために以下のコマンドを打つ

mysql> use sample;
Database changed

これでdb作成まで完了

テーブル作成

最初はテーブルはない。

mysql> show tables;
Empty set (0.01 sec)

mysql> 

そこで、テーブルを作るコマンドを打つが、テーブルを打つコマンドは長いので先にテキストエディタ等で書いておく

CREATE TABLE users (
id int PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password CHAR(36) NOT NULL
);

usersというテーブルを作成する。

このクエリについての解説はざっくり以下

カラム 説明
id int(数値) userを特定するための数字。主キー。自動連番
username varchar(255) (文字列) ユーザー名
email varchar(255) メールアドレス、重複させないためにUNIQUE
password CHAR(36)
(36字以内の英文字)
パスワード。UUIDの文字列にあわせて36

上記のクエリをそのままはりつけて実行

mysql> CREATE TABLE users (
    -> id int PRIMARY KEY AUTO_INCREMENT,
    -> username VARCHAR(255) NOT NULL,
    -> email VARCHAR(255) NOT NULL UNIQUE,
    -> password CHAR(36) NOT NULL
    -> );
Query OK, 0 rows affected (0.07 sec)

mysql> show tables;
+------------------+
| Tables_in_sample |
+------------------+
| users            |
+------------------+
1 row in set (0.01 sec)

mysql> show columns from users;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| username | varchar(255) | NO   |     | NULL    |                |
| email    | varchar(255) | NO   | UNI | NULL    |                |
| password | char(36)     | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)

mysql> 

これでテーブル作成完了

データを追加

UUIDの作成。

macならuuidgenでさくっと作れる。
powershellなら[Guid]::NewGuid()
=> 224A68FF-FB77-4F97-94CF-8B7AD846DE05

insert into users (username, email, password) values ("Teach", "teach@example.com", "uooooo");
mysql> insert into users (username, email, password) values ("Teach", "teach@example.com", "uooooo");
Query OK, 1 row affected (0.01 sec)

mysql> 

データの取得

mysql> select * from users;
+----+----------+-------------------+----------+
| id | username | email             | password |
+----+----------+-------------------+----------+
|  1 | Teach    | teach@example.com | uooooo   |
+----+----------+-------------------+----------+
1 row in set (0.00 sec)

mysql> 

補足

Dockerの他のコンテナからdbをみるときのhostは docker-compose.yml のservice名になる。
したがって以下のように接続する

mysql -u root -h mysql -p
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysqldumpでバックアップを取得する(DockerのMySQL)

はじめに

バックアップって必要だよね

ここまでに作った環境、これから使っていくことを考えると、何かあった時のためにデータのバックアップが必要。

まずは以下の記事を見ながらお勉強。

イメージは何があるかな。
RedmineとMySQLだけ。

$ docker images
REPOSITORY          TAG       IMAGE ID       CREATED       SIZE
redmine             latest    f2b5b69f9ad5   4 weeks ago   440MB
hypriot/rpi-mysql   latest    4f3cbdbc3bdb   2 years ago   209MB

立ち上がっているコンテナは何があるかな。
これもRedmineとMySQLだけ。

$ docker ps -a
CONTAINER ID   IMAGE               COMMAND                  CREATED        STATUS        PORTS                    NAMES
5190a7c0980c   hypriot/rpi-mysql   "/entrypoint.sh mysq…"   19 hours ago   Up 19 hours   3306/tcp                 redmine-db
a2afe2cb982a   redmine             "/docker-entrypoint.…"   19 hours ago   Up 19 hours   0.0.0.0:3000->3000/tcp   redmine

起動したMySQLのコンテナ(redmine-db)で稼働するMySQLデータベースは、/var/lib/mysqlディレクトリに格納されています。
中身を確認すると、色々入っているのがわかります。

$ docker exec -it redmine-db ls -l /var/lib/mysql
total 36876
-rw-rw---- 1 mysql mysql  5242880 Jan 10 01:10 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 Jan  9 06:55 ib_logfile1
-rw-rw---- 1 mysql mysql 27262976 Jan 10 01:10 ibdata1
drwx------ 2 mysql mysql     4096 Jan  9 06:55 mysql
drwx------ 2 mysql mysql     4096 Jan  9 06:55 performance_schema
drwx------ 2 mysql mysql     4096 Jan  9 06:57 redmine

記事ではここから中身をtarに固めてimportして・・・とやっていますが、そこは机上での確認とさせてもらって。

Dockerでの データボリューム という考え方について学んだところで、redmine-dbに設定されているデータボリュームを確認します。
確認してデータボリュームがわかったけど、docker export/importではバックアップ/リストアができない仕様 であるとのこと。(docker commitでもデータボリュームを含んでイメージ化できない)
データボリュームは、個別にバックアップ/リストアする必要がある・・・ということまでわかりました。

$ docker inspect redmine-db
[
    {

~~~~~~~~~~~略~~~~~~~~~~~

            "Image": "hypriot/rpi-mysql",
            "Volumes": {
                "/var/lib/mysql": {}
            },

~~~~~~~~~~~略~~~~~~~~~~~

    }
]

DockerのMySQLにアクセスする

DockerのMySQLにログインします。
パスワードを聞かれるので、忘れてたらログインできません。

$ docker exec -it redmine-db mysql -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.5.60-0+deb7u1 (Debian)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

今、存在しているデータベースを確認します。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| redmine            |
+--------------------+
4 rows in set (0.00 sec)

今、存在しているRedmineのテーブル一覧を確認します。

mysql> show tables in redmine;
+-------------------------------------+
| Tables_in_redmine                   |
+-------------------------------------+
| ar_internal_metadata                |
| attachments                         |
| auth_sources                        |
| boards                              |
| changes                             |
| changeset_parents                   |
| changesets                          |
| changesets_issues                   |
| comments                            |
| custom_field_enumerations           |
| custom_fields                       |
| custom_fields_projects              |
| custom_fields_roles                 |
| custom_fields_trackers              |
| custom_values                       |
| documents                           |
| email_addresses                     |
| enabled_modules                     |
| enumerations                        |
| groups_users                        |
| import_items                        |
| imports                             |
| issue_categories                    |
| issue_relations                     |
| issue_statuses                      |
| issues                              |
| journal_details                     |
| journals                            |
| member_roles                        |
| members                             |
| messages                            |
| news                                |
| open_id_authentication_associations |
| open_id_authentication_nonces       |
| projects                            |
| projects_trackers                   |
| queries                             |
| queries_roles                       |
| repositories                        |
| roles                               |
| roles_managed_roles                 |
| schema_migrations                   |
| settings                            |
| time_entries                        |
| tokens                              |
| trackers                            |
| user_preferences                    |
| users                               |
| versions                            |
| watchers                            |
| wiki_content_versions               |
| wiki_contents                       |
| wiki_pages                          |
| wiki_redirects                      |
| wikis                               |
| workflows                           |
+-------------------------------------+
56 rows in set (0.00 sec)

今、存在するユーザの一覧を確認します。

mysql> select host,user from mysql.user;
+------+------+
| host | user |
+------+------+
| %    | root |
+------+------+
1 row in set (0.00 sec)

バックアップ〜リストア

ダンプファイルでバックアップを取得する

まず、バックアップ用にユーザを作成します。
バックアップ以外にも使うかもしれませんが・・・。

usernameにユーザ名を、passwordにパスワードを入れて実行し、ユーザを作成します。
それからGRANTで権限を付与します。
作成したユーザ(今回はruserという名前にしました)が存在することを確認します。

mysql> create user 'username'@'%' identified by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'ruser'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> select host,user from mysql.user;
+------+-------+
| host | user  |
+------+-------+
| %    | root  |
| %    | ruser |
+------+-------+
2 rows in set (0.00 sec)

mysqldump でバックアップを取得します。
このコマンドに辿り着くまでに試行錯誤を繰り返しましたが、そこは割愛。

$ docker exec -it redmine-db mysqldump redmine -uruser -ppassword > /backup/testbackup.sql

ちゃんと取れているか、中身を確認します。
大丈夫そうです。

$ cat /backup/testbackup.sql 
-- MySQL dump 10.13  Distrib 5.5.60, for debian-linux-gnu (armv7l)
--
-- Host: localhost    Database: 
-- ------------------------------------------------------
-- Server version   5.5.60-0+deb7u1

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

~~~~~~~~~~~略~~~~~~~~~~~

--
-- Dumping data for table `workflows`
--

LOCK TABLES `workflows` WRITE;
/*!40000 ALTER TABLE `workflows` DISABLE KEYS */;
/*!40000 ALTER TABLE `workflows` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2021-01-10 12:35:45

リストアする時は

以下のコマンドでリストアできます。
ちゃんとリストアできました。

$ docker exec -i redmine-db mysql redmine -uruser -ppassword < /backup/testbackup.sql

試行錯誤したmysqldumpなど

以下のようなコマンドでもダンプファイル取得できました。(こっちがFirst Versionで、上に記載したのがSecond Version)
色々試行錯誤して、頑張ってみたんです。

$ docker exec -it redmine-db sh -c 'exec /usr/bin/mysqldump --all-databases -uruser -ppassword --single-transaction' > /backup/testbackup.sql

その他、①起動しているコンテナ確認→②コンテナ停止→③停止したこと確認→④コンテナ削除→⑤削除を確認・・・。
起動していればSTATUSがup、停止していればExited になります。

$ docker ps -a
CONTAINER ID   IMAGE               COMMAND                  CREATED        STATUS       PORTS                    NAMES
5190a7c0980c   hypriot/rpi-mysql   "/entrypoint.sh mysq…"   31 hours ago   Up 8 hours   3306/tcp                 redmine-db
a2afe2cb982a   redmine             "/docker-entrypoint.…"   31 hours ago   Up 8 hours   0.0.0.0:3000->3000/tcp   redmine
$ docker stop 5190a7c0980c a2afe2cb982a
5190a7c0980c
a2afe2cb982a
$ docker ps -a
CONTAINER ID   IMAGE               COMMAND                  CREATED        STATUS                     PORTS     NAMES
5190a7c0980c   hypriot/rpi-mysql   "/entrypoint.sh mysq…"   31 hours ago   Exited (0) 4 seconds ago             redmine-db
a2afe2cb982a   redmine             "/docker-entrypoint.…"   31 hours ago   Exited (1) 8 seconds ago             redmine
$ docker rm 5190a7c0980c a2afe2cb982a
5190a7c0980c
a2afe2cb982a
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

終わりに

これで無事にバックアップが取得できるようになりました。
ちゃんとするなら、cronとかで定期的に実行するシェルを作成してバックアップするのでしょうが・・・一旦後回しで。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】よっ!Active Strage!有能なGem!〜2つのテーブルから画像を保存できる〜

ずっと謎だったこと

Active Strageで画像を保存する時に二つのテーブルから保存できるのか?ということがずっと疑問でした。
現在オリジナルアプリを開発中なのですがレビューサイトのため、
①ユーザーのプロフ写真
②レビュー対象の写真
この二つを保存したかったのですが複数のテーブルから保存する方法がいまいちよくわからなかったため、ユーザーのほうはtext型にて保存、Active Strageを使用するのはレビュー対象のみとしていました。
本日、マイグレーションをrollbackしなければいけないミスがあり、ついでだからやってみようと思い立ち、以下の作業をしました。

・ユーザーテーブルに保存していた画像保存予定だったカラムを消去
・ユーザー登録時&レビュー対象登録時にそれぞれ写真が保存できるか確認

まずはマイグレーションを編集します。

% rails db:rollback  

このコマンド、最初は実行するのがとてもとても怖かったです(初心者あるある
その後、状況がどうなっているかをしっかり確認するためステータスをチェック。

% rails db:migrate:status  

database: party_freak_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210107124355  Devise create users                 ⬅️変更目標はここ
   up     20210108071047  Create parties 
   up     20210108094951  Create active storage tablesactive storage
   up     20210108122152  Rename iintroduction column to parties  ⬅️リネームした履歴
   up     20210108123328  Rename date id column to parties      ⬅️リネームした履歴
  down    20210108130921  Change column to allow null      ⬅️null制約変更した履歴

下の3つは昨日変更したテーブルのカラムの名前とnull制約に関するマイグレーションファイルです。
よくよく考えたらリネームしてマイグレーションファイルを増やすならrollbackしてマイグレーションファイルを直に修正したほうが余計なファイルが増えなくていいんじゃないか?
と気付き、rollbackを繰り返し行って下の3つのマイグレーションファイルをコードエディタ上から右クリック→削除しました。スッキリ。

繰り返す時はこのコマンドが便利です。

 % rails db:rollback STEP=5 
                ⬆️=の後にdownを0とし(次のupから1と数える)その回数だけrollback
                 今回の自分のケースだと5でした

よく見たら一瞬焦ったこと

== 20210108094951 CreateActiveStorageTables: reverting ========================
-- drop_table(:active_storage_attachments, {})
   -> 0.0470s
-- drop_table(:active_storage_blobs, {})
   -> 0.0363s
== 20210108094951 CreateActiveStorageTables: reverted (0.0847s) ===============

Active Strageがdropになってるううううううううううううう!
またやらかしたああああああああああああああああ!
消したものはしょうがないどうせまた戻るだろ前しか見えねえ(確認犯
db:migrateで、きっとまた会えるよね?そう信じて次に進む。

ユーザーモデルにActive Strageを使えるようにする記述を行います。

app/models/user.rb
class User < ApplicationRecord

  has_one_attached :image  ⬅️これを記述

〜以下略〜

end

①ユーザーモデル
②レビュー投稿モデル
合計2つのモデルにhas_one_attached :imageを記述しました。

そしてマイグレーションファイルから画像保存用の記述を削除して、db:migrateをする。

結果

5d39289236b741ec2dcc8f2c4ed856eb.png

record_typeというカラムにUserPartyという2つの表示がされています。

大成功!(やっぱり会えたねActive Strage

気になったこと

ユーザーは複数枚の画像投稿(もしくは動画)が可能なように考えているのですが、もう1つテーブルを作ってそこにhas_many_attachedを使って保存されるのだろうか?
複数の場合はhas_oneからhas_manyに変わるとのことですがこのカラムを見ているとできそうな雰囲気も感じますが、実際にやってみた結果はまたこちらで記事を書こうと思います。

以上、Active Strageで2つのテーブルから画像を保存する方法でした。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでRails構築

参考サイト

Docker超入門 :きよとのプログラミング大学
丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)

環境

Mac OS
docker-compose 1.27.4
Mysql 8.0
ruby 2.7
rails 6.1.0

ファイル作成・記述

terminal.
 ~ % cd Desktop
Desktop % mkdir rails_on_docker
Desktop % cd rails_on_docker
rails_on_docker % tree  
├── Dockerfile
├── docker-compose.yml
└── src
    └── Gemfile
1 directory, 3 files
rails_on_docker % code .

docker-compose-yml

docker-compose-yml
version: '3'
# 管理するコンテナの記述
services:
  # データベース
  db:
    image: mysql:8.0
    # Mysqlの認証設定
    command: --default-authentication-plugin=mysql_native_password
    volumes:
    # ローカルのデータ:dockerのデータ 同期するための記述
      - ./src/db/mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
  # rails
  web:
    # ディレクトリ直下のDockerfileを参照
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
    # ローカルのデータ:dockerのデータ 同期するための記述
      - ./src:/app
    ports:
    # ローカルのポート:dockerのポート
      - "3000:3000"
    depends_on:
    # Myaqlに接続するための記述
      - db

Dockerfile

Dockerfile
# ベースイメージの指定
FROM ruby:2.7

# 必要なライブラリのインストール
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && apt-get update -qq \
  && apt-get install -y nodejs yarn 
#   作業ディレクトリの指定
WORKDIR /app
# ソース以下のファイルをコピー
COPY ./src /app
# rubyに必要なgemのインストール
RUN bundle config --local set path 'vendor/bundle' \
  && bundle install

Gemfile

Gemfile
# railsのgemをインストールするための雛形
source 'https://rubygems.org'

gem 'rails','~> 6.1.0'

railsのインストール

使用するコマンド

terminal.
% docker-compose run <サービス> <コマンド>

railsのインストール

terminal.
rails_on_docker % docker-compose run web rails new . --force --database=mysql  // dbをmysqlに指定しrailsのインストール --force(強制的に実行オプション)
.
.
.
Webpacker successfully installed ? ?

イメージのビルド

terminal.
rails_on_docker % docker-compose build 

新しく作成されたdatabase.ymlに追記

database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password  //記述
  host: db  //記述

データベースの作成

terminal.
rails_on_docker % docker-compose run web rails db:create  

起動

terminal.
rails_on_docker % docker-compose up

スクリーンショット 2021-01-10 15.41.57.png

まとめ

途中エラーが幾つか発生しましたが、Dockerはもちろんrails,Mysqlを学ぶいい機会となりました。
次は本番環境(heroku)へのデプロイもまとめます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails環境構築 with Docker

参考サイト

Docker超入門 :きよとのプログラミング大学
丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)

環境

Mac OS
docker-compose 1.27.4
Mysql 8.0
ruby 2.7
rails 6.1.0

ファイル作成・記述

terminal.
 ~ % cd Desktop
Desktop % mkdir rails_on_docker
Desktop % cd rails_on_docker
rails_on_docker % tree  
├── Dockerfile
├── docker-compose.yml
└── src
    └── Gemfile
1 directory, 3 files
rails_on_docker % code .

docker-compose-yml

docker-compose-yml
version: '3'
# 管理するコンテナの記述
services:
  # データベース
  db:
    image: mysql:8.0
    # Mysqlの認証設定
    command: --default-authentication-plugin=mysql_native_password
    volumes:
    # ローカルのデータ:dockerのデータ 同期するための記述
      - ./src/db/mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
  # rails
  web:
    # ディレクトリ直下のDockerfileを参照
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
    # ローカルのデータ:dockerのデータ 同期するための記述
      - ./src:/app
    ports:
    # ローカルのポート:dockerのポート
      - "3000:3000"
    depends_on:
    # Myaqlに接続するための記述
      - db

Dockerfile

Dockerfile
# ベースイメージの指定
FROM ruby:2.7

# 必要なライブラリのインストール
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && apt-get update -qq \
  && apt-get install -y nodejs yarn 
#   作業ディレクトリの指定
WORKDIR /app
# ソース以下のファイルをコピー
COPY ./src /app
# rubyに必要なgemのインストール
RUN bundle config --local set path 'vendor/bundle' \
  && bundle install

Gemfile

Gemfile
# railsのgemをインストールするための雛形
source 'https://rubygems.org'

gem 'rails','~> 6.1.0'

railsのインストール

使用するコマンド

terminal.
% docker-compose run <サービス> <コマンド>

railsのインストール

terminal.
rails_on_docker % docker-compose run web rails new . --force --database=mysql  // dbをmysqlに指定しrailsのインストール --force(強制的に実行オプション)
.
.
.
Webpacker successfully installed ? ?

イメージのビルド

terminal.
rails_on_docker % docker-compose build 

新しく作成されたdatabase.ymlに追記

database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password  //記述
  host: db  //記述

データベースの作成

terminal.
rails_on_docker % docker-compose run web rails db:create  

起動

terminal.
rails_on_docker % docker-compose up

スクリーンショット 2021-01-10 15.41.57.png

まとめ

途中エラーが幾つか発生しましたが、DockerはもちろんRails,Mysqlを学ぶいい機会となりました。
次は本番環境(heroku)へのデプロイもまとめます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RDSでMySQLデータベースを作るための覚書

はじめに

AWSのRDSにMySQLのデータベースを作ります。こちらで作成したEC2から接続できるようにします。

全体概要

下記のツリーのようにオブジェクトを作っていきます。「AAA」は任意の名前に読み替えしてください。

  • VPC AAAvpc01 10.0.0.0/16 こちらで作ったものを使います。
  • EC2 RDSに適用するためのセキュリティグループを作ります。
    • セキュリティグループ AAASGRDS01
      • MYSQL/Aurora 3306/TCP from 0.0.0.0/0
  • RDS
    • DBサブネットグループ AAADBSUB01
    • MySQLデータベース aaamysql01

MySQLデータベースの作成

先にセキュリティグループとDBサブネットを作ってからRDSを作成します。

セキュリティグループの作成

  • EC2のセキュリティグループ新規作成画面を開きます。セキュリティグループの名前と説明を入れてVPCはRDSの置き場所を選びます。 image.png
  • セキュリティグループのインバウンドルールを追加します。タイプはMYSQL/Auroraでソースを0.0.0.0/0とします。アウトバウンドはそのままでセキュリティグループを作成します。 image.png
  • セキュリティグループが完成しました。 image.png

DBサブネットグループの作成

  • RDSのサブネットグループメニューからDBサブネットグループの作成画面を開きます。名前と説明を入力します。 image.png
  • VPCに対象のVPCを入力して、このVPCに関連するすべてのサブネットを追加します。作成ボタンを押します。 image.png
  • DBサブネットグループが完成しました。 image.png

データベースを作成する

  • RDBのデータベース作成画面を開きます。エンジンのタイプでMySQLを選択します。 image.png
  • テンプレートで無料利用枠を選びます。DBインスタンス識別子でデータベース名を入力します。 image.png
  • 認証情報としてマスターユーザー名とパスワードを入力します。 image.png
  • VPCは対象のVPC、先ほど作ったDBサブネットグループを選択します。パブリックアクセスはなしにしました。 image.png
  • セキュリティグループは既存で先ほど作成したもの、アベイラビリティゾーンはどれか一つを選択してデータベースの作成を行います。 image.png
  • データベースの作成が正常に始まりました。これは10分ほど時間がかかります。 image.png

MySQLクライアントの作成

$  sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
$  yum info mysql
$  sudo yum-config-manager --disable mysql57-community
$  sudo yum-config-manager --enable mysql80-community
$  sudo yum install -y mysql-community-client
$  mysql --version

接続テスト

下記のように接続テストを行います。HOSTNAMEは作成したデータベースの接続とセキュリティの設定にあるエンドポイント(例:aaamysql01.c3xhaaxcxwwl.ap-northeast-1.rds.amazonaws.com)を入力します。

$ mysql -h HOSTNAME -P 3306 -u admin -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.20 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

EC2から接続ができました!

おわりに

  • データベースのセキュリティグループでインバウンドのソースを無制限にしていますが、RDSのパブリックアクセスを「なし」にしたので、VPC内からのみ接続可能になります。パブリックアクセスをありにするとインターネットからデータベース接続が可能になると思います。
  • データベースのテンプレートとして無料枠を利用して作成しましたが、本番環境を選ぶとマルチAZにより可用性を高めることができると思います。

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RBDについて説明します!

#RDB(リレーショナル・データベースについて)h1

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RDB(リレーショナル・データベース)について説明します

RDB(リレーショナル・データベース)とは

表形式でデータを管理するデータベースのこと。
行を示している名称を【レコード】列を【カラム】という。
次はRDBを実際に管理するシステムについて説明します。

RDBを管理するシステム、RDBMS(RDB,マネジメントシステム)とは

RDBMSはRDBを管理するシステムのこと。
ターミナルにrails newコマンドを実行するときに、-dオプションでRDBMSを指定する。
ターミナルでの記述例は以下の通り。

% rails _6.0.0_ new アプリケーション名 -d RDBMSを指定する

RDBMSの具体的なシステムについて

RDBMSの種類にはMy SQLというものがあります。
My SQLの特徴に関しては、以下の3つがあります。

①拡張機能が多い。
②小規模から大規模のデータの取り扱いができる。
③柔軟性が高い。

最後に、、、お願い!

ブログを最後まで見ていただきありがとうございます。
私も勉強中でありますので、訂正箇所や捕捉がありましたら
どんどんコメントして下さい!!
よろしくお願いします!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む