- 投稿日:2021-02-20T23:36:21+09:00
Dockerのイメージとコンテナ削除
内容
AWS EC2でdockerを動かしていると、不要なイメージとコンテナが溜まってサーバー容量が圧迫されるので、削除する際のメモ。
参考:
https://docs.docker.com/config/pruning/イメージを削除
コンテナから参照されていない 且つ タグがついていない イメージを一括削除
$ docker image pruneオプション
オプション 説明 --all, -a 未使用のイメージをすべて削除 --filter 条件指定。例: "until=24h" --force, -f 確認無しで即時削除 コンテナ削除
停止状態のコンテナを一括削除
(image削除と一緒)$ docker container prune
- 投稿日:2021-02-20T22:02:42+09:00
低コストでSQLを勉強する方法【Docker+GUI Toool】
macOS前提の記述ですが、他OSでもある程度対応できるはずです。
Step1 Dockerを入れる
Dockerを入れる。
Step1-2 Dockerの操作を補助するツールを入れる(任意)
Kitematicを入れる。
想定読者層がDockerやSQLに慣れていない人であり、コンテナの停止や再起動といった事がGUIでできるため推奨。Step2 genschsa/mysql-employeesをpullする
Docker Hubkからgenschsa/mysql-employeesを入れる。docker pull genschsa/mysql-employeesでイメージを持ってきて
docker run -d \ --name mysql-employees \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=college \ -v $PWD/data:/var/lib/mysql \ genschsa/mysql-employeesで動かせる
Step3-1 DB GUIアプリを入れる
Sequel Aceの様なGUIでDBを操作できるアプリケーションを入れる。
Windowsの場合や、他のGUIアプリケーションが良いならMySQLのおすすめ便利クライアントツールを参考にしてみてください。本記事でGUIツールでの利用を
Step3-2 GUIアプリで接続する
docker runの際にmysqlのパスワードをcollege、コンテナのポート3306とローカルのポート3306を繋げているのでこの情報を元にGUIアプリから操作をする事ができる。
設定はこの様にHostを自分のPC、ユーザー名をroot、パスワードにcollegeという様に設定すればどの環境でも接続できるはず。
あとはSelect Databaseにemployeesを設定して中身を確認し、
データを追加したり
消したり
あとはWeb上のドキュメントを読んで試したりするだけ。
(例: MySQL 5.6 リファレンスマニュアル)
楽しみましょう!本記事を書いたきっかけ
ええっ!?30万件近いデータの入ったemployeesデータベースがDocker imageとして公開されているのかい!?
— dowanna @PrAha Inc. CEO兼エンジニア (@dowanna6) January 26, 2021
クエリやインデックスやパフォーマンスチューニングの練習に使える最高の環境がdocker runするだけで手に入るのかい!?
すごいねマスオくぅん!https://t.co/Q8jKGs2I3F
を見てSQLの操作を勉強する時、データベースの中身を用意するのが面倒くて他の事に目移りしたんだよなぁと思って書きました。この中のデータはEmployees Sample Databaseで公開されているので、最新のMySQLでイメージ
作って試すのも面白そうですね。
- 投稿日:2021-02-20T22:02:42+09:00
低コストでSQLを勉強する方法【Employees Sample Database+Docker+GUI Toool】
macOS前提の記述ですが、他OSでもある程度対応できるはずです。
Step1 Dockerを入れる
Dockerを入れる。
Step1-2 Dockerの操作を補助するツールを入れる(任意)
Kitematicを入れる。
想定読者層がDockerやSQLに慣れていない人であり、コンテナの停止や再起動といった事がGUIでできるため推奨。Step2 genschsa/mysql-employeesをpullする
Docker Hubkからgenschsa/mysql-employeesを入れる。docker pull genschsa/mysql-employeesでイメージを持ってきて
docker run -d \ --name mysql-employees \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=college \ -v $PWD/data:/var/lib/mysql \ genschsa/mysql-employeesで動かせる
Step3-1 DB GUIアプリを入れる
Sequel Aceの様なGUIでDBを操作できるアプリケーションを入れる。
Windowsの場合や、他のGUIアプリケーションが良いならMySQLのおすすめ便利クライアントツールを参考にしてみてください。本記事でGUIツールでの利用を
Step3-2 GUIアプリで接続する
docker runの際にmysqlのパスワードをcollege、コンテナのポート3306とローカルのポート3306を繋げているのでこの情報を元にGUIアプリから操作をする事ができる。
設定はこの様にHostを自分のPC、ユーザー名をroot、パスワードにcollegeという様に設定すればどの環境でも接続できるはず。
あとはSelect Databaseにemployeesを設定して中身を確認し、
データを追加したり
消したり
あとはWeb上のドキュメントを読んで試したりするだけ。
(例: MySQL 5.6 リファレンスマニュアル)
楽しみましょう!本記事を書いたきっかけ
ええっ!?30万件近いデータの入ったemployeesデータベースがDocker imageとして公開されているのかい!?
— dowanna @PrAha Inc. CEO兼エンジニア (@dowanna6) January 26, 2021
クエリやインデックスやパフォーマンスチューニングの練習に使える最高の環境がdocker runするだけで手に入るのかい!?
すごいねマスオくぅん!https://t.co/Q8jKGs2I3F
を見てSQLの操作を勉強する時、データベースの中身を用意するのが面倒くて他の事に目移りしたんだよなぁと思って書きました。この中のデータはEmployees Sample Databaseで公開されているので、最新のMySQLでイメージ
作って試すのも面白そうですね。
- 投稿日:2021-02-20T16:35:08+09:00
M1 MacでのECRへのpushで ここに気をつけろ❗️
要点
- CodeBuild でエラー。何が起きたか気づきにくい
standard_init_linux.go:211: exec user process caused "exec format error"
- amd64 のダイジェストを指定してpullしましょう
内容
2020年から Docker Hub の Pull回数制限がかかり、
回避のためにローカルからpushする方などいるのではないでしょうか。M1 Macでも いつもの通り、
$ docker pull XX:XX
と普通に pull してしまうかもしれませんが、対象のimageがマルチCPUアーキテクチャ対応だと、
自動選択で arm のイメージを持ってきてしまいます?ですので、amd64 のダイジェストを指定してpullしましょう。
php imageでの簡易例
以下のように pull する
$ docker pull php:fpm-alpine3.13@sha256:4b90222a821ef24358d305cbe51ff65f31edea6e323b06f40ee1f800401ebaf0試しに run で確認して、arm という文字列がなければOK
$ docker run 932a0ce9593c uname -a Linux 2309aaa4729b 4.19.121-linuxkit #1 SMP Tue Dec 1 17:50:32 UTC 2020 x86_64 Linux
- 投稿日:2021-02-20T15:15:01+09:00
VSCode+dockerで開発環境をサクッとつくる基本手順
はじめに
Node.js,Vue.js,Vuetifyの環境を例に手順を記載します。
使用する言語により開発環境にインストールするパッケージや、Dockerのイメージは変更してください。事前準備
Docker desktopをインストールしておく
VSCodeにRemote-Containers Pluginを入れておく
Windowsのファイルシステムにコンテンツおいて、コンテナで参照すると速度がかなり遅くなるらしいです。WSL2内にファイルを置いた方よいそうです。
このため、WSL2も使えるようにして、います。手順
- ソースを作成するフォルダを作成 work/vuetify01
- VSCodeでこのフォルダを開く
Ctrl+Shift P でコマンドパレットを開いて、Add Development Container Cinfiguration Filesを開く
devcontainer.jsonファイルに
"postCreateCommand": "yarn global add @vue/cli && yarn install",
を追加
こんな感じ
コマンドパレットで、Rebuild and Reopen in Containerを実行
VSCodeが再起動して、Containerが起動し接続した状態になります。
ターミナルを開くと、コマンドプロンプトがコンテナ内になっていることが分かります。nodeも使える状態になっています。
vueプロジェクトの作成や、追加パッケージのインストール
$ cd .. $ vue create vuetify01 $ cd vuetify01/ $ yarn serve $ vue add vuetify以上
- 投稿日:2021-02-20T14:48:54+09:00
【個人開発 参考記事 自分用メモ】ENG_QUIZ 開発にあたり参考にした記事まとめ
「元から作りたかった」+「普段の業務で触れられない、主にバックエンドの技術に触れたい」
という想いからクイズアプリを作成しました。
ちゃんと手順を記事にしようと思ったらとてつもない時間がかかってしまいますが、取り急ぎメモ的な感じで、参考記事(詰まりポイント)を羅列します。リポジトリURL:
https://github.com/Takabun/eng_quiz/tree/master/web
使用技術:
フロント:Nuxt.js + Typescript + SSR(サーバーサイドレンダリング)
API: Golang + Echo フレームワーク DB: MySQL
インフラ: Docker + Kubernetesインフラ構成図
DB構成図
(users/mylists/commentsテーブルは、作成はしたが結局使わず…)
ここから、各技術について参考にした資料一覧
Docker + Kubernetes
参考書: Docker/Kubernetes 実践コンテナ開発入門
定番のある良書です。ただ、k8s コンテナのデバック(踏み台コンテナの作成 / コンテナの中に入ってcurlで他コンテナと通信する)については記載が無く、そこについても言及して欲しかったです。APIのDockerイメージ作成の際、go run main.goコマンドが認識されずハマった。
その際に参考にした記事
https://qiita.com/sky0621/items/d837c566b04464469fdbwebコンテナ作成 この記事のお陰で、特に詰まる事なく実装できた
https://yopinoji.com/docker-for-nuxt-js定番だが、Dockerの学び始めには下記のチュートリアルがオススメ
https://y-ohgi.com/introduction-docker/DB
コンテナ化の際、日本語が文字化けした。下記の記事で解決
https://qiita.com/zongxiaojie/items/6b593ec4ce5e85bb342cAPI
Golang echoフレームワーク
ORM gormHTTPieを導入する事で、普通にcurlコマンドを打ってAPIの挙動を確認するよりも楽になりました。
参考記事.Relatedの使い方でハマった時に参考になった記事
http://egawata.hatenablog.com/entry/2017/01/14/143143echoでAPIサーバーを実装するにあたり、個人的に一番コンパクトにまとまっていると思った記事
https://kimagureneet.hatenablog.com/entry/2017/12/20/163848結局出来なかった事:
Realizeを用いたホットリロードの実装。
バージョンの違いのせいか、結局Realizeが上手く動かず、ホットリロード無しで実装した。
(世の中のgopher達みんなどうやってるんだろ…)
https://qiita.com/godgarden/items/f73e4a717f1a27b9a3b0WEB
nuxt-typed-vuex(VuexにTSで型をつける)
ちょうど業務で、このパッケージを使う必要が出てきた頃だったので、業務での導入前にいい練習になりました。
https://qiita.com/shindex/items/a90217b9e4c03c5b5215AWS S3を用いた画像保存/表示
https://funasaki.hatenablog.com/entry/2013/11/06/163558
- 投稿日:2021-02-20T13:09:27+09:00
Python AWS Lambda でmultipart/form-dataのファイルをS3にアップロードする
Python AWS Lambda でmultipart/form-dataのファイルをS3にアップロードする
概要
AWSのLambda経由でmultipart/form-dataできたものを、S3にアップロードする。
小言
clientでそのままS3に送る実装や、Blob化してファイルを送信しているのはよく見るが、めんどくさいし通常のApiならmultipart/form-dataを利用する方が多く(
多いと思ってる)、なんでClientがApiとLambdaで変更しないといけないか不思議に思ったため。Dependent
Result
TL;DR
- multipart/form-dataできたものをcgi moduleを利用してFormに変更
- Form化したデータからresponseBodyのfield名でファイルを取得
0. app.pyは最初こんなイメージ
app.pyimport json def lambda_handler(event, context): return { "statusCode": 200, "body": json.dumps({ "message": "hello world", }), }1. multipart/form-dataできたものをcgi moduleを利用してFormのデータに変更
app.pyimport json import cgi import io import logging # これは個人的に入れているのでほっておいていい import base64 def get_file_from_request_body(headers, body): fp = io.BytesIO(base64.b64decode(body)) # decode environ = {"REQUEST_METHOD": "POST"} headers = { "content-type": headers["Content-Type"], "content-length": headers["Content-Length"], } fs = cgi.FieldStorage(fp=fp, environ=environ, headers=headers) # FieldStorageを利用してForm Dataとして扱う def lambda_handler(event, context): return { "statusCode": 200, "body": json.dumps({ "message": "hello world", }), }2. Form化したデータからresponseBodyのfield名でファイルを取得
requestの形が以下のようになっていいる想定です。
request.ts{ "file": File }app.pyimport json import cgi import io import logging # これは個人的に入れているのでほっておいていい import base64 def get_file_from_request_body(headers, body): fp = io.BytesIO(base64.b64decode(body)) # decode environ = {"REQUEST_METHOD": "POST"} headers = { "content-type": headers["Content-Type"], "content-length": headers["Content-Length"], } fs = cgi.FieldStorage(fp=fp, environ=environ, headers=headers) # FieldStorageを利用してForm Dataとして扱う return [fs["file"], None] def lambda_handler(event, context): ## ここから追記 file_item, file_item_error = get_file_from_request_body( headers=event["headers"], body=event["body"] ) ## ここまで追記 return { "statusCode": 200, "body": json.dumps({ "message": "hello world", }), }こんな感じで適当に対応しましたが、多分もっといい書き方がある気がする...
- 投稿日:2021-02-20T10:16:41+09:00
【Docker/Laravel/MySQL5.7】docker-compose upした際にMySQL5.7コンテナがすぐにExitedしてしまう
Hello everyone !
問題
docker-compose up -d
でコンテナを作成&起動しようとしたところStarting app-mysql ... done Starting app-redis ... done Starting app-mailcatcher ... done Starting app-app ... done Starting app-nginx ... done正常に実行できたかと思われましたが
docker ps
でステータスを確認するとCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88f28d9cab3a app_nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp app-nginx 068d2c2a95ca app_app "docker-php-entrypoi…" About a minute ago Up About a minute 0.0.0.0:9000->9000/tcp app-app 46819a975074 mysql:5.7 "docker-entrypoint.s…" About a minute ago Exited (1) About a minute ago app-mysql b48d4aa43dc9 redis:5.0.5-alpine "docker-entrypoint.s…" 5 weeks ago Up About a minute 0.0.0.0:6379->6379/tcp app-redis 79f839320c2a schickling/mailcatcher "mailcatcher --no-qu…" 5 weeks ago Up About a minute 1025/tcp, 0.0.0.0:1080->1080/tcp app-mailcatchermysql:5.7コンテナだけ起動後にすぐ終了していることがわかりました。
ログを確認する
docker-compose logs上記のコマンドでログを確認したところ以下のエラー文を確認しました。
// 一部抜粋 app-mysql | 2021-02-20T00:29:51.663885Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.解決策
エラー文を直訳すると
--initialize(初期化)が指定されていますが、データディレクトリにファイルがあるため失敗
ということでしたのでデータディレクトリのファイルを削除します。
app/docker-compose.ymlでディレクトリを設定していたので確認。volumes: - "./storage/mysql:/var/lib/mysql"ファイルやディレクトリを削除する
rm
Linuxコマンドにオプションの
r(指定ディレクトリ内のファイルやディレクトリを全て削除)
と
f(警告メッセージを表示しない)
をつけて実行します。$ rm -rf storage/mysql以上でデータディレクトリにファイルの削除ができたのでコンテナを再起動させます。
$ docker-compose restartmysql:5.7コンテナが起動後に落ちていないことを確認できました。
Thank you for always reading my posts.
Have a good day !
- 投稿日:2021-02-20T04:22:02+09:00
CentOS7でDocker(20.10.3)のバージョンアップの作業記録
はじめに
CentOS7/docker1.13.1の環境上のとある開発環境で
docker-compose up
の実行時にエラーが出た事がきっかけで、dockerのバージョンをあげようとした際の調査と作業の記録です。はじめに、とある開発環境での
docker-compose up
時、以下のエラーが発生しました。$ docker-compose up Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/ Building web unknown flag: --iidfile See 'docker build --help'. ERROR: Service 'web' failed to build「Moby」ベースとなったオープンソース版Dockerの最新状況 によると、
さらに Docker 17.06では、docker buildコマンドに「–iidfile <ファイル>」オプションが追加された。これはビルドの完了後、指定したファイルに作成されたイメージのイメージIDを出力するというものだ。これらの機能はスクリプトファイルなどを利用したコンテナ作成の自動化などに役立つだろう。
とのことで、どうやら「docker 17.06」以降のフラグ設定がどこかで使われてるようだという所まで確認。早速、Dockerのバージョンアップに取り掛かったのが、これがなかなかの大仕事に発展したのでした。
参考
環境
- CentOS Linux release 7.9.2009 (Core)
- Docker 1.13.1
確認
$ yum list installed | grep docker docker.x86_64 2:1.13.1-203.git0be3e21.el7.centos手順
- 古いバージョンのdockerの削除
- 必要なパッケージのインストール
- リポジトリを追加する
- Docker CEをインストール
- 自動起動を設定
- dockerを起動する
$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo $ sudo yum install docker-ce -y $ sudo systemctl enable docker $ sudo systemctl start dockerここでエラー発生
$ sudo systemctl start docker Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" and "journalctl -xe" for details. To force a start use "systemctl reset-failed docker.service" followed by "systemctl start docker.service" again.これを見ると、
systemctl status docker.service
とjournalctl -xe
を見ろと出てる。
実行結果と考察は省略。yum upgradeを実行
どうやらkernelのバージョンが古い事が原因のように見受けられる。そこで、まずシステムのバージョンアップを試みる。
$ sudo yum upgrade Transaction Check Error: installing package grub-1:0.97-99.el6.x86_64 needs 4KB on the /boot filesystem installing package kernel-2.6.32-696.el6.x86_64 needs 29MB on the /boot filesystem Error Summary Disk Requirements: At least XXMB more space needed on the /boot filesystem./bootの容量が足りずに
yum upgrade
が失敗。/bootの容量の拡張
- 拡張ディスクを追加する
- 拡張ディスクにLVMパーテションを作成する
- 物理ボリュームを追加した拡張ディスクに作成する
- ボリュームグループ名を確認し、作成した物理ボリュームを加える
- 既存の物理ボリュームら新規に作成した物理ボリュームにデータを移動する
- 既存の物理ボリュームをボリュームグループから削除する
- 既存の物理ボリュームのパーテションを再作成しつつ拡張する
- 再起動し拡張したパーテーションを認識させる
- 再作成した/bootパーテションをresize2fsで拡張する
参考:/bootパーテーションの容量拡張方法(resize2fs)
容量拡張 → 引き続きエラー発生
今回、たまたま2台同一環境のマシンのDockerのアップデート作業を実施していた所、
/boot
パーテーションの拡張で1台は問題解消されたのだが、なぜかもう1台は引き続き以下エラーが出続けてしまっていた。その際の解消に至った内容も追記しておく。エラーは以下の通り
Client: Docker Engine - Community Version: 20.10.3 API version: 1.41 Go version: go1.13.15 Git commit: 48d30b5 Built: Fri Jan 29 14:34:14 2021 OS/Arch: linux/amd64 Context: default Experimental: true Cannot connect to the Docker daemon at xxxxxxxx. Is the docker daemon runnnig?エラーを詳細に表示させたい場合、以下のように
dockerd
で直接起動させると起動の様子を表示させることが出来る。$ sudo dockerd INFO[2021-02-20T04:05:49.872817325+09:00] Starting up INFO[2021-02-20T04:05:49.883049052+09:00] libcontainerd: started new containerd process pid=15581 INFO[2021-02-20T04:05:49.883118400+09:00] parsed scheme: "unix" module=grpc INFO[2021-02-20T04:05:49.883133982+09:00] scheme "unix" not registered, fallback to default scheme module=grpc INFO[2021-02-20T04:05:49.883157429+09:00] ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd/containerd.sock <nil> 0 <nil>}] <nil> <nil>} module=grpc INFO[2021-02-20T04:05:49.883168139+09:00] ClientConn switching balancer to "pick_first" module=grpc INFO[2021-02-20T04:05:49.901808034+09:00] starting containerd revision=269548fa27e0089a8b8278fc4fc781d7f65a939b version=1.4.3 INFO[2021-02-20T04:05:49.927994720+09:00] loading plugin "io.containerd.content.v1.content"... type=io.containerd.content.v1 ・ ・ ・ INFO[2021-02-20T04:05:49.965815327+09:00] parsed scheme: "unix" module=grpc INFO[2021-02-20T04:05:49.965839790+09:00] scheme "unix" not registered, fallback to default scheme module=grpc INFO[2021-02-20T04:05:49.965854868+09:00] ccResolverWrapper: sending update to cc: {[{unix:///var/run/docker/containerd/containerd.sock <nil> 0 <nil>}] <nil> <nil>} module=grpc INFO[2021-02-20T04:05:49.965860494+09:00] ClientConn switching balancer to "pick_first" module=grpc INFO[2021-02-20T04:05:50.065495949+09:00] [graphdriver] using prior storage driver: overlay2 INFO[2021-02-20T04:05:50.301671913+09:00] Loading containers: start. INFO[2021-02-20T04:05:50.653224046+09:00] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x28 pc=0x555dab9e432c]上記ではエラー内容少し違うが、この時ハマったのはバージョンアップ前のコンテナを起動させっぱなしでバージョンアップを試みた為、コンテナや仮想ネットワークが中途半端に残ってしまっていた。なので、古いコンテナのクリーンアップを実施
$ sudo rm /var/lib/docker/containers/ -rfまた、
swap
領域をfdiskで定義し忘れていた事も可能性としてはありそう。この2つを解消して最後は無事起動させることが出来た。
- 投稿日:2021-02-20T00:47:21+09:00
AWSのEC2へのデプロイ②(必要なパッケージのインストール)
AWSのEC2へのデプロイをしたいと思い備忘録のために手順を記録します。
初学者の為、ご指摘等ありましたらご連絡いただければ幸いです。前回の記事はこちら
AWSのEC2へのデプロイ①(EC2インスタンス作成からログインまで)前回の内容は言語関係ないのですが今回から必要なパッケージが言語によって異なるのでご注意ください。
はじめに
私自身この手順で無事にデプロイができましたが、途中でエラーが出たことによりいろいろな記事を参考にさせて頂きました。
この場を借りて御礼申し上げます。そのため、私に知識がないばかりに私の環境に必要のない操作もあるかもしれません。
初学者のためご承知おきください。
お気づきの点ございましたらご連絡いただければとても喜びます。環境
Version PHP 7.4.14 Laravel 8.24.0 mysql 8.0.23 docker 20.10.2 docker-compose 1.27.4 EC2では
Amazon Linux 2
を利用しています。前提
- AWSのアカウントを作成済みである
- EC2のインスタンス作成済みでsshにログインできる
EC2インスタンスに接続
1.AWSのEC2の画面で下記画像のように
インスタンス
から接続
を押下します。2.下記画像のように
SSHクライアント
を押下後、一番下の文字列をコピーします。3.コピーした
ssh -i ~
をターミナルで入力するとターミナルAre you sure you want to continue connecting (yes/no/[fingerprint])?と出るので
yes
と入力します。4.下記のような内容が出力されていればOKです。
ターミナル[ec2-user@ip-×××-××-××-××× ~]$gitのインストール
コマンドは全てEC2インスタンス内で行います。
1.下記コマンドでyumをupdateします。
ターミナル$ sudo yum update -y2.下記コマンドでgitをインストールします。
ターミナル$ sudo yum install git3.下記コマンドご自身のユーザー名とパスワードを設定します。
ターミナル$ git config --global user.name [ユーザー名] $ git config --global user.email [メールアドレス]4.下記コマンドで確認します。
ターミナル$ git config --list | grep user5.下記のように出ていればOKです。
ターミナルuser.name=[ユーザー名] user.email=[メールアドレス]Dockerのインストール
コマンドは全てEC2インスタンス内で行います。
Dockerのインストールは公式のAmazonECSにおけるDockerの基本で確認しました。1.下記コマンドで最新の
Docker Engineパッケージ
をインストールします(Amazon Linux 2用のコマンドです。)ターミナルsudo amazon-linux-extras install docker2.下記コマンドでDockerサービスを開始します。
ターミナルsudo service docker start3.下記コマンドで
ec2-user
をdockerグループ
に追加するとsudoコマンド
を使用せずにDockerコマンド
を実行できます。ターミナルsudo usermod -a -G docker ec2-user4.一旦EC2インスタンスからログアウト(exit)して再ログインします。
※これをしなくて私はエラーになりましたので大事です。5.下記コマンドで
ec2-user
がsudoコマンド
を使用せずにDockerコマンド
を実行できることを確認します。ターミナルdocker info下記のようなメッセージが出ればOKです。
ターミナルClient: Debug Mode: false Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 //省略docker-composeのインストール
参考記事:M1 Mac + Laravel + Docker + AWS でポートフォリオを作るまで[初心者][未経験]
コマンドは全てEC2インスタンス内で行います。
1.下記コマンドで
su
に入ります。ターミナルsudo -i2.下記コマンドでcomposeをインストールします。
ターミナルcurl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose3.下記コマンドで実行権限を付与します。
ターミナルchmod +x /usr/local/bin/docker-compose4.exitをして抜けます。
ターミナルexit
5.下記コマンドでdocker-composeがインストールされているか確認します。
ターミナルdocker-compose --version下記のようにバージョンが出てくればOKです。
ターミナルdocker-compose version 1.27.4, build 40524192参考にした先ほどの記事で
docker-compose.yml
のバージョンを書き換えました。docker-compose.ymlversion: "3.3" ←変更 services: app: build: ./infra/php volumes: - ./backend:/work //省略EC2インスタンス内でDockerを起動
コマンドは全てEC2インスタンス内で行います。
1.下記コマンドでgitからcloneします。
ターミナルgit clone [githubのURL]2.下記コマンドでフォルダがあるか確認します。
ターミナルls
3.下記コマンドでディレクトリを移動します。
ターミナルcd [ディレクトリ名]4.下記コマンドでdockerコンテナを立ち上げます。
少し長いメッセージが出ます。ターミナルdocker-compose up -d下記のようなメッセージが出ればOKです。
ターミナルCreating ×××_app_1 ... done Creating ×××_web_1 ... done Creating ×××_db_1 ... done Creating phpmyadmin ... done5.下記コマンドでステータスを確認します。
ターミナルdocker-compose ps
State
が全てup
になっていればOKです。PHPのインストール
参考記事:AWS EC2 AmazonLinux2 PHPをインストールする
コマンドは全てEC2インスタンス内で行います。
1.下記コマンドでインストールリポジトリを追加します。
ターミナルsudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmターミナルsudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm2.下記コマンドで既存のPHPパッケージを削除します。(削除するものがなくても問題ないです)
ターミナルsudo yum remove php3.下記コマンドでPHPのパッケージをインストールします。
ターミナルsudo yum install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt4.下記コマンドでバージョンを指定してインストールします。
途中で[y/d/N]
とインストールしてもいいかの選択が出るのでy
を押しEnterで進めます。ターミナルsudo amazon-linux-extras install php7.45.下記コマンドでその他の必要なパッケージをインストールします。
こちらも途中で[y/d/N]
とインストールしてもいいかの選択が出るのでy
を押しEnterで進めます。ターミナルsudo yum install --enablerepo=remi,amzn2extra-php7.4 php-xml php-mbstring6.下記コマンドでyumにてインストールされたphpと名前がつくパッケージの一覧を表示し確認します。
ターミナルyum list installed | grep php下記のように表示されればOKです。
ターミナルphp-cli.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4 php-common.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4 php-fpm.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4 php-json.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4 php-mbstring.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4 php-mysqlnd.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4 php-pdo.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4 php-xml.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.47.無事に成功すれば下記コマンドでバージョンが表示されます。
ターミナルphp --versionMariaDBのインストール
コマンドは全てEC2インスタンス内で行います。
1.下記コマンドでMariaDBのインストールをします。
ターミナルsudo yum -y install mysql56-server mysql56-devel mysql56 mariadb-server mysql-devel2.下記コマンドでデータベースを起動します。
ターミナルsudo systemctl start mariadb下記コマンドで起動できたかを確認します。
ターミナルsudo systemctl status mariadb緑の文字で
active (running)
と出ていればOKです。3.データベースのrootパスワードを設定します。
まずは下記のコマンドを入力します。
ターミナルsudo /usr/bin/mysql_secure_installation次からどんどん質問が出てくるので答えていきます。
Enter current password for root (enter for none):
→Enterキーを押す。
Set root password? [Y/n]
→「Y」を入力してEnterキーを押す。
New password:
→ご自身で決めたパスワードを入力する。(画面には表示されないけど入力できています)
Re-enter new password:
→もう1度ご自身で決めたパスワードを入力する。
Remove anonymous users? [Y/n]
→「Y」を入力してEnterキーを押す。
Disallow root login remotely? [Y/n]
→「Y」を入力してEnterキーを押す。
Remove test database and access to it? [Y/n]
→「Y」を入力してEnterキーを押す。
Reload privilege tables now? [Y/n]
→「Y」を入力してEnterキーを押す。4.データベースに接続を確認します。
下記コマンドでデータベースに接続できるか確認します。
ターミナルmysql -u root -pパスワードを求められるので入力しEnterキーを押します。
ターミナルMariaDB [(none)]>上記のように表示されれば接続できています。
抜け出したいときはexit
で抜け出せます。Laravel環境設定
参考記事:AWSにEC2上にdockerを使用したlaravelをデプロイ④(gitクローン〜デプロイ、マイグレーション)
コマンドは全てEC2インスタンス内で行います。
1.下記コマンドでコンテナ内に入ります。
ターミナルdocker-compose exec app bash2.下記コマンドで.envファイルを作成します。
.envファイルはgitリポジトリにpushされないためです。ターミナルcp .env.example .env3.下記コマンドでcomposerをインストールします。
ターミナルcomposer install4.下記コマンドでAPP_KEYを発行します。
ターミナルphp artisan key:generate5.下記コマンドで権限を変更します。
ターミナルchmod 777 storage/logs vendor chmod 777 storage/framework/views chmod 777 storage/framework/sessions6.画像投稿がある場合は下記コマンドも必要みたいです。
ターミナルphp artisan storage:link chown -R www-data:root .7.下記コマンドでマイグレーションを実行します。
ターミナルphp artisan migrate php aritsan db:seed以上で無事にデプロイ ができました。
ただ、現在S3への画像の保存ができない状態なので解決出来次第修正致します。
- 投稿日:2021-02-20T00:26:27+09:00
Docker,CircleCI,AWS,Railsでポートフォリオを作成
前書き
就職活動用のポートフォリオをDocker,CircleCI,AWS(ECS)を用いてWebアプリケーションを作成しました。
バックエンドにRuby on Railsを用いました。
今回は作成したポートフォリオの機能、参考記事などを紹介したいと思います。概要と作成背景
今回作成したアプリはスイーツのデリバリーに特化したECサイトです。
- ケーキ屋のアルバイト経験からお店の業務改善をしたい
- 手軽にお店のスイーツを食べたい
- 店舗で販売しているようなスイーツを配達するサービスが存在しない(自分調べ)
上記の理由により飲食店にもユーザーにもメリットのあるサービスを作成しようと思いました。
アプリのURL: http://sweetsdeli.com
GitHubのURL: https://github.com/sekine617/sweetsdeli
画面イメージ紹介
トップページ
新着商品、人気商品などを表示
人気商品はユーザーの購入履歴から購入数が多い商品を表示しています。
商品一覧ページ
商品詳細ページ
こちらでは商品をカートに入れる、お気に入り登録、商品のレビュー投稿などができます。
マイページ
マイページではプロフィール編集、お気に入り、購入履歴、投稿したレビューを閲覧できます。
ショッピングカート
こちらではカートに入れた商品の確認、個数の変更、カートから削除などができます。
購入画面
カートに入れた商品から合計金額を確認し、クレジットカードによる決済が可能です。実際に決済する場合はpay.jpのてすとカードを使用してください。
このようにカード情報の入力フォームがモーダルウィンドウで出てきます。
使用言語
- フロントエンド
- jQuery
- HTML
- CSS/Sass
- Bootstrap
- バックエンド
- Ruby on Rails
- Ruby
- PAY.JP(外部API)
- インフラ
- Docker/docker-compose
- CircleCI
- nginx
- mysql
- AWS(ECS, ALB, S3, RDS, Route53, ECR, VPC, IAM)
インフラ構成図
開発環境
機能一覧
- ユーザー関連(devise)
- 登録機能
- プロフィール編集機能
- ログイン・ログアウト機能
- 決済機能(PAY.JP API)
- 人気商品表示機能
- タグ機能
- 商品登録機能
- 画像アップロード機能(AWS S3バケット, carrierwave)
- お気に入り機能(非同期処理, jQuery)
- フラッシュメッセージ表示機能
- レビュー投稿機能
- カート関連
- カート登録機能
- カート編集機能
- 住所自動入力機能(jQuery)
- 商品名検索機能
- カテゴリー検索機能
- ページネーション機能(kaminari)
データベース設計
テーブル説明
テーブル名 説明 users ユーザー情報 orders 注文管理(受け取り日時など) orders_products 注文商品管理 products 商品情報 reviews 商品に対するレビューを管理 likes 商品へのお気に入り情報 address ユーザーの住所 cart_items cartsとproductsの中間テーブル shops ショップ情報 carts カート追加した商品情報一時的に保存 product_tag_relations productsとtagsの中間テーブル tags 商品のカテゴリ情報 ポイントはproductsテーブルのquantity_per_dayで、1日の提供数を指定し注文数が1日の提供数を上回らないようにしました。
また注文時に受け取り日時を指定し、各店舗ごと、日にちごとに管理が可能です。苦労した点
CircleCIでAWSへの自動デプロイ
CircleCIを用いて開発環境のDockerイメージをECRにpushし、ECSのタスク定義を更新してデプロイをしましたが、config.ymlの設定でのエラーに悩まされました。
またAWSの各設定にもかなり悩まされ、インフラの知識がないことで時間が結構かかりました。credentials.ymlでのpay.jpなどのアクセスキー管理でなかなかうまく行かずインデントの重要性がよくわかりました。
参考記事
Railsでのテストを参考にしました。
【Rails】はじめてのRSpec!テストコードを書こう!deviseのログイン機能を参考にしました
【Rails】ログイン機能を実装する