20210416のdockerに関する記事は11件です。

【とりあえずハンズオン】DockerでNoSQLをやってみた

はじめに この記事ではデータベースの分野なんて RDS で十分やろ、NoSQL なんてと 思っている一般男性が Docker でちゃちゃっと NoSQL 環境を構築して どんなもんか試してみる記事です。 ベストプラクティスや間違いがあれば、書き直していく予定です。 NoSQL とは Not Only SQL の略 昨今では SQL を利用しないデータベース技術全般を指す。 主な特徴 よく言われる特徴としては 非構造化データ、ドキュメント指向、キーバリューストア、列指向といった特徴がある。 代表的な OSS など Redis、memchached、MongoDB... AWS では DynamoDB が NoSQL のサービスに挙げられる。 RDB とは何が違う NoSQL では RDB のような関係演算がなく また、ドキュメント指向データベースにおいてはドキュメントと呼ばれる最小単位でデータを管理し、厳密なスキーマというモノが存在しない。 RDB であれば最小単位はレコードという単位でカラムが定義されており データのあるなしに関係なくカラムを用意する。 ハンズオンのセットアップその前に 今回はドキュメント指向のデータベースである MongoDB を利用して NoSQL を体感します。 MongoDB は NoSQL の中でもドキュメント指向データベースに分類されるデータベースです。 まずはドキュメント指向データベースの特徴をおさえていきましょう。 ドキュメントとは ドキュメント指向データベースにおける最小単位を表すデータ構造のことをドキュメントといいます。 RDB ではレコードに相当する。 コレクションとは ドキュメント指向データベース におけるドキュメントの集合体のことをコレクションといいます。 RDB ではテーブルに相当する。 ハンズオン セットアップ 今回は MogoDB を PC にインストールせず、Docker 環境でセットアップします。 まずは、Docker Hub から mongo イメージを pull docker pull mongo $ docker pull mongo Using default tag: latest latest: Pulling from library/mongo 6e0aa5e7af40: Pull complete d47239a868b3: Pull complete 49cbb10cca85: Pull complete 9729d7ec22de: Pull complete 7b7fd72268d8: Pull complete 5e2934dacaf5: Pull complete bf9da24d4b2c: Pull complete d2f8c3715616: Pull complete e9f96a4a45b0: Pull complete bd66718f31e2: Pull complete 41ed4d1a1542: Pull complete 7336dfc228e2: Pull complete Digest: sha256:b66f48968d757262e5c29979e6aa3af944d4ef166314146e1b3a788f0d191ac3 Status: Downloaded newer image for mongo:latest docker.io/library/mongo:latest ※mongodb ではないです。 docker run --detach -p 8080:8080 --name nosql mongo docker exec -it nosql sh プロンプトに入ったら mongo と打ってインタラクティブモードに入る。 基本コマンド help > help db.help() help on db methods db.mycoll.help() help on collection methods sh.help() sharding helpers rs.help() replica set helpers help admin administrative help help connect connecting to a db help help keys key shortcuts help misc misc things to know help mr mapreduce show dbs show database names show collections show collections in current database show users show users in current database show profile show most recent system.profile entries with time >= 1ms show logs show the accessible logger names show log [name] prints out the last segment of log in memory, 'global' is default use <db_name> set current database db.mycoll.find() list objects in collection mycoll db.mycoll.find( { a : 1 } ) list objects in mycoll where a == 1 it result of the last line evaluated; use to further iterate DBQuery.shellBatchSize = x set default number of items to display on shell exit quit the mongo shell show dbs 現在、サーバに用意されているデータベースを一覧にして表示する。 local という名前のデータベースはどうやら、MongoDB で予約済みのデータベースとのこと。 > show dbs admin 0.000GB config 0.000GB local 0.000GB use 利用するデータベースを選択する。 ここは MariaDB や MySQL などと使い方が似てるので好き。(感想) > use ymd switched to db ymd で、どうやら MongoDB とやらに新規作成コマンドというモノは存在せず 利用するデータベースがなければ勝手に作るとのこと。 (なにそれ怖い) show collections データベース内にあるコレクションをすべて表示する。 コレクションとは RDB でいうところのレコードに相当する。(大事なことなので 2 度) > db.ymd.insert({name:"yamada"}) WriteResult({ "nInserted" : 1 }) > show collections ymd 射影 同じみ、データの参照には find もしくは findOne を利用する。 findOne は条件に一致したモノを 1 つだけ取り出す。 > db.ymd.find() { "_id" : ObjectId("60798dd00a265a3f171a87a9"), "name" : "yamada" } > db.ymd.insert({name:"yamada",age:22}) WriteResult({ "nInserted" : 1 }) > db.ymd.insert({name:"yamada",age:27}) WriteResult({ "nInserted" : 1 }) > db.ymd.find() { "_id" : ObjectId("60798dd00a265a3f171a87a9"), "name" : "yamada" } { "_id" : ObjectId("6079916e0a265a3f171a87aa"), "name" : "yamada", "age" : 22 } { "_id" : ObjectId("607991750a265a3f171a87ab"), "name" : "yamada", "age" : 27 } > db.ymd.findOne({name:"yamada"}) { "_id" : ObjectId("60798dd00a265a3f171a87a9"), "name" : "yamada" } 条件つきの射影 SQL でいうところの WHERE に匹敵するもの。 ワイルドカードはダメでした。(もしかして、他に方法があるのかも) > db.ymd.find({name:"yamada"}) { "_id" : ObjectId("60798dd00a265a3f171a87a9"), "name" : "yamada" } データの更新 データの更新には update を用いる。 > db.ymd.find() { "_id" : ObjectId("60798dd00a265a3f171a87a9"), "name" : "yamada" } { "_id" : ObjectId("6079916e0a265a3f171a87aa"), "name" : "yamada", "age" : 22 } { "_id" : ObjectId("607991750a265a3f171a87ab"), "name" : "yamada", "age" : 27 } > db.ymd.update({name:"yamada"},{age:27}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.ymd.find() { "_id" : ObjectId("60798dd00a265a3f171a87a9"), "age" : 27 } { "_id" : ObjectId("6079916e0a265a3f171a87aa"), "name" : "yamada", "age" : 22 } { "_id" : ObjectId("607991750a265a3f171a87ab"), "name" : "yamada", "age" : 27 } name が丸ごと age に置き換わり、yamada が消えましたね。(これ、実務で起きたらアウトな奴や。) コレクションの削除 SQL でいうところの DELETE テーブルに匹敵する構文 > db.ymd.drop() true 消えたのかどうかわからんので確認 > db.ymd.find() > 消えましたね。 データベースを削除 dropped Database あんまり使わないだろうけどこれも一応確認 > db.dropDatabase() { "dropped" : "ymd", "ok" : 1 } これってデータベース が 2 つ以上あったときどんな動きするんだ。。。 と思ったら最後に use したモノに対して drop が働くようですね。 > db test2 > show dbs admin 0.000GB config 0.000GB local 0.000GB test1 0.000GB > > > db.test2.insert({name:"aaa"}) WriteResult({ "nInserted" : 1 }) > > > show dbs admin 0.000GB config 0.000GB local 0.000GB test1 0.000GB test2 0.000GB > db.dropDatabase() { "dropped" : "test2", "ok" : 1 } > > show dbs admin 0.000GB config 0.000GB local 0.000GB test1 0.000GB > 最後に test1 を削除して exit して終了しましょう。 > use test1 switched to db test1 > db.dropDatabase() { "dropped" : "test1", "ok" : 1 } > > > > > help db.help() help on db methods db.mycoll.help() help on collection methods sh.help() sharding helpers rs.help() replica set helpers help admin administrative help help connect connecting to a db help help keys key shortcuts help misc misc things to know help mr mapreduce show dbs show database names show collections show collections in current database show users show users in current database show profile show most recent system.profile entries with time >= 1ms show logs show the accessible logger names show log [name] prints out the last segment of log in memory, 'global' is default use <db_name> set current database db.mycoll.find() list objects in collection mycoll db.mycoll.find( { a : 1 } ) list objects in mycoll where a == 1 it result of the last line evaluated; use to further iterate DBQuery.shellBatchSize = x set default number of items to display on shell exit quit the mongo shell > exit bye Docker の終了処理 さらに exit を打って Docker の shell から抜けましょう。 使い終わったコンテナは削除したいのでコマンドをパコパコうちます。 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 39657c4067ed mongo "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:8080->8080/tcp, 27017/tcp nosql $ docker stop nosql $ docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 39657c4067ed mongo "docker-entrypoint.s…" About an hour ago Exited (0) 21 seconds ago nosql f506e4068511 mongo "docker-entrypoint.s…" About an hour ago Exited (0) About an hour ago tender_hertz $ doker rm nosql $ docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f506e4068511 mongo "docker-entrypoint.s…" About an hour ago Exited (0) About an hour ago tender_hertz 作成に失敗したコンテナもある場合は同じく rm で消しましょう。 所感 NoSQL って SQL 使わないだけあってリレーショナルしかやってこなかった人には結構つらいかも。というのも SQL という資産を活用できないところとか今までのデータベースの設計技法などが使えないところとかもうなんだろう、新しく学ぶ感じで違うベクトルの知見が必要なのかなと感じました。 まとめ 今回は ドキュメント指向データベースのNoSQL、MongoDB をDocker 上で起動してハンズオンしました。 ちなみに、Ruby の Web フレームワークで同じみの Rails に使われているActiveRecordですが、互換インターフェイスを持つ NoSQL として「Mongoid」というものがあるそうです。 とはいえ、個人的には MariaDB か PostgreSQL 安定かな。 おわり
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【docker入門】超・初心者と一緒にハンズオンしながらwebサーバを立ち上げよう

■1. はじめに 今現在、docker超・初心者です? dockerって、なんとなく分かってはいるけど、触ったことないので、モヤモヤ……… とりあえずwebサーバの立ち上げをハンズオンして簡単に理解していきたいと思います。ちなみに、webサーバはnginx(エンジンエックス)を使用したいと思います。 ■2. やること dockerを簡単に理解しつつ、win10に環境を整えていきます。dockerコマンドを実施する際にPowerSellよりもbash等の方が使いやすいので、WSL2(Windows Subsystem for Linux ver.2)、Ubuntuもインストールしていきます。 具体的には以下5つです。 ➊dockerの簡単な理解 ➋docker desktopのインストール ➌WSL2機能をON ➍Ubuntuのインストール ➎webサーバの立ち上げ (dockerコマンドをいじる) ■3. お勉強 おさらいも含めてかる~くお勉強。いきなり詰めすぎてもお腹いっぱいになっちゃうので、とりあえず最小限度のお勉強です。 (1)dcokerとは dcokerは、コンテナというパッケージ化したアプリを使用することで、どこでも誰でも同じ環境が作れたり、ハイパーバイザを使用せずホストマシンのカーネルを利用することで軽量で高速といった特徴があります。 ▶この辺りの情報は、おおよその人が耳にしている情報だと思います。再確認。 (2)dockerの基本コマンドとステータス 大まかな流れをこちらで確認しておきます。 「イメージ」はファイルで、「コンテナ」はプロセスなんだなと簡単に理解をしておきます。 ■4. 準備 docker desktopをインストールします。また、win10の場合、WSL2(Windows Subsystem for Linux ver.2)を有効とし、Ubuntuもインストールしておきます。 (1)docker desktopをインストール 以下から、docker desktopをダウンロードしてください。 【ダウンロード】docker desktop https://www.docker.com/products/docker-desktop インストール時のチェックボックスなどは、デフォルトのままインストールしてしまってOKです。win10の場合は、WSL2もインストールを促されますが、便利なのでそのままインストールしてしまいましょう。 (2)WSL2 Linuxカーネル更新プログラムをインストール ※win10のみ WSL2をインストールした場合は、Linuxカーネルを更新します。以下から、「Linux カーネル更新プログラム」をダウンロードしてください。 【ダウンロード】x64マシン用 WSL2 Linuxカーネル更新プログラム パッケージ https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi カーネル更新プログラムをダウンロード後、実行してください。特に分岐もなく更新が可能です。 (3) Ubuntu ※win10のみ WSL2をインストールした場合は、Linux ディストリビューションとして今回は「Ubuntu」をインストールします。 【Microsoft Store】Ubuntu https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6?activetab=pivot:overviewtab そのままインストールすればなんとかなるレベルですが、詳細は以下をご確認ください。 参考:選択したLinuxディストリビューションをインストールします (4) WSL1 → WSL2 ※win10のみ powershellを使い、以下のコマンドで配布バージョンの確認をしてください。 wsl --list --verbose powershell > wsl --list --verbose NAME STATE VERSION * Ubuntu Running 1 配布バージョンが1の場合は、バージョン2へ変更してください。 wsl --set-version 'distribution Name' 'version Number' powershell > wsl --set-version Ubuntu 2 変換中です。この処理には数分かかることがあります... WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください 変換が完了しました。 > > wsl --list --verbose NAME STATE VERSION * Ubuntu Running 2 参考:配布バージョンをWSL1またはWSL2に設定します 参考:WSL 1 と WSL 2 の比較 ■5. dcokerでwebサーバ構築 ときは満ちました.........あなたにはそのチカラがあります......... Ubuntuを起動して、下記のdcokerコマンドを実行していきます。 (1)nginxイメージのダウンロード docker pullコマンドを使って、dockerHubにあるnginx(webサーバ)の最新版をダウンロードします。 bash $ docker pull nginx:latest latest: Pulling from library/nginx f7ec5a41d630: Pull complete aa1efa14b3bf: Pull complete b78b95af9b17: Pull complete c7d6bca2b8dc: Pull complete cf16cd8e71e0: Pull complete 0241c68333ef: Pull complete Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest (2)イメージの確認 docker imagesコマンドを使って、イメージの確認をします。 bash $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 62d49f9bab67 2 days ago 133MB (3)htmlの準備 各自好きなhtmlを用意すれば良いのですが、面倒なので以前作成したhtmlを利用します。下記リンクを右クリックし「名前をつけてリンク先を保存」を選択し、「c:¥Users¥username¥html」に「index.html」を保存してください。 ゴクリ・カウンター https://github.com/PoodleMaster/gokuri_counter/blob/main/index.html (4)コンテナの実行 docker runコマンドを使って、コンテナを実行します。 bash $ docker run --name some-nginx -v /mnt/c/Users/username/html:/usr/share/nginx/html:ro -p 8080:80 -d nginx 88279b1d909945ade6874a663cd21a2e8d855b4202920b29943c6290c991c0ed win10の「c:¥Users¥username¥html」は、Ubuntu上では「/mnt/c/Users/username/html」となります。 (5)ブラウザでアクセス chromeなどのブラウザから「 http://localhost:8080 」とURL入力し、サイトへアクセスします。 ゴクリ・カウンターが表示されれば成功です! (6)コンテナの状況を見てみましょう docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 0.0.0.0:8080->80/tcp some-nginx docker runコマンドを使って起動したコンテナが「UP(起動中)」状態となっているのを確認することができました。 (7)コンテナを停止する docker stopコマンドを使って、コンテナを停止させます。 bash $ docker stop some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 13 minutes ago Exited (0) 48 seconds ago some-nginx docker stopコマンドを使ったため、コンテナが「Exit(停止中)」状態となっているのを確認することができました。 試しに「 http://localhost:8080 」へアクセスすると、HPは表示されません。 (8)コンテナを開始する docker startコマンドを使って、コンテナを再開させます。 bash $ docker start some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 18 minutes ago Up 4 seconds 0.0.0.0:8080->80/tcp some-nginx docker startコマンドを使って開始させたコンテナが「UP(起動中)」状態となっているのを確認することができました。 試しに「 http://localhost:8080 」へアクセスすると、HPが再度表示されます。 (9)コンテナを削除する コンテナは停止中でないと削除できません。まずはdocker stopコマンドを使って、コンテナを停止させます。 bash $ docker stop some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 13 minutes ago Exited (0) 48 seconds ago some-nginx 続いてはdocker rmコマンドを使って、コンテナを削除します。 bash $ docker rm some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES docker rmコマンドで、コンテナが削除されたことを確認することができました。 (10)イメージを削除する docker rmiコマンドを使って、イメージを削除します。 ※注意:イメージは、参照するコンテナがあると削除できません。コンテナを停止させ、参照するコンテナも削除する必要があります。 $ docker rmi nginx:latest Untagged: nginx:latest Untagged: nginx@sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412 Deleted: sha256:62d49f9bab67f7c70ac3395855bf01389eb3175b374e621f6f191bf31b54cd5b Deleted: sha256:3444fb58dc9e8338f6da71c1040e8ff532f25fab497312f95dcee0f756788a84 Deleted: sha256:f85cfdc7ca97d8856cd4fa916053084e2e31c7e53ed169577cef5cb1b8169ccb Deleted: sha256:704bf100d7f16255a2bc92e925f7007eef0bd3947af4b860a38aaffc3f992eae Deleted: sha256:d5955c2e658d1432abb023d7d6d1128b0aa12481b976de7cbde4c7a31310f29b Deleted: sha256:11126fda59f7f4bf9bf08b9d24c9ea45a1194f3d61ae2a96af744c97eae71cbf Deleted: sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d docker imagesコマンドを使って、イメージの状況を確認します。 bash $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker rmiコマンドで、イメージが削除されたことを確認することができました。 ■6. 参考:docker基本コマンド一覧 コマンドの仕様詳細は「 Docker-docs-ja」を参照しください。 コマンド 説明 仕様詳細 docker pull dockerHubからイメージを取得 https://docs.docker.jp/engine/reference/commandline/pull.html docker images イメージの一覧表示 https://docs.docker.jp/engine/reference/commandline/images.html docker run コンテナ起動 https://docs.docker.jp/engine/reference/run.html docker ps コンテナの一覧表示 https://docs.docker.jp/engine/reference/commandline/ps.html) docker create コンテナ作成 https://docs.docker.jp/engine/reference/commandline/create.html docker stop コンテナ停止 https://docs.docker.jp/engine/reference/commandline/stop.html docker rm コンテナ削除 https://docs.docker.jp/engine/reference/commandline/rm.html docker rmi イメージ削除 https://docs.docker.jp/engine/reference/commandline/rmi.html ■7. 以上 お疲れ様でした! dcokerを利用して、簡単にwebサーバを立ち上げることができました。これら一連の作業を行うことで、dockerの基本的なコマンド、ステータス等を学ぶことができました。次は、コンテナを管理ができるKubernetes(クバネティス)辺りを調べられたらと思っています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【docker】超初心者のwebサーバ立ち上げ

■1. はじめに dockerって、なんとなく分かってはいるけど、触ったことないので、モヤモヤ……… とりあえずwebサーバの立ち上げをハンズオンして簡単に理解していきたいと思います。ちなみに、webサーバはnginx(エンジンエックス)を使用したいと思います。 ■2. やること dockerを簡単に理解しつつ、win10に環境を整えていきます。dockerコマンドを実施する際にPowerSellよりもbash等の方が使いやすいので、WSL2(Windows Subsystem for Linux ver.2)、Ubuntuもインストールしていきます。 具体的には以下5つです。 ➊dockerの簡単な理解 ➋docker desktopのインストール ➌WSL2機能をON ➍Ubuntuのインストール ➎webサーバの立ち上げ (dockerコマンドをいじる) ■3. お勉強 おさらいも含めてかる~くお勉強。いきなり詰めすぎてもお腹いっぱいになっちゃうので、とりあえず最小限度のお勉強です。 (1)dcokerとは dcokerは、コンテナというパッケージ化したアプリを使用することで、どこでも誰でも同じ環境が作れたり、ハイパーバイザを使用せずホストマシンのカーネルを利用することで軽量で高速といった特徴があります。 ▶この辺りの情報は、おおよその人が耳にしている情報だと思います。再確認。 (2)dockerの基本コマンドとステータス 大まかな流れをこちらで確認しておきます。 「イメージ」はファイルで、「コンテナ」はプロセスなんだなと簡単に理解をしておきます。 ■4. 準備 docker desktopをインストールします。また、win10の場合、WSL2(Windows Subsystem for Linux ver.2)を有効とし、Ubuntuもインストールしておきます。 (1)docker desktopをインストール 以下から、docker desktopをダウンロードしてください。 【ダウンロード】docker desktop https://www.docker.com/products/docker-desktop インストール時のチェックボックスなどは、デフォルトのままインストールしてしまってOKです。win10の場合は、WSL2もインストールを促されますが、便利なのでそのままインストールしてしまいましょう。 (2)WSL2 Linuxカーネル更新プログラムをインストール ※win10のみ WSL2をインストールした場合は、Linuxカーネルを更新します。以下から、「Linux カーネル更新プログラム」をダウンロードしてください。 【ダウンロード】x64マシン用 WSL2 Linuxカーネル更新プログラム パッケージ https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi カーネル更新プログラムをダウンロード後、実行してください。特に分岐もなく更新が可能です。 (3) Ubuntu ※win10のみ WSL2をインストールした場合は、Linux ディストリビューションとして今回は「Ubuntu」をインストールします。 【Microsoft Store】Ubuntu https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6?activetab=pivot:overviewtab そのままインストールすればなんとかなるレベルですが、詳細は以下をご確認ください。 参考:選択したLinuxディストリビューションをインストールします (4) WSL1 → WSL2 ※win10のみ powershellを使い、以下のコマンドで配布バージョンの確認をしてください。 wsl --list --verbose powershell > wsl --list --verbose NAME STATE VERSION * Ubuntu Running 1 配布バージョンが1の場合は、バージョン2へ変更してください。 wsl --set-version 'distribution Name' 'version Number' powershell > wsl --set-version Ubuntu 2 変換中です。この処理には数分かかることがあります... WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください 変換が完了しました。 > > wsl --list --verbose NAME STATE VERSION * Ubuntu Running 2 参考:配布バージョンをWSL1またはWSL2に設定します 参考:WSL 1 と WSL 2 の比較 ■5. dcokerでwebサーバ構築 ときは満ちました.........あなたにはそのチカラがあります......... Ubuntuを起動して、下記のdcokerコマンドを実行していきます。 (1)nginxイメージのダウンロード docker pullコマンドを使って、dockerHubにあるnginx(webサーバ)の最新版をダウンロードします。 bash $ docker pull nginx:latest latest: Pulling from library/nginx f7ec5a41d630: Pull complete aa1efa14b3bf: Pull complete b78b95af9b17: Pull complete c7d6bca2b8dc: Pull complete cf16cd8e71e0: Pull complete 0241c68333ef: Pull complete Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest (2)イメージの確認 docker imagesコマンドを使って、イメージの確認をします。 bash $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 62d49f9bab67 2 days ago 133MB (3)htmlの準備 各自好きなhtmlを用意すれば良いのですが、面倒なので以前作成したhtmlを利用します。下記リンクを右クリックし「名前をつけてリンク先を保存」を選択し、「c:¥Users¥username¥html」に「index.html」を保存してください。 ゴクリ・カウンター https://github.com/PoodleMaster/gokuri_counter/blob/main/index.html (4)コンテナの実行 docker runコマンドを使って、コンテナを実行します。 bash $ docker run --name some-nginx -v /mnt/c/Users/username/html:/usr/share/nginx/html:ro -p 8080:80 -d nginx 88279b1d909945ade6874a663cd21a2e8d855b4202920b29943c6290c991c0ed win10の「c:¥Users¥username¥html」は、Ubuntu上では「/mnt/c/Users/username/html」となります。 (5)ブラウザでアクセス chromeなどのブラウザから「 http://localhost:8080 」とURL入力し、サイトへアクセスします。 ゴクリ・カウンターが表示されれば成功です! (6)コンテナの状況を見てみましょう docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 0.0.0.0:8080->80/tcp some-nginx docker runコマンドを使って起動したコンテナが「UP(起動中)」状態となっているのを確認することができました。 (7)コンテナを停止する docker stopコマンドを使って、コンテナを停止させます。 bash $ docker stop some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 13 minutes ago Exited (0) 48 seconds ago some-nginx docker stopコマンドを使ったため、コンテナが「Exit(停止中)」状態となっているのを確認することができました。 試しに「 http://localhost:8080 」へアクセスすると、HPは表示されません。 (8)コンテナを開始する docker startコマンドを使って、コンテナを再開させます。 bash $ docker start some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 18 minutes ago Up 4 seconds 0.0.0.0:8080->80/tcp some-nginx docker startコマンドを使って開始させたコンテナが「UP(起動中)」状態となっているのを確認することができました。 試しに「 http://localhost:8080 」へアクセスすると、HPが再度表示されます。 (9)コンテナを削除する コンテナは停止中でないと削除できません。まずはdocker stopコマンドを使って、コンテナを停止させます。 bash $ docker stop some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 13 minutes ago Exited (0) 48 seconds ago some-nginx 続いてはdocker rmコマンドを使って、コンテナを削除します。 bash $ docker rm some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES docker rmコマンドで、コンテナが削除されたことを確認することができました。 (10)イメージを削除する docker rmiコマンドを使って、イメージを削除します。 ※注意:イメージは、参照するコンテナがあると削除できません。コンテナを停止させ、参照するコンテナも削除する必要があります。 $ docker rmi nginx:latest Untagged: nginx:latest Untagged: nginx@sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412 Deleted: sha256:62d49f9bab67f7c70ac3395855bf01389eb3175b374e621f6f191bf31b54cd5b Deleted: sha256:3444fb58dc9e8338f6da71c1040e8ff532f25fab497312f95dcee0f756788a84 Deleted: sha256:f85cfdc7ca97d8856cd4fa916053084e2e31c7e53ed169577cef5cb1b8169ccb Deleted: sha256:704bf100d7f16255a2bc92e925f7007eef0bd3947af4b860a38aaffc3f992eae Deleted: sha256:d5955c2e658d1432abb023d7d6d1128b0aa12481b976de7cbde4c7a31310f29b Deleted: sha256:11126fda59f7f4bf9bf08b9d24c9ea45a1194f3d61ae2a96af744c97eae71cbf Deleted: sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d docker imagesコマンドを使って、イメージの状況を確認します。 bash $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker rmiコマンドで、イメージが削除されたことを確認することができました。 ■6. 参考:docker基本コマンド一覧 コマンドの仕様詳細は「 Docker-docs-ja」を参照しください。 コマンド 説明 仕様詳細 docker pull dockerHubからイメージを取得 https://docs.docker.jp/engine/reference/commandline/pull.html docker images イメージの一覧表示 https://docs.docker.jp/engine/reference/commandline/images.html docker run コンテナ起動 https://docs.docker.jp/engine/reference/run.html docker ps コンテナの一覧表示 https://docs.docker.jp/engine/reference/commandline/ps.html) docker create コンテナ作成 https://docs.docker.jp/engine/reference/commandline/create.html docker stop コンテナ停止 https://docs.docker.jp/engine/reference/commandline/stop.html docker rm コンテナ削除 https://docs.docker.jp/engine/reference/commandline/rm.html docker rmi イメージ削除 https://docs.docker.jp/engine/reference/commandline/rmi.html ■7. 以上 お疲れ様でした! dcokerを利用して、簡単にwebサーバを立ち上げることができました。これら一連の作業を行うことで、dockerの基本的なコマンド、ステータス等を学ぶことができました。次は、コンテナを管理ができるKubernetes(クバネティス)辺りを調べられたらと思っています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【docker】超・初心者のwebサーバ立ち上げ

■1. はじめに dockerって、なんとなく分かってはいるけど、触ったことないので、モヤモヤ……… とりあえずwebサーバの立ち上げをハンズオンして簡単に理解していきたいと思います。ちなみに、webサーバはnginx(エンジンエックス)を使用したいと思います。 ■2. やること dockerを簡単に理解しつつ、win10に環境を整えていきます。dockerコマンドを実施する際にPowerSellよりもbash等の方が使いやすいので、WSL2(Windows Subsystem for Linux ver.2)、Ubuntuもインストールしていきます。 具体的には以下5つです。 ➊dockerの簡単な理解 ➋docker desktopのインストール ➌WSL2機能をON ➍Ubuntuのインストール ➎webサーバの立ち上げ (dockerコマンドをいじる) ■3. お勉強 おさらいも含めてかる~くお勉強。いきなり詰めすぎてもお腹いっぱいになっちゃうので、とりあえず最小限度のお勉強です。 (1)dcokerとは dcokerは、コンテナというパッケージ化したアプリを使用することで、どこでも誰でも同じ環境が作れたり、ハイパーバイザを使用せずホストマシンのカーネルを利用することで軽量で高速といった特徴があります。 ▶この辺りの情報は、おおよその人が耳にしている情報だと思います。再確認。 (2)dockerの基本コマンドとステータス 大まかな流れをこちらで確認しておきます。 「イメージ」はファイルで、「コンテナ」はプロセスなんだなと簡単に理解をしておきます。 ■4. 準備 docker desktopをインストールします。また、win10の場合、WSL2(Windows Subsystem for Linux ver.2)を有効とし、Ubuntuもインストールしておきます。 (1)docker desktopをインストール 以下から、docker desktopをダウンロードしてください。 【ダウンロード】docker desktop https://www.docker.com/products/docker-desktop インストール時のチェックボックスなどは、デフォルトのままインストールしてしまってOKです。win10の場合は、WSL2もインストールを促されますが、便利なのでそのままインストールしてしまいましょう。 (2)WSL2 Linuxカーネル更新プログラムをインストール ※win10のみ WSL2をインストールした場合は、Linuxカーネルを更新します。以下から、「Linux カーネル更新プログラム」をダウンロードしてください。 【ダウンロード】x64マシン用 WSL2 Linuxカーネル更新プログラム パッケージ https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi カーネル更新プログラムをダウンロード後、実行してください。特に分岐もなく更新が可能です。 (3) Ubuntu ※win10のみ WSL2をインストールした場合は、Linux ディストリビューションとして今回は「Ubuntu」をインストールします。 【Microsoft Store】Ubuntu https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6?activetab=pivot:overviewtab そのままインストールすればなんとかなるレベルですが、詳細は以下をご確認ください。 参考:選択したLinuxディストリビューションをインストールします (4) WSL1 → WSL2 ※win10のみ powershellを使い、以下のコマンドで配布バージョンの確認をしてください。 wsl --list --verbose powershell > wsl --list --verbose NAME STATE VERSION * Ubuntu Running 1 配布バージョンが1の場合は、バージョン2へ変更してください。 wsl --set-version 'distribution Name' 'version Number' powershell > wsl --set-version Ubuntu 2 変換中です。この処理には数分かかることがあります... WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください 変換が完了しました。 > > wsl --list --verbose NAME STATE VERSION * Ubuntu Running 2 参考:配布バージョンをWSL1またはWSL2に設定します 参考:WSL 1 と WSL 2 の比較 ■5. dcokerでwebサーバ構築 ときは満ちました.........あなたにはそのチカラがあります......... Ubuntuを起動して、下記のdcokerコマンドを実行していきます。 (1)nginxイメージのダウンロード docker pullコマンドを使って、dockerHubにあるnginx(webサーバ)の最新版をダウンロードします。 bash $ docker pull nginx:latest latest: Pulling from library/nginx f7ec5a41d630: Pull complete aa1efa14b3bf: Pull complete b78b95af9b17: Pull complete c7d6bca2b8dc: Pull complete cf16cd8e71e0: Pull complete 0241c68333ef: Pull complete Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest (2)イメージの確認 docker imagesコマンドを使って、イメージの確認をします。 bash $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 62d49f9bab67 2 days ago 133MB (3)htmlの準備 各自好きなhtmlを用意すれば良いのですが、面倒なので以前作成したhtmlを利用します。下記リンクを右クリックし「名前をつけてリンク先を保存」を選択し、「c:¥Users¥username¥html」に「index.html」を保存してください。 ゴクリ・カウンター https://github.com/PoodleMaster/gokuri_counter/blob/main/index.html (4)コンテナの実行 docker runコマンドを使って、コンテナを実行します。 bash $ docker run --name some-nginx -v /mnt/c/Users/username/html:/usr/share/nginx/html:ro -p 8080:80 -d nginx 88279b1d909945ade6874a663cd21a2e8d855b4202920b29943c6290c991c0ed win10の「c:¥Users¥username¥html」は、Ubuntu上では「/mnt/c/Users/username/html」となります。 (5)ブラウザでアクセス chromeなどのブラウザから「 http://localhost:8080 」とURL入力し、サイトへアクセスします。 ゴクリ・カウンターが表示されれば成功です! (6)コンテナの状況を見てみましょう docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 0.0.0.0:8080->80/tcp some-nginx docker runコマンドを使って起動したコンテナが「UP(起動中)」状態となっているのを確認することができました。 (7)コンテナを停止する docker stopコマンドを使って、コンテナを停止させます。 bash $ docker stop some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 13 minutes ago Exited (0) 48 seconds ago some-nginx docker stopコマンドを使ったため、コンテナが「Exit(停止中)」状態となっているのを確認することができました。 試しに「 http://localhost:8080 」へアクセスすると、HPは表示されません。 (8)コンテナを開始する docker startコマンドを使って、コンテナを再開させます。 bash $ docker start some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 18 minutes ago Up 4 seconds 0.0.0.0:8080->80/tcp some-nginx docker startコマンドを使って開始させたコンテナが「UP(起動中)」状態となっているのを確認することができました。 試しに「 http://localhost:8080 」へアクセスすると、HPが再度表示されます。 (9)コンテナを削除する コンテナは停止中でないと削除できません。まずはdocker stopコマンドを使って、コンテナを停止させます。 bash $ docker stop some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 13 minutes ago Exited (0) 48 seconds ago some-nginx 続いてはdocker rmコマンドを使って、コンテナを削除します。 bash $ docker rm some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES docker rmコマンドで、コンテナが削除されたことを確認することができました。 (10)イメージを削除する docker rmiコマンドを使って、イメージを削除します。 ※注意:イメージは、参照するコンテナがあると削除できません。コンテナを停止させ、参照するコンテナも削除する必要があります。 $ docker rmi nginx:latest Untagged: nginx:latest Untagged: nginx@sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412 Deleted: sha256:62d49f9bab67f7c70ac3395855bf01389eb3175b374e621f6f191bf31b54cd5b Deleted: sha256:3444fb58dc9e8338f6da71c1040e8ff532f25fab497312f95dcee0f756788a84 Deleted: sha256:f85cfdc7ca97d8856cd4fa916053084e2e31c7e53ed169577cef5cb1b8169ccb Deleted: sha256:704bf100d7f16255a2bc92e925f7007eef0bd3947af4b860a38aaffc3f992eae Deleted: sha256:d5955c2e658d1432abb023d7d6d1128b0aa12481b976de7cbde4c7a31310f29b Deleted: sha256:11126fda59f7f4bf9bf08b9d24c9ea45a1194f3d61ae2a96af744c97eae71cbf Deleted: sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d docker imagesコマンドを使って、イメージの状況を確認します。 bash $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker rmiコマンドで、イメージが削除されたことを確認することができました。 ■6. 参考:docker基本コマンド一覧 コマンドの仕様詳細は「 Docker-docs-ja」を参照しください。 コマンド 説明 仕様詳細 docker pull dockerHubからイメージを取得 https://docs.docker.jp/engine/reference/commandline/pull.html docker images イメージの一覧表示 https://docs.docker.jp/engine/reference/commandline/images.html docker run コンテナ起動 https://docs.docker.jp/engine/reference/run.html docker ps コンテナの一覧表示 https://docs.docker.jp/engine/reference/commandline/ps.html) docker create コンテナ作成 https://docs.docker.jp/engine/reference/commandline/create.html docker stop コンテナ停止 https://docs.docker.jp/engine/reference/commandline/stop.html docker rm コンテナ削除 https://docs.docker.jp/engine/reference/commandline/rm.html docker rmi イメージ削除 https://docs.docker.jp/engine/reference/commandline/rmi.html ■7. 以上 お疲れ様でした! dcokerを利用して、簡単にwebサーバを立ち上げることができました。これら一連の作業を行うことで、dockerの基本的なコマンド、ステータス等を学ぶことができました。次は、コンテナを管理ができるKubernetes(クバネティス)辺りを調べられたらと思っています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【docker】超・初心者と一緒にハンズオンしながらwebサーバを立ち上げよう

■1. はじめに 今現在、docker超・初心者です。 dockerって、なんとなく分かってはいるけど、触ったことないので、モヤモヤ……… とりあえずwebサーバの立ち上げをハンズオンして簡単に理解していきたいと思います。ちなみに、webサーバはnginx(エンジンエックス)を使用したいと思います。 ■2. やること dockerを簡単に理解しつつ、win10に環境を整えていきます。dockerコマンドを実施する際にPowerSellよりもbash等の方が使いやすいので、WSL2(Windows Subsystem for Linux ver.2)、Ubuntuもインストールしていきます。 具体的には以下5つです。 ➊dockerの簡単な理解 ➋docker desktopのインストール ➌WSL2機能をON ➍Ubuntuのインストール ➎webサーバの立ち上げ (dockerコマンドをいじる) ■3. お勉強 おさらいも含めてかる~くお勉強。いきなり詰めすぎてもお腹いっぱいになっちゃうので、とりあえず最小限度のお勉強です。 (1)dcokerとは dcokerは、コンテナというパッケージ化したアプリを使用することで、どこでも誰でも同じ環境が作れたり、ハイパーバイザを使用せずホストマシンのカーネルを利用することで軽量で高速といった特徴があります。 ▶この辺りの情報は、おおよその人が耳にしている情報だと思います。再確認。 (2)dockerの基本コマンドとステータス 大まかな流れをこちらで確認しておきます。 「イメージ」はファイルで、「コンテナ」はプロセスなんだなと簡単に理解をしておきます。 ■4. 準備 docker desktopをインストールします。また、win10の場合、WSL2(Windows Subsystem for Linux ver.2)を有効とし、Ubuntuもインストールしておきます。 (1)docker desktopをインストール 以下から、docker desktopをダウンロードしてください。 【ダウンロード】docker desktop https://www.docker.com/products/docker-desktop インストール時のチェックボックスなどは、デフォルトのままインストールしてしまってOKです。win10の場合は、WSL2もインストールを促されますが、便利なのでそのままインストールしてしまいましょう。 (2)WSL2 Linuxカーネル更新プログラムをインストール ※win10のみ WSL2をインストールした場合は、Linuxカーネルを更新します。以下から、「Linux カーネル更新プログラム」をダウンロードしてください。 【ダウンロード】x64マシン用 WSL2 Linuxカーネル更新プログラム パッケージ https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi カーネル更新プログラムをダウンロード後、実行してください。特に分岐もなく更新が可能です。 (3) Ubuntu ※win10のみ WSL2をインストールした場合は、Linux ディストリビューションとして今回は「Ubuntu」をインストールします。 【Microsoft Store】Ubuntu https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6?activetab=pivot:overviewtab そのままインストールすればなんとかなるレベルですが、詳細は以下をご確認ください。 参考:選択したLinuxディストリビューションをインストールします (4) WSL1 → WSL2 ※win10のみ powershellを使い、以下のコマンドで配布バージョンの確認をしてください。 wsl --list --verbose powershell > wsl --list --verbose NAME STATE VERSION * Ubuntu Running 1 配布バージョンが1の場合は、バージョン2へ変更してください。 wsl --set-version 'distribution Name' 'version Number' powershell > wsl --set-version Ubuntu 2 変換中です。この処理には数分かかることがあります... WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください 変換が完了しました。 > > wsl --list --verbose NAME STATE VERSION * Ubuntu Running 2 参考:配布バージョンをWSL1またはWSL2に設定します 参考:WSL 1 と WSL 2 の比較 ■5. dcokerでwebサーバ構築 ときは満ちました.........あなたにはそのチカラがあります......... Ubuntuを起動して、下記のdcokerコマンドを実行していきます。 (1)nginxイメージのダウンロード docker pullコマンドを使って、dockerHubにあるnginx(webサーバ)の最新版をダウンロードします。 bash $ docker pull nginx:latest latest: Pulling from library/nginx f7ec5a41d630: Pull complete aa1efa14b3bf: Pull complete b78b95af9b17: Pull complete c7d6bca2b8dc: Pull complete cf16cd8e71e0: Pull complete 0241c68333ef: Pull complete Digest: sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest (2)イメージの確認 docker imagesコマンドを使って、イメージの確認をします。 bash $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 62d49f9bab67 2 days ago 133MB (3)htmlの準備 各自好きなhtmlを用意すれば良いのですが、面倒なので以前作成したhtmlを利用します。下記リンクを右クリックし「名前をつけてリンク先を保存」を選択し、「c:¥Users¥username¥html」に「index.html」を保存してください。 ゴクリ・カウンター https://github.com/PoodleMaster/gokuri_counter/blob/main/index.html (4)コンテナの実行 docker runコマンドを使って、コンテナを実行します。 bash $ docker run --name some-nginx -v /mnt/c/Users/username/html:/usr/share/nginx/html:ro -p 8080:80 -d nginx 88279b1d909945ade6874a663cd21a2e8d855b4202920b29943c6290c991c0ed win10の「c:¥Users¥username¥html」は、Ubuntu上では「/mnt/c/Users/username/html」となります。 (5)ブラウザでアクセス chromeなどのブラウザから「 http://localhost:8080 」とURL入力し、サイトへアクセスします。 ゴクリ・カウンターが表示されれば成功です! (6)コンテナの状況を見てみましょう docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 0.0.0.0:8080->80/tcp some-nginx docker runコマンドを使って起動したコンテナが「UP(起動中)」状態となっているのを確認することができました。 (7)コンテナを停止する docker stopコマンドを使って、コンテナを停止させます。 bash $ docker stop some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 13 minutes ago Exited (0) 48 seconds ago some-nginx docker stopコマンドを使ったため、コンテナが「Exit(停止中)」状態となっているのを確認することができました。 試しに「 http://localhost:8080 」へアクセスすると、HPは表示されません。 (8)コンテナを開始する docker startコマンドを使って、コンテナを再開させます。 bash $ docker start some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 18 minutes ago Up 4 seconds 0.0.0.0:8080->80/tcp some-nginx docker startコマンドを使って開始させたコンテナが「UP(起動中)」状態となっているのを確認することができました。 試しに「 http://localhost:8080 」へアクセスすると、HPが再度表示されます。 (9)コンテナを削除する コンテナは停止中でないと削除できません。まずはdocker stopコマンドを使って、コンテナを停止させます。 bash $ docker stop some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88279b1d9099 nginx "/docker-entrypoint.…" 13 minutes ago Exited (0) 48 seconds ago some-nginx 続いてはdocker rmコマンドを使って、コンテナを削除します。 bash $ docker rm some-nginx some-nginx docker ps -aコマンドを使って、コンテナの状況を確認します。 bash $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES docker rmコマンドで、コンテナが削除されたことを確認することができました。 (10)イメージを削除する docker rmiコマンドを使って、イメージを削除します。 ※注意:イメージは、参照するコンテナがあると削除できません。コンテナを停止させ、参照するコンテナも削除する必要があります。 $ docker rmi nginx:latest Untagged: nginx:latest Untagged: nginx@sha256:75a55d33ecc73c2a242450a9f1cc858499d468f077ea942867e662c247b5e412 Deleted: sha256:62d49f9bab67f7c70ac3395855bf01389eb3175b374e621f6f191bf31b54cd5b Deleted: sha256:3444fb58dc9e8338f6da71c1040e8ff532f25fab497312f95dcee0f756788a84 Deleted: sha256:f85cfdc7ca97d8856cd4fa916053084e2e31c7e53ed169577cef5cb1b8169ccb Deleted: sha256:704bf100d7f16255a2bc92e925f7007eef0bd3947af4b860a38aaffc3f992eae Deleted: sha256:d5955c2e658d1432abb023d7d6d1128b0aa12481b976de7cbde4c7a31310f29b Deleted: sha256:11126fda59f7f4bf9bf08b9d24c9ea45a1194f3d61ae2a96af744c97eae71cbf Deleted: sha256:7e718b9c0c8c2e6420fe9c4d1d551088e314fe923dce4b2caf75891d82fb227d docker imagesコマンドを使って、イメージの状況を確認します。 bash $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker rmiコマンドで、イメージが削除されたことを確認することができました。 ■6. 参考:docker基本コマンド一覧 コマンドの仕様詳細は「 Docker-docs-ja」を参照しください。 コマンド 説明 仕様詳細 docker pull dockerHubからイメージを取得 https://docs.docker.jp/engine/reference/commandline/pull.html docker images イメージの一覧表示 https://docs.docker.jp/engine/reference/commandline/images.html docker run コンテナ起動 https://docs.docker.jp/engine/reference/run.html docker ps コンテナの一覧表示 https://docs.docker.jp/engine/reference/commandline/ps.html) docker create コンテナ作成 https://docs.docker.jp/engine/reference/commandline/create.html docker stop コンテナ停止 https://docs.docker.jp/engine/reference/commandline/stop.html docker rm コンテナ削除 https://docs.docker.jp/engine/reference/commandline/rm.html docker rmi イメージ削除 https://docs.docker.jp/engine/reference/commandline/rmi.html ■7. 以上 お疲れ様でした! dcokerを利用して、簡単にwebサーバを立ち上げることができました。これら一連の作業を行うことで、dockerの基本的なコマンド、ステータス等を学ぶことができました。次は、コンテナを管理ができるKubernetes(クバネティス)辺りを調べられたらと思っています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】ECR に Docker の image を push する

はじめに ECR に Docker の image を build して push するまでの手順を記します。 1. image の build docker build -t {ECRのリポジトリ名} . 2. image の push で build した image にタグ付 docker tag {ECRのリポジトリ名}:latest {ECR の URI(xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名)} ECR にログイン aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com ECR に push docker push xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】Docker上のアプリケーションでDevise(認証機能)を使う方法

Docker上のRailsアプリケーションでDevise(認証機能)を使う方法のまとめ。 参考リンク https://github.com/heartcombo/devise https://github.com/heartcombo/devise/wiki/How-Tos https://github.com/heartcombo/devise/wiki/How-To:-Add-:confirmable-to-Users (はじめに)dockerコンテナ内でコマンドを実行する方法 Dockerコンテナの中のアプリケーションでコマンドを実行する場合はまずコンテナに入る。 コンテナの中に入るにはdockerコマンドとdocker-compose使う方法がある。 どちらの場合もコンテナは起動している必要がある。 docker exec -it サービス名 シェル docker-compose exec サービス名 シェル シェルは基本的にbashかsh。アプリケーション毎に異なる。 ▼実例 例えば、alpine(Linuxディストリビューションの一つ)のrubyを使って作成したdocker上のrailsアプリケーションに入る場合は以下となる。 $ docker exec -it サービス名 sh /app # または $ docker-compose exec サービス名 sh /app # /app #が表示されればコンテナ内に入れている。コンテナから出る時はexitを入力しEnter。 ログイン機能の作成方法 ここから本題。railsのdeviseというgemを使ってログイン認証機能を簡単に実装する手順。 1. deviseのインストール Gemfileにdeviseを追記し、bundle installを実行する。 Gemfile gem 'devise' railsはdockerの中で起動しているので、docker内のコンテナに入ってからbundle installを実行する。 $ docker exec -it サービス名 sh /app # bundle install 以下のように表示されればdeviseパッケージのインストールが完了。 2. deviseをアプリケーションに導入する deviseのパッケージインストールが終わったので、次にアプリケーションにdevise機能を実装する。Dockerコンテナに入ったままrails g devise:installを実行。 /app # rails g devise:install Running via Spring preloader in process 534 create config/initializers/devise.rb create config/locales/devise.en.yml =============================================================================== Depending on your application's configuration some manual setup may be required: 1. Ensure you have defined default url options in your environments files. Here is an example of default_url_options appropriate for a development environment in config/environments/development.rb: config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } In production, :host should be set to the actual host of your application. * Required for all applications. * 2. Ensure you have defined root_url to *something* in your config/routes.rb. For example: root to: "home#index" * Not required for API-only Applications * 3. Ensure you have flash messages in app/views/layouts/application.html.erb. For example: <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> * Not required for API-only Applications * 4. You can copy Devise views (for customization) to your app by running: rails g devise:views * Not required * =============================================================================== これでdeviseが使えるようになった。 3. 認証機能が使えるモデルの作成 認証機能が使えるモデルを作成するには、通常のrails g model モデル名ではなくdeviseを使う。 ・rails g devise モデル名 /app # rails g devise user Running via Spring preloader in process 572 invoke active_record create db/migrate/20210414012052_devise_create_users.rb create app/models/user.rb invoke test_unit create test/models/user_test.rb create test/fixtures/users.yml insert app/models/user.rb route devise_for :users 3-1. migrationファイルの中身 db/migrate/20210414012052_devise_create_users.rb devise_create_テーブル名 のクラスが生成され、関数の中には各モジュール毎の設定が記述されている。 # frozen_string_literal: true class DeviseCreateUsers < ActiveRecord::Migration[6.1] def change create_table :users do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: "" ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at ## Rememberable t.datetime :remember_created_at ## Trackable # t.integer :sign_in_count, default: 0, null: false # t.datetime :current_sign_in_at # t.datetime :last_sign_in_at # t.string :current_sign_in_ip # t.string :last_sign_in_ip ## Confirmable # t.string :confirmation_token # t.datetime :confirmed_at # t.datetime :confirmation_sent_at # t.string :unconfirmed_email # Only if using reconfirmable ## Lockable # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts # t.string :unlock_token # Only if unlock strategy is :email or :both # t.datetime :locked_at t.timestamps null: false end add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true # add_index :users, :confirmation_token, unique: true # add_index :users, :unlock_token, unique: true end end カラムの型の記述ルールは以下のようになっている。 t.カラムの型 :カラム名 条件1: 値1, 条件2: 値2,,, 3-1-1. Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: "" emailと暗号化したパスワードのカラムを作成している。 null: false 何かしら値がない場合はエラーとなる。 default: "" 初期値は何も指定されていない。 3-1-2. Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at パスワードリセット用のトークンを保存するカラムと、送信日時を保存するカラム。 3-1-3. Rememberable t.datetime :remember_created_at ログイン状態を維持しておく期間。 3-1-4. Trackable t.integer :sign_in_count, default: 0, null: false t.datetime :current_sign_in_at t.datetime :last_sign_in_at t.string :current_sign_in_ip t.string :last_sign_in_ip ログインした回数、最新のログイン日時、前回のログイン日時、最新のログインIP、最終のログインIPを保存。 デフォルトはコメントアウト。 3-1-5. Confirmable t.string :confirmation_token t.datetime :confirmed_at t.datetime :confirmation_sent_at t.string :unconfirmed_email # Only if using reconfirmable メールに記載されているURLをクリックして登録完了する時に使うカラム。 確認用の番号(トークン)、登録申請された時間、本登録用のメールを送信した時間、e-mailアドレスを保存する。 デフォルトはコメントアウト。 3-1-6. Lockable t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts t.string :unlock_token # Only if unlock strategy is :email or :both t.datetime :locked_at 一定回数ログインに失敗した時にロックアウトする用のカラム。 ログインの入力可能回数、ロックアウトしたトークン、ロックアウトした時間を保存。 デフォルトはコメントアウト。 3-1-7. 重複防止のバリデーション(ユニーク設定) emailやトークンなど重複してはいけないカラムを指定する。 ・add_index :テーブル名, :カラム名, unique: true add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true # add_index :users, :confirmation_token, unique: true # add_index :users, :unlock_token, unique: true (補足)追加モジュール デフォルトでは記述がないが、以下のようなモジュールも用意されている。使う場合は追加でカラムの設定が必要。 ・timeoutable 一定時間活動していないアカウントのセッションを破棄する。デフォルトは30分が設定されている。 変更したい場合はconfig/initializers/devise.rbに追記する。 ・omniauthable SNS認証機能(twitterやfacebookなど)の追加。intridea/omniauthを使えるようにする。 3-2. コントローラの中身 コントローラの中で使いたいモジュールを:モジュール名で指定する。 app/models/user.rb user.rb class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end モジュールは複数指定可能。 3-3. ルーティングの確認 config/routes.rb を確認するとdevise_for: usersが追加されている。 ・devise_for: モデル名 指定したモデル名を使ったルーティングを自動設定してくれる。 /users/sign_inや/users/password/newといったルートが作成されている。 追加されたルーティング一覧 /app # rails routes Prefix Verb URI Pattern Controller#Action new_user_session GET /users/sign_in(.:format) devise/sessions#new user_session POST /users/sign_in(.:format) devise/sessions#create destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy new_user_password GET /users/password/new(.:format) devise/passwords#new edit_user_password GET /users/password/edit(.:format) devise/passwords#edit user_password PATCH /users/password(.:format) devise/passwords#update PUT /users/password(.:format) devise/passwords#update POST /users/password(.:format) devise/passwords#create cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel new_user_registration GET /users/sign_up(.:format) devise/registrations#new edit_user_registration GET /users/edit(.:format) devise/registrations#edit user_registration PATCH /users(.:format) devise/registrations#update PUT /users(.:format) devise/registrations#update DELETE /users(.:format) devise/registrations#destroy POST /users(.:format) devise/registrations#create 4. development.rbの設定 config/environments/development.rb に、デフォルトのURLを設定する。 development.rb #devise setting config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } 5. デフォルトの認証ページ画面を表示する マイグレーションをしてから、認証ページにアクセスする。 Dockerコンテナ内でrails db:migrateを実行。 /app # rails db:migrate == 20210414012052 DeviseCreateUsers: migrating ================================ -- create_table(:users) -> 0.0302s -- add_index(:users, :email, {:unique=>true}) -> 0.0041s -- add_index(:users, :reset_password_token, {:unique=>true}) -> 0.0036s == 20210414012052 DeviseCreateUsers: migrated (0.0382s) ======================= ブラウザで追加されたルートにアクセスする。 http://localhost:3000/users/sign_in http://localhost:3000/users/password/new 6. 日本語に変更(localeの日本語化) デフォルトの言語は英語なので日本語に変更する。(deviseではなくrailsアプリケーションの言語設定を変える) 6-1. configファイルの変更 config/application.rb に以下を追記。 application.rb config.i18n.default_locale = :ja 6-2. localesディレクトリに言語ファイルを追加 config/locales配下に以下2つのファイルを追加する。 ・ja.yml ・devise.ja.yml (参考)i18nとは?使い方まとめ。ビュー(View),コントローラー(Controller), コンソールでの呼び出し方とlocaleの使い方 devise.ja.yml ja: errors: messages: not_found: "は見つかりませんでした" # not_found: "not found" already_confirmed: "は既に登録済みです" # already_confirmed: "was already confirmed" not_locked: "は凍結されていません" # not_locked: "was not locked" devise: failure: unauthenticated: 'ログインしてください。' # unauthenticated: 'You need to sign in or sign up before continuing.' unconfirmed: '本登録を行ってください。' # unconfirmed: 'You have to confirm your account before continuing.' locked: 'あなたのアカウントは凍結されています。' # locked: 'Your account is locked.' invalid: 'メールアドレスかパスワードが違います。' # invalid: 'Invalid email or password.' invalid_token: '認証キーが不正です。' # invalid_token: 'Invalid authentication token.' timeout: 'セッションがタイムアウトしました。もう一度ログインしてください。' # timeout: 'Your session expired, please sign in again to continue.' inactive: 'アカウントがアクティベートされていません。' # inactive: 'Your account was not activated yet.' sessions: signed_in: 'ログインしました。' # signed_in: 'Signed in successfully.' signed_out: 'ログアウトしました。' # signed_out: 'Signed out successfully.' passwords: send_instructions: 'パスワードのリセット方法を数分以内にメールでご連絡します。' # send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.' updated: 'パスワードを変更しました。' # updated: 'Your password was changed successfully. You are now signed in.' confirmations: send_instructions: '登録方法を数分以内にメールでご連絡します。' # send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.' confirmed: 'アカウントを登録しました。' # confirmed: 'Your account was successfully confirmed. You are now signed in.' registrations: signed_up: 'アカウント登録を受け付けました。確認のメールをお送りします。' # signed_up: 'You have signed up successfully. If enabled, a confirmation was sent to your e-mail.' updated: 'アカウントを更新しました。' # updated: 'You updated your account successfully.' destroyed: 'アカウントを削除しました。またのご利用をお待ちしております。' # destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.' unlocks: send_instructions: 'アカウントの凍結解除方法を数分以内にメールでご連絡します。' # send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.' unlocked: 'アカウントを凍結解除しました。' # unlocked: 'Your account was successfully unlocked. You are now signed in.' mailer: confirmation_instructions: subject: 'アカウントの登録方法' # subject: 'Confirmation instructions' reset_password_instructions: subject: 'パスワードの再設定' # subject: 'Reset password instructions' unlock_instructions: subject: 'アカウントの凍結解除' # subject: 'Unlock Instructions' ja.yml ja: activerecord: attributes: user: confirmation_sent_at: パスワード確認送信時刻 confirmation_token: パスワード確認用トークン confirmed_at: パスワード確認時刻 created_at: 作成日 current_password: 現在のパスワード current_sign_in_at: 現在のログイン時刻 current_sign_in_ip: 現在のログインIPアドレス email: Eメール encrypted_password: 暗号化パスワード failed_attempts: 失敗したログイン試行回数 last_sign_in_at: 最終ログイン時刻 last_sign_in_ip: 最終ログインIPアドレス locked_at: ロック時刻 password: パスワード password_confirmation: パスワード(確認用) remember_created_at: ログイン記憶時刻 remember_me: ログインを記憶する reset_password_sent_at: パスワードリセット送信時刻 reset_password_token: パスワードリセット用トークン sign_in_count: ログイン回数 unconfirmed_email: 未確認Eメール unlock_token: ロック解除用トークン updated_at: 更新日 models: user: ユーザー devise: confirmations: confirmed: メールアドレスが確認できました。 new: resend_confirmation_instructions: アカウント確認メール再送 send_instructions: アカウントの有効化について数分以内にメールでご連絡します。 send_paranoid_instructions: メールアドレスが登録済みの場合、本人確認用のメールが数分以内に送信されます。 failure: already_authenticated: すでにログインしています。 inactive: アカウントが有効化されていません。メールに記載された手順にしたがって、アカウントを有効化してください。 invalid: "%{authentication_keys}またはパスワードが違います。" last_attempt: もう一回誤るとアカウントがロックされます。 locked: アカウントはロックされています。 not_found_in_database: "%{authentication_keys}またはパスワードが違います。" timeout: セッションがタイムアウトしました。もう一度ログインしてください。 unauthenticated: ログインもしくはアカウント登録してください。 unconfirmed: メールアドレスの本人確認が必要です。 mailer: confirmation_instructions: action: メールアドレスの確認 greeting: "%{recipient}様" instruction: 以下のリンクをクリックし、メールアドレスの確認手続を完了させてください。 subject: メールアドレス確認メール email_changed: greeting: こんにちは、%{recipient}様。 message: メールアドレスの(%{email})変更が完了したため、メールを送信しています。 message_unconfirmed: メールアドレスが(%{email})変更されたため、メールを送信しています。 subject: メール変更完了 password_change: greeting: "%{recipient}様" message: パスワードが再設定されました。 subject: パスワードの変更について reset_password_instructions: action: パスワード変更 greeting: "%{recipient}様" instruction: パスワード再設定の依頼を受けたため、メールを送信しています。下のリンクからパスワードの再設定ができます。 instruction_2: パスワード再設定の依頼をしていない場合、このメールを無視してください。 instruction_3: パスワードの再設定は、上のリンクから新しいパスワードを登録するまで完了しません。 subject: パスワードの再設定について unlock_instructions: action: アカウントのロック解除 greeting: "%{recipient}様" instruction: アカウントのロックを解除するには下のリンクをクリックしてください。 message: ログイン失敗が繰り返されたため、アカウントはロックされています。 subject: アカウントのロック解除について omniauth_callbacks: failure: "%{kind} アカウントによる認証に失敗しました。理由:(%{reason})" success: "%{kind} アカウントによる認証に成功しました。" passwords: edit: change_my_password: パスワードを変更する change_your_password: パスワードを変更 confirm_new_password: 確認用新しいパスワード new_password: 新しいパスワード new: forgot_your_password: パスワードを忘れましたか? send_me_reset_password_instructions: パスワードの再設定方法を送信する no_token: このページにはアクセスできません。パスワード再設定メールのリンクからアクセスされた場合には、URL をご確認ください。 send_instructions: パスワードの再設定について数分以内にメールでご連絡いたします。 send_paranoid_instructions: メールアドレスが登録済みの場合、パスワード再設定用のメールが数分以内に送信されます。 updated: パスワードが正しく変更されました。 updated_not_active: パスワードが正しく変更されました。 registrations: destroyed: アカウントを削除しました。またのご利用をお待ちしております。 edit: are_you_sure: 本当によろしいですか? cancel_my_account: アカウント削除 currently_waiting_confirmation_for_email: "%{email} の確認待ち" leave_blank_if_you_don_t_want_to_change_it: 空欄のままなら変更しません title: "%{resource}編集" unhappy: 気に入りません update: 更新 we_need_your_current_password_to_confirm_your_changes: 変更を反映するには現在のパスワードを入力してください new: sign_up: アカウント登録 signed_up: アカウント登録が完了しました。 signed_up_but_inactive: ログインするためには、アカウントを有効化してください。 signed_up_but_locked: アカウントがロックされているためログインできません。 signed_up_but_unconfirmed: 本人確認用のメールを送信しました。メール内のリンクからアカウントを有効化させてください。 update_needs_confirmation: アカウント情報を変更しました。変更されたメールアドレスの本人確認のため、本人確認用メールより確認処理をおこなってください。 updated: アカウント情報を変更しました。 updated_but_not_signed_in: あなたのアカウントは正常に更新されましたが、パスワードが変更されたため、再度ログインしてください。 sessions: already_signed_out: 既にログアウト済みです。 new: sign_in: ログイン signed_in: ログインしました。 signed_out: ログアウトしました。 shared: links: back: 戻る didn_t_receive_confirmation_instructions: アカウント確認のメールを受け取っていませんか? didn_t_receive_unlock_instructions: アカウントのロック解除方法のメールを受け取っていませんか? forgot_your_password: パスワードを忘れましたか? sign_in: ログイン sign_in_with_provider: "%{provider}でログイン" sign_up: アカウント登録 minimum_password_length: "(%{count}字以上)" unlocks: new: resend_unlock_instructions: アカウントのロック解除方法を再送する send_instructions: アカウントのロック解除方法を数分以内にメールでご連絡します。 send_paranoid_instructions: アカウントが見つかった場合、アカウントのロック解除方法を数分以内にメールでご連絡します。 unlocked: アカウントをロック解除しました。 errors: messages: already_confirmed: は既に登録済みです。ログインしてください。 confirmation_period_expired: の期限が切れました。%{period} までに確認する必要があります。 新しくリクエストしてください。 expired: の有効期限が切れました。新しくリクエストしてください。 not_found: は見つかりませんでした。 not_locked: はロックされていません。 not_saved: one: エラーが発生したため %{resource} は保存されませんでした。 other: "%{count} 件のエラーが発生したため %{resource} は保存されませんでした。" https://gist.github.com/yhara/606476 https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml ページをリロード 一部の英語が日本語に変換された。残りはビューを変更する必要がある。 7. ビューの日本語化 dockerコンテナ内でrails g devise:viewsを実行する。 /app # rails g devise:views Running via Spring preloader in process 564 invoke Devise::Generators::SharedViewsGenerator create app/views/devise/shared create app/views/devise/shared/_error_messages.html.erb create app/views/devise/shared/_links.html.erb invoke form_for create app/views/devise/confirmations create app/views/devise/confirmations/new.html.erb create app/views/devise/passwords create app/views/devise/passwords/edit.html.erb create app/views/devise/passwords/new.html.erb create app/views/devise/registrations create app/views/devise/registrations/edit.html.erb create app/views/devise/registrations/new.html.erb create app/views/devise/sessions create app/views/devise/sessions/new.html.erb create app/views/devise/unlocks create app/views/devise/unlocks/new.html.erb invoke erb create app/views/devise/mailer create app/views/devise/mailer/confirmation_instructions.html.erb create app/views/devise/mailer/email_changed.html.erb create app/views/devise/mailer/password_change.html.erb create app/views/devise/mailer/reset_password_instructions.html.erb create app/views/devise/mailer/unlock_instructions.html.erb viewsディレクトリ配下にdeviseのディレクトリが追加された。 ディレクトリ 内容 ファイル confirmation パスワード再発行用のフォーム new.html.erb mailer 送信するメールの内容 (1)confirmation_instructions.html.erb, (2)email_changed.html.erb, (3)password_change.html.erb, (4)reset_password_instructions.html.erb, (5)unlock_instructions.html.erb passwords パスワードを忘れた時のフォーム (1)edit.html.erb, (2)new.html.erb registrations ユーザー情報の新規登録と編集フォーム sessions ログインフォーム new.html.erb shared 共通のエラーメッセージとリンク部分のテンプレート unlocks アカウントロック通知メールのフォーム new.html.erb http://localhost:3000/users/sign_in で表示されるビューを編集する。 app/views/devise/sessions/new.html.erb new.html.erb <h2>ログイン</h2> <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %> <div class="field"> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div class="field"> <%= f.label :password %><br /> <%= f.password_field :password, autocomplete: "current-password" %> </div> <% if devise_mapping.rememberable? %> <div class="field"> <%= f.check_box :remember_me %> <%= f.label :remember_me %> </div> <% end %> <div class="actions"> <%= f.submit "送信" %> </div> <% end %> <%= render "devise/shared/links" %> 下部の<%= render "devise/shared/links" %>は以下のファイルを呼び出しているため、該当部分を変更する。 app/views/devise/shared/_links.html.erb _links.html.erb <%- if devise_mapping.registerable? && controller_name != 'registrations' %> <%= link_to "新規登録", new_registration_path(resource_name) %><br /> <% end %> <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %> <%= link_to "パスワードを忘れましたか?", new_password_path(resource_name) %><br /> <% end %> ▼ページをリロード これで日本語化が完了。 8. フラッシュメッセージの作成 deviseをインストールしたときの指示にしたがってapplication.html.erbにフラッシュメッセージを表示するタグを追加する。 deviseの説明 3. Ensure you have flash messages in app/views/layouts/application.html.erb. For example: <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> noticeはログインや投稿に成功した時に表示されるメッセージ。 alertはEメールやPWが正しくない場合に表示されるメッセージ。 app/views/layouts/application.html.erb のbodyタグにフラッシュメッセージを表示するタグを追加。 application.html.erb <body> <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> <%= yield %> </body> 画面上部にフラッシュメッセージが表示されるようになった。 ただし、この状態ではデフォルト状態で隙間が開いてしまうためフラッシュメッセージが存在する時のみタグを表示するように変更する。 application.html.erb <body> <% if notice %>    <p><%= notice %></p> <% end %> <% if alert %> <p><%= alert %></p> <% end %> <%= yield %> </body> 9. ログイン後に表示されるページを変更する ログインに成功するとデフォルトでroot_urlにリダイレクトされる。これを任意のページに変更する。 9-1. rails g controller コントローラ名 例として、pages > show.html.erbを表示する設定にする。 Dockerコンテナの中に入りコントローラーを作成する。 $ docker-compose exec サービス名 sh /app # rails g controller pages 9-2. ビューの作成 生成されたapp/views/pages配下に show.html.erb を作成する。 app/views/pages/show.html.erb <div>ログイン成功後に表示されるページ</div> <%= link_to 'ログアウト', destroy_user_session_path, method: :delete %> 9-3. ルーティングの設定 ルート名をpages_showとする。 routes.rb Rails.application.routes.draw do devise_for :users root to: 'top#index' #追記 get '/pages/show', to: 'pages#show', as: :pages_show end ・get 'URI', to: 'コントローラ名#アクション名, as: :ルート名' 9-4. コントローラの設定(application_controller.rb) ログインに成功した場合と失敗した場合に表示するビューへのリダイレクトを設定する。 使うルート名はpages_showとnew_user_session。詳細はrails routesで確認できる。 /app # rails routes Prefix Verb URI Pattern Controller#Action new_user_session GET /users/sign_in(.:format) devise/sessions#new pages_show GET /pages/show(.:format) pages#show new_user_sessionはログインページ。 app/controllers/application_controller.rbに以下のようにメソッドを記述する。 applcation_controller.rbのメソッドは他のコントローラにも読み込まれる(<で拡張しているため)。 application_controller.rb class ApplicationController < ActionController::Base def after_sign_in_path_for(resource) pages_show_path end private def sign_in_required redirect_to new_user_session_url unless user_signed_in? end end Deviseのログイン後にリンクするページ after_sign_in_path_forヘルパをで指定する。 ルートへのパス def after_sign_in_path_for(resource) パス end ルート名_pathは指定したルートのパス('/配下')を表示するヘルパ。 pages_showを指定した場合、対応するpagesコントローラのshowメソッドが実行される(pages#show) ログインに失敗した場合の処理 ログインに失敗した場合はnew_user_session private def sign_in_required redirect_to new_user_session_url unless user_signed_in? end このメソッド名はなんでもいい。pagesコントローラで使う時に合わせる。 privateを記述すると、同じクラス(拡張したクラスも含む)の中からしか読み込めないようにできる。 ・unless修飾子を使った条件分岐 trueで実行する処理 unless 条件 user_signed_inが存在すればnew_user_sessionのルートにリダイレクトする。 ・redirect_to URL 指定したURLにリダイレクトする ・ルート名_url 指定したルート名のurlを呼び出す。 ・unless 条件 ifの逆。条件がfalseだった時に指定した処理を実行する。if !条件と同じ。 ・user_signed_in? Deviseのヘルパ。ログインしている場合はtureになる。(便利!) 9-5. コントローラの設定(pages_controller.rb) ログインに成功した時に表示するapp/controllers/pages_controller.rbの設定をする。 before_actionを使って先ほど定義したis_signed_inメソッドを呼び出してから、showアクションを実行する。 pages_controller.rb class PagesController < ApplicationController before_action :is_signed_in, only: [:show] def show end end ・before_action :メソッド名 アクションを指定しない場合は、すべてのアクションの前に指定したメソッドが実行される。 ・before_action :メソッド名, only: [:アクション名, アクション名,,,] only: を使うと指定したアクションを実行する場合のみメソッドを実行する。 ・before_action :メソッド名, except: [:アクション名, アクション名,,,] exceptを使うと指定したアクション以外でメソッドを実行する。 onlyもexceptもアクションが一つの場合は[ ]がなくてもいい。 補足:別の記述方法 deviseのヘルパでauthenticate_user!を使うとより簡単に記述できる。これは、ログインしてない場合はログインページにリダイレクトするヘルパ。 class PagesController < ApplicationController before_action :authenticate_user!, only: [:show] def show end end ↓↑ 同じ class PagesController < ApplicationController before_action :is_signed_in, only: [:show] def show end end private def is_signed_in redirect_to new_user_session_url unless user_signed_in? end 9-6. ブラウザの表示 ログイン画面/users/sign_inから正しくログインできると指定したページに飛ぶことができる。 10. Deviseのヘルパ モデル名をuserとして生成した場合(rails g devise user)の例。 別のモデル名を使った場合は、userの部分を指定したモデル名に変更する。 10-1. before_action :authenticate_user! ログインしてない場合はログインページにリダイレクトするヘルパ。コントローラの上部で使う。 class PagesController < ApplicationController before_action :authenticate_user!, only: [:show] def show end end 10-2. user_signed_in? ユーザーがログインしている場合はtrueを返す。 デバッグ例 def show pp "user_signed_in?:#{user_signed_in?}" end 10-3. current_user 現在のセッションのユーザー情報を取得できる。保存してある情報は、4つ。(1)id, (2)email, (3)created_at, (4)updated_at。 irb(main):009:0> User.find[1] User Load (0.8ms) SELECT "users".* FROM "users" => #<User id: 2, email: "111@222", created_at: "2021-04-15 05:08:07.005182000 +0000", updated_at: "2021-04-15 05:08:07.005182000 +0000"> ユーザーのidを呼び出したい場合は、current_user.idとする。 デバッグ例 def show pp "current_user:#{current_user}" pp "current_user.id:#{current_user.id}" end 10-4. user_session ユーザーのセッション情報を格納しておく変数。デフォルトは空。 デバッグ例 def show pp "user_session:#{user_session}" user_session["point"] = 5432 user_session["os"] = ["apple", "windows"] pp "user_session:#{user_session}" end 一度ログアウトしてから、再度ログインすると空になる。 11. 新規登録時のメール承認機能の実装 confirmableモジュールを使うとユーザーの新規登録時にメール承認機能をつけることができる。 11-1. モデルにconfirmableを追加 app/models/user.rb user.rb class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :confirmable end 11-2. メール送信用サーバーの設定 config/environments/development.rb に以下を追記。 development.rb Rails.application.configure do (省略) # mailer setting config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :address => 'smtp.gmail.com', :port => 587, :user_name => 'gmailのアドレス', :password => 'gmailのアプリパスワード', :authentication => :plain, :enable_starttls_auto => true } (省略) end 11-3. Deviseのメーラー設定 次に、Deviseのconfigファイルでメーラーを指定する。 config/initializers/devise.rb devise.rb config.mailer_sender = 'gmailのアドレス' 11-4. reconfirmableをfalseにする メールアドレス更新時にメール確認を必須にするreconfirmableをfalseにする。(デフォルトはtrue) config/initializers/devise.rb devise.rb # If true, requires any email changes to be confirmed (exactly the same way as # initial account confirmation) to be applied. Requires additional unconfirmed_email # db field (see migrations). Until confirmed, new email is stored in # unconfirmed_email column, and copied to email column on successful confirmation. config.reconfirmable = false 11-5. アプリパスワードの発行 gmailで自動のアプリケーションを使ってメール送信する場合、PWにはアプリパスワードを指定する必要がある。 ログインしてセキュリティを開く。 ↓ ↓ 「その他」を選択し、名前を適当に入力。 表示されたパスワードをコピーして、:password => 'gmailのアプリパスワード',にペーストする。 これで、現在のrailsアプリケーションで指定したメールサーバーが使えるようになった。 11-6. マイグレーションファイルのconfirmableに必要なカラムを有効化する db/migrate/yyyymmdd_devise_create_users.rb confirmableのコメントアウトを外す。 yyyymmdd_devise_create_users.rb ## Confirmable t.string :confirmation_token t.datetime :confirmed_at t.datetime :confirmation_sent_at t.string :unconfirmed_email # Only if using reconfirmable アプリケーションをctrl + cで終了してから再起動し、rails db:migrateを実行する。 #アプリケーションの起動(プロジェクトのルートディレクトリで) $ docker-compsoe up #コンテナ内に入る $ docker exec -it コンテナ名 sh #マイグレーション $ rails db:migrate 11-7. ブラウザで検証 新規登録時のメール確認なので、/users/sign_upにアクセスする。 「Sign up」をクリックするとTOPページにリダイレクトし、上部に「 本人確認用のメールを送信しました。メール内のリンクからアカウントを有効化させてください。」が表示される。 メール本文 Welcome example@com! You can confirm your account email through the link below: Confirm my account ログイン画面に飛び、「リンクをクリックするとメールアドレスが確認できました」が表示される。 登録したEメールとパスワードを入力すればログインが完了する。 localhostのポート番号が異なる場合はconfig/environments/development.rbで設定。 link_toで生成されるリンク <%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %> confirmation_urlヘルパに@resourceと@tokenの2つの変数を渡している。 11-8. confirmableの送信メールの内容を変更する 初回登録時に送信されるメール内容は以下ファイルに記述されている。 app/views/devise/mailer/confirmation_instructions.html.erb confirmation_instructions.html.erb <p>Welcome <%= @email %>!</p> <p>You can confirm your account email through the link below:</p> <p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p> ↓ confirmation_instructions.html.erb <p>ご登録ありがとうございます。</p> <p>登録されたメールアドレスは<%= @email %>です。</p> <p>下記リンクをクリックして最終承認を完了させてください。</p> <p><%= link_to '「ご登録の承認」', confirmation_url(@resource, confirmation_token: @token) %></p>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

エラーに遭遇(warning: parser/current is loading parser/ruby27, which recognizes warning: 2.7.3-compliant syntax, but you are running 2.7.2. warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.)

Rails+Docker+VSCodeという環境でVSCodeから表示された警告がみたことがなかったのでメモ。 TL;DR Rubyのバージョンアップは大事(特にパッチレベル) Rubyのバージョンのパッチバージョンが上がったらバージョンアップするべし Dockerの場合は端末側のRubyのバージョン指定も変更するべし 動作環境 21/04時点での動作環境です。 MacOS Catalina(10.15.7) VSCode 1.55.0 Ruby 2.7.3 Rails 6.0.3.6 内容 VSCodeに突然下記のような警告が表示されるようになりました。 warning: parser/current is loading parser/ruby27, which recognizes warning: 2.7.3-compliant syntax, but you are running 2.7.2. warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri. cannot load such file -- rubocop-rspec 特にRailsやDockerの設定を変えた覚えはなかったのでとても焦りました。 原因 parserというgemが原因でした。 上記のコメントの中にgithubへのリンクがあったのでその内容をgoogle先生で直訳すると パーサーはセマンティックバージョニングを使用しません。パーサーのバージョンは次のように構成されますx.y.z.t。ここで、x.y.zはサポートされている最新のRubyリリースを示し(時系列的に早いすべてのRubyリリースのサポートを意味します)、t単調に増加する数です。 という内容が書かれていました。 「じゃあいいじゃん、問題ないじゃん」 という話になるのですが、その下に Unfortunately, Ruby MRI often changes syntax in patchlevel versions. This has happened, at least, for every release since 1. と書かれています。 直訳すると、 残念ながら、RubyMRIはパッチレベルバージョンで構文を変更することがよくあります。これは、少なくとも1.9以降のすべてのリリースで発生しています。 どうやらRubyMRIでパッチレベルバージョンでの構文の変更が今回の警告に影響したようです。 Backwards compatibility whitequark/parser: A Ruby parser. 解決法 Rubyのバージョンを上げて、それに伴う変更を行いましょう。 それで解決する(はず)です。 今回の内容はDocker環境・非Docker環境でも流れは一緒(のはず)です。 例えば今回の内容であれば(2.7.2から2.7.3へバージョンアップ)、 使用しているプロジェクトのルートディレクトリで.ruby-versionの数値を変更する(2.7.2->2.7.3) ローカルでrbenvを使用しているなら ruby-buildのアップグレード(brewのアップデートも必要) rbenvで新しいバージョンのrubyをインストール 使用しているプロジェクトに新しいバージョンを適用する といった感じです。 これを手順化すると下記になります(rubyのバージョンはご自身の状況に合わせてください)。 手順1と手順4はそれなりに時間がかかります。 1.terminalで下記を実行してruby-buildのアップグレード、Rubyをインストール terminal brew update && brew upgrade ruby-build && rbenv install 2.7.3 && rbenv local 2.7.3 && rbenv rehash 2..ruby-versionの数値を変更 .ruby-version + 2.7.3 - 2.7.2 3.Gemfileにrubyのバージョンを明記していれば数値を変更 Gemfile + ruby '2.7.3' - ruby '2.7.2' 4.Dockerfileを修正後docker-compose build --no-cacheでコンテナを再構築(Docker環境のみ対象) Dockerfile + FROM ruby:2.7.3 - FROM ruby:2.7.2 上記を実行して特にエラーが発生していなければVSCodeで適当なrubyファイルを開いて保存してみてください。 上記の警告は表示されなくなっていると思います。 以上です。 ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker・PostgreSQL】Dockerで起動したPostgresqlの中身を見る方法

Dockerで起動したPostgresqlの中身を見ようとしたがpsqlコマンドで対話モードに入れず止まってしまった、、 結論、psqlを使うためにpostgresqlのルートユーザーに変更する必要があった。 なお、デフォルトのルートユーザーはpostgres。 Docker内のPostgreSQLにアクセスする手順 ルートユーザーを指定してから対話モードに入る方法は以下2通りがある。 ルートユーザーを指定してpsqlを実行する。 現在のルートユーザーを変更してからpsqlを実行する。 1. ルートユーザーを指定してpsqlを実行する #1. Docker上のPostgreSQLコンテナに入る $ docker-compose exec サービス名 bash #2. ユーザー名postgresとしてpostgreSQLの対話モードに入る bash-4.4# psql -U postgres psql (11.1) Type "help" for help. postgres=# ・dockerの中に入るのは$ docker exec -it コンテナ名 bashでも可能。 ・psql PostgreSQLの対話モードに入るためのコマンド。 -Uはユーザー名を指定するオプション。 ・psotgresやdockerコンテナから抜ける exitを入力しEnter または以下でもpsqlが実行できる。 2. Docker上のPostgreSQLコンテナに入る #1. Docker上のPostgreSQLコンテナに入る $ docker-compose exec <サービス名> bash #2. ルートユーザーをpostgresに変更 bash-4.4# su - postgres #3. postgresの対話モードに入る d9287101e757:~$ psql psql (11.1) Type "help" for help. postgres=# ・su - ユーザー名 ルートユーザーを切り替えるコマンド。 substitute userの略。 -はログインシェルを使用するオプション。-lと同じ。 これを使わない場合、環境変数はユーザー切り替え前と同じ物を使う。-オプションを使うと、環境変数は切り替えたユーザーのものになる(引き継がない)。 ・psotgresやdockerコンテナから抜ける exitを入力しEnter ・プロンプトの切り替わり bash-4.4#はdockerのpostgresqlコンテナのbashn。 d9287101e757:~$はルートユーザーpostgresのbash。 postgres=#はpostgresqlの対話モード。 (補足) suとsudoの違い ユーザー権限関連のよく使うコマンドにsudoがある。これは、スーパーユーザーとして続く処理を実行するというコマンド。 sudo コマンド ↓↑ 同じ suでスーパーユーザーに切り替える -> コマンド ※今回はスーパーユーザーではなくpostgresというユーザーに切り替えているので、sudo postgresは機能しない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker・PostgreSQL】Dockerで起動したPostgresqlの中身を見る手順とコマンド詳細。

Dockerで起動したPostgresqlの中身を見ようとしたがpsqlコマンドで対話モードに入れず止まってしまった場合の対処法。 結論、psqlを使うためにはpostgresqlのルートユーザーに変更する必要がある(なお、デフォルトのルートユーザーはpostgres)。 目次 Docker内のPostgreSQLにアクセスする手順 ルートユーザーを指定してpsqlを実行 現在のルートユーザーを変更してからpsqlを実行 DBの中身を見る DB一覧と移動&テーブル一覧表示(バックスラッシュコマンド) テーブルの中身操作(SQLコマンド) DBのデータを見る方法(対話モードに入らない方法) (補足) suとsudoの違い 1. Docker内のPostgreSQLにアクセスする手順 前提として、postgresSQLのコンテナが起動していること。docker psで確認できる。 ルートユーザーを指定してから対話モードに入る方法は以下2通りがある。 1. ルートユーザーを指定してpsqlを実行 2. 現在のルートユーザーを変更してからpsqlを実行 1-1. ルートユーザーを指定してpsqlを実行 #1. Docker上のPostgreSQLコンテナに入る $ docker-compose exec サービス名 bash #2. ユーザー名postgresとしてpostgreSQLの対話モードに入る bash-4.4# psql -U postgres psql (11.1) Type "help" for help. postgres=# ・dockerの中に入るのは$ docker exec -it コンテナ名 bashでも可能。 ・psql PostgreSQLの対話モードに入るためのコマンド。 -Uはユーザー名を指定するオプション。 ・dockerコンテナから抜ける exitを入力しEnter ・psqlから抜ける \pを入力しEnter または以下でもpsqlが実行できる。 1-2. 現在のルートユーザーを変更してからpsqlを実行 #1. Docker上のPostgreSQLコンテナに入る $ docker-compose exec <サービス名> bash #2. ルートユーザーをpostgresに変更 bash-4.4# su - postgres #3. postgresの対話モードに入る d9287101e757:~$ psql psql (11.1) Type "help" for help. postgres=# ・suで指定したユーザーやdockerコンテナから抜ける exitを入力しEnter ・psqlから抜ける \pを入力しEnter ・su - ユーザー名 ルートユーザーを切り替えるコマンド。 substitute userの略。 -はログインシェルを使用するオプション。-lと同じ。 これを使わない場合、環境変数はユーザー切り替え前と同じ物を使う。-オプションを使うと、環境変数は切り替えたユーザーのものになる(引き継がない)。 ・プロンプトの切り替わり - bash-4.4#はdockerのpostgresqlコンテナのbashn。 - d9287101e757:~$はルートユーザーpostgresのbash。 - postgres=#はpostgresqlの対話モード。 2. DBの中身を見る 対話モード(psql)の中でよく使うコマンド一覧。コマンドは冒頭に\をつける(¥マークを一回クリック) 2-1. DB一覧と移動&テーブル一覧表示(バックスラッシュコマンド) 困ったら\?でコマンド一覧が表示される。dはdispaly(あるいはdetail)の略。 コマンド 内容 補足 \? ヘルプ。\コマンド一覧 \hとは異なる \du ユーザー毎のロール一覧 display users \l DB一覧 list \c DB名 DBに接続 change。プロンプトがDB名になる \dt テーブル一覧(タイプ、オーナー) display table \z テーブル一覧(アクセス権一覧) \dpと同じ(display privilage) \conninfo 接続中のDB情報(DB名、ユーザー名、ソケット、ポート番号) connecting infomation \h ヘルプ。SQLコマンド一覧 SQLは大文字・小文字で区別なし \s \コマンド実行結果の履歴 sequence \q 対話モードの終了 quit (補足は私感。覚えやすいように。) 2-2. テーブルの中身操作(SQLコマンド) SQLのコマンド一覧を表示したい場合は\h。 SQLコマンドの実行は\不要で末尾に;をつける。 実行したコマンドから抜ける時はqをクリック。 情報の抽出(select) コマンド 内容 select * from テーブル名 テーブル内のすべてのデータを表示 select * from テーブル名 order by カラム名; 指定したカラムの昇順で表示 select * from テーブル名 order by カラム名 desc; 指定したカラムの降順で表示 select * from テーブル名 where 条件 指定した条件にマッチするデータのみ抜き出す select * from テーブル名 limit 数値; 指定した数だけ表示 select * from テーブル名 offset 数値; 指定した行から表示 select distinct カラム名 from テーブル名; 指定したカラムだけ表示 select sum(カラム名) from テーブル名; 指定したカラムの合計値を返す。数値以外が含まれる場合はエラー select max(カラム名) from テーブル名; 指定したカラムの最大値を返す select min(カラム名) from テーブル名; 指定したカラムの最少値を返す select avg(カラム名) from テーブル名; 指定したカラムの平均値を返す 複数の組み合わせも可能。 例:複数条件の指定 table_name=# select * from users where id<=100 order by id desc limit 3 offset 3; id | email | encrypted_password | reset_password_token | reset_password_sent_at | remember_created_at | created_at | updated_at | confirmation_token | confirmed_at | confirmation_sent_at ----+---------+--------------------------------------------------------------+----------------------+------------------------+---------------------+----------------------------+------- ---------------------+--------------------+----------------------------+---------------------- 11 | 111@666 | $2a$12$HWVMKItT06zqXdZOJmcL7ellVA2wmzTqRYmqfTJrZuyl/4l2I.NwS | | | | 2021-04-15 12:16:22.196066 | 2021-0 4-15 12:16:22.196066 | | 2021-04-15 12:23:57.727656 | 10 | 111@333 | $2a$12$J6aIpKcN.SQa1ZfAFhMPLuaPHShL6MXyZhJwZB8SPCkaGbc9XR7EW | | | | 2021-04-15 12:13:21.482411 | 2021-0 4-15 12:13:21.482411 | | 2021-04-15 12:23:57.727656 | 9 | 111@111 | $2a$12$mU8jVlbfvrrmmfAqBgaEYOboYllYOS7AAtHGTTfVhLWqU0TRAGmEG | | | | 2021-04-15 11:52:24.830282 | 2021-0 4-15 11:52:24.830282 | | 2021-04-15 12:23:57.727656 | (3 rows) データ操作(update, delete, alter) 文字列は'で囲む。"はエラーになる。 コマンド 内容 create database DB名 DB作成 update テーブル名 set カラム名=値 where 条件; データ変更 delete from テーブル名 where 条件 行の削除 alter table テーブル名 owner to オーナー名 オーナーの変更 alter table テーブル名 add カラム名 データ型 カラムの追加 alter table テーブル名 drop カラム名 カラムの削除 alter table テーブル名 alter カラム名 type データ型 カラムの追加 ・カラムの方にstringやstrは存在しない。characterかvarcherになる。 ・値に文字列を指定する場合はシングルクオテーションで囲む。ダブルクオテーションだとエラーになる。 update ##(エラー1)囲まない場合 =# update users set email = 999@888 where id = 9; ERROR: operator does not exist: integer @ integer LINE 1: update users set email = 999@888 where id = 9; ##(エラー2)ダブルクオテーションで囲んだ場合 =# update users set email="222@333" where id=9; ERROR: column "222@333" does not exist LINE 1: update users set email="222@333" where id=9; ##(成功)シングルクオテーションで囲んだ場合 =# update users set email='222@333' where id=9; UPDATE 1 delete =# delete from users where email="222@333"; ERROR: column "222@333" does not exist LINE 1: delete from users where email="222@333"; ^ =# delete from users where email='222@333'; DELETE 1 2-3. DBのデータを見る方法(対話モードに入らない方法) 一部のコマンドはpsqlで対話モードに入らずとも、psql オプション 処理で対話モードと同等の操作をすることができる。 困ったらpsql -?。(※-hは--hostのショートオプション) コマンド 内容 $ psql -? ヘルプ表示。--helpと同じ $ psql -l データベース一覧 $ psql -V PostgreSqlバージョン表示 $ psql -d DB名 DBに接続 #dockerコンテナ内に入る $ docker-compose exec <サービス名> bash #対話モードにならずにコマンドを実行 bash-4.4# psql -U postgres -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ----------------------------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | または #dockerコンテナ内に入る $ docker-compose exec <サービス名> bash #ルートユーザーをpostgresに変更 bash-4.4# su - postgres #対話モードにならずにコマンドを実行 d9287101e757:~$ psql -l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges ----------------------------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | (補足) suとsudoの違い ユーザー権限関連のよく使うコマンドにsudoがある。これは、スーパーユーザーとして続く処理を実行するというコマンド。 sudo コマンド ↓↑ 同じ #suでスーパーユーザーに切り替えてからコマンドを実行 su コマンド ※今回はスーパーユーザーではなくpostgresというユーザーに切り替えているので、sudo postgresは機能しない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker-compose buildで503が返ってきてハマった時のメモ

久しぶりにDockerで開発しようとしたらdocker-compose build時にエラーが出てハマったのでメモ 環境 OS:Windows10(WSL2:Ubuntu20.04LTS) Docker Desktop:20.10.5 症状 Dockerfileとdocker-compose.ymlを書いて、いざdocker-compose buildと思った矢先 failed to solve with frontend dockerfile.v0: failed to create LLB definition: unexpected status code [manifests 〇〇]: 503 Service Unavailable とのエラー 試したこと 解決策だけ見たい人は読み飛ばしてください 1. Docker DesktopのDocker Engineの設定変更  Docker DesktopのDocker Engineの設定から buildkit: false に変更するも効果なし 2. Docker Desktopのアップデート これも変わらず 結論 rm ~/.docker/config.jsonからのdocker login dockerHubのパスワードを変えたとかで~/.docker/config.jsonの内容が間違っててdockerイメージを持ってくるのに失敗してた様子 なので、一回設定ファイルを消して再ログインすることで正しい認証情報を再設定→めでたくdocker-compose build成功 buildのエラーというよりはdocker.ioとの通信に失敗してたという方が正しいのかも
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む