- 投稿日:2021-01-10T23:34:36+09:00
DockerでMySQL環境を0 -> 1で作る
本記事でやること
DockerでMySQL環境を作る
Databaseを作る
テーブルを作る
データをいれる環境
Docker
mysql 5.7DockerでMySQL環境を作る
本記事で使う親フォルダを作る
$ mkdir mysql-sampleそして、 docker-compose.yml を作る
docker-compose.ymlversion: "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.cnfmysql clientはmysqlのイメージに含まれている。
本記事ではそれを使う。docker-compose up -dでコンテナを立ち上げる。
すると、mysqlが初期化され、
プロジェクトのmysqlフォルダ以下に db-data というフォルダができる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) (文字列) ユーザー名 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-8B7AD846DE05insert 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
- 投稿日:2021-01-10T23:06:46+09:00
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とかで定期的に実行するシェルを作成してバックアップするのでしょうが・・・一旦後回しで。
- 投稿日:2021-01-10T21:42:41+09:00
【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.rbclass User < ApplicationRecord has_one_attached :image ⬅️これを記述 〜以下略〜 end①ユーザーモデル
②レビュー投稿モデル
合計2つのモデルにhas_one_attached :image
を記述しました。そしてマイグレーションファイルから画像保存用の記述を削除して、db:migrateをする。
結果
record_typeというカラムにUserとPartyという2つの表示がされています。
大成功!(やっぱり会えたねActive Strage
気になったこと
ユーザーは複数枚の画像投稿(もしくは動画)が可能なように考えているのですが、もう1つテーブルを作ってそこに
has_many_attached
を使って保存されるのだろうか?
複数の場合はhas_one
からhas_many
に変わるとのことですがこのカラムを見ているとできそうな雰囲気も感じますが、実際にやってみた結果はまたこちらで記事を書こうと思います。以上、Active Strageで2つのテーブルから画像を保存する方法でした。
- 投稿日:2021-01-10T15:57:50+09:00
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-ymlversion: '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に接続するための記述 - dbDockerfile
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 installGemfile
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.ymldefault: &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まとめ
途中エラーが幾つか発生しましたが、Dockerはもちろんrails,Mysqlを学ぶいい機会となりました。
次は本番環境(heroku)へのデプロイもまとめます。
- 投稿日:2021-01-10T15:57:50+09:00
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-ymlversion: '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に接続するための記述 - dbDockerfile
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 installGemfile
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.ymldefault: &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まとめ
途中エラーが幾つか発生しましたが、DockerはもちろんRails,Mysqlを学ぶいい機会となりました。
次は本番環境(heroku)へのデプロイもまとめます。
- 投稿日:2021-01-10T08:11:38+09:00
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の置き場所を選びます。
- セキュリティグループのインバウンドルールを追加します。タイプはMYSQL/Auroraでソースを0.0.0.0/0とします。アウトバウンドはそのままでセキュリティグループを作成します。
- セキュリティグループが完成しました。
DBサブネットグループの作成
- RDSのサブネットグループメニューからDBサブネットグループの作成画面を開きます。名前と説明を入力します。
- VPCに対象のVPCを入力して、このVPCに関連するすべてのサブネットを追加します。作成ボタンを押します。
- DBサブネットグループが完成しました。
データベースを作成する
- RDBのデータベース作成画面を開きます。エンジンのタイプでMySQLを選択します。
- テンプレートで無料利用枠を選びます。DBインスタンス識別子でデータベース名を入力します。
- 認証情報としてマスターユーザー名とパスワードを入力します。
- VPCは対象のVPC、先ほど作ったDBサブネットグループを選択します。パブリックアクセスはなしにしました。
- セキュリティグループは既存で先ほど作成したもの、アベイラビリティゾーンはどれか一つを選択してデータベースの作成を行います。
- データベースの作成が正常に始まりました。これは10分ほど時間がかかります。
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により可用性を高めることができると思います。
参考文献
- 投稿日:2021-01-10T00:25:47+09:00
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つがあります。①拡張機能が多い。
②小規模から大規模のデータの取り扱いができる。
③柔軟性が高い。最後に、、、お願い!
ブログを最後まで見ていただきありがとうございます。
私も勉強中でありますので、訂正箇所や捕捉がありましたら
どんどんコメントして下さい!!
よろしくお願いします!!