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

Dockerのイメージとコンテナ削除

内容

AWS EC2でdockerを動かしていると、不要なイメージとコンテナが溜まってサーバー容量が圧迫されるので、削除する際のメモ。

参考:
https://docs.docker.com/config/pruning/

イメージを削除

コンテナから参照されていない 且つ タグがついていない イメージを一括削除

$ docker image prune

オプション

オプション 説明
--all, -a 未使用のイメージをすべて削除
--filter 条件指定。例: "until=24h"
--force, -f 確認無しで即時削除

コンテナ削除

停止状態のコンテナを一括削除
(image削除と一緒)

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

低コストでSQLを勉強する方法【Docker+GUI Toool】

macOS前提の記述ですが、他OSでもある程度対応できるはずです。

Step1 Dockerを入れる

Dockerを入れる。

Step1-2 Dockerの操作を補助するツールを入れる(任意)

Kitematicを入れる。
想定読者層がDockerやSQLに慣れていない人であり、コンテナの停止や再起動といった事がGUIでできるため推奨。

Step2 genschsa/mysql-employeesをpullする

image.png
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アプリを入れる

image.png
Sequel Aceの様なGUIでDBを操作できるアプリケーションを入れる。
Windowsの場合や、他のGUIアプリケーションが良いならMySQLのおすすめ便利クライアントツールを参考にしてみてください。

本記事でGUIツールでの利用を

Step3-2 GUIアプリで接続する

docker runの際にmysqlのパスワードをcollege、コンテナのポート3306とローカルのポート3306を繋げているのでこの情報を元にGUIアプリから操作をする事ができる。

image.png

設定はこの様にHostを自分のPC、ユーザー名をroot、パスワードにcollegeという様に設定すればどの環境でも接続できるはず。

あとはSelect Databaseにemployeesを設定して中身を確認し、

image.png

データを追加したり

image.png

消したり

image.png

あとはWeb上のドキュメントを読んで試したりするだけ。
(例: MySQL 5.6 リファレンスマニュアル)
楽しみましょう!

本記事を書いたきっかけ


を見てSQLの操作を勉強する時、データベースの中身を用意するのが面倒くて他の事に目移りしたんだよなぁと思って書きました。

この中のデータはEmployees Sample Databaseで公開されているので、最新のMySQLでイメージ
作って試すのも面白そうですね。

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

低コストでSQLを勉強する方法【Employees Sample Database+Docker+GUI Toool】

macOS前提の記述ですが、他OSでもある程度対応できるはずです。

Step1 Dockerを入れる

Dockerを入れる。

Step1-2 Dockerの操作を補助するツールを入れる(任意)

Kitematicを入れる。
想定読者層がDockerやSQLに慣れていない人であり、コンテナの停止や再起動といった事がGUIでできるため推奨。

Step2 genschsa/mysql-employeesをpullする

image.png
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アプリを入れる

image.png
Sequel Aceの様なGUIでDBを操作できるアプリケーションを入れる。
Windowsの場合や、他のGUIアプリケーションが良いならMySQLのおすすめ便利クライアントツールを参考にしてみてください。

本記事でGUIツールでの利用を

Step3-2 GUIアプリで接続する

docker runの際にmysqlのパスワードをcollege、コンテナのポート3306とローカルのポート3306を繋げているのでこの情報を元にGUIアプリから操作をする事ができる。

image.png

設定はこの様にHostを自分のPC、ユーザー名をroot、パスワードにcollegeという様に設定すればどの環境でも接続できるはず。

あとはSelect Databaseにemployeesを設定して中身を確認し、

image.png

データを追加したり

image.png

消したり

image.png

あとはWeb上のドキュメントを読んで試したりするだけ。
(例: MySQL 5.6 リファレンスマニュアル)
楽しみましょう!

本記事を書いたきっかけ


を見てSQLの操作を勉強する時、データベースの中身を用意するのが面倒くて他の事に目移りしたんだよなぁと思って書きました。

この中のデータはEmployees Sample Databaseで公開されているので、最新のMySQLでイメージ
作って試すのも面白そうですね。

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

M1 MacでのECRへのpushで ここに気をつけろ❗️

horizontal-logo-monochromatic-white.png

要点

  • 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での簡易例

  1. Tagsタブ -> OS/ARCH のlinux/amd64 を選択
    スクリーンショット 2021-02-20 15.58.40.png

  2. DIGEST: の右をコピー
    スクリーンショット 2021-02-20 15.33.26.png

  3. 以下のように pull する

    $ docker pull php:fpm-alpine3.13@sha256:4b90222a821ef24358d305cbe51ff65f31edea6e323b06f40ee1f800401ebaf0
    
  4. 試しに 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
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VSCode+dockerで開発環境をサクッとつくる基本手順

はじめに

Node.js,Vue.js,Vuetifyの環境を例に手順を記載します。
使用する言語により開発環境にインストールするパッケージや、Dockerのイメージは変更してください。

事前準備

Docker desktopをインストールしておく
VSCodeにRemote-Containers Pluginを入れておく
image.png

Windowsのファイルシステムにコンテンツおいて、コンテナで参照すると速度がかなり遅くなるらしいです。WSL2内にファイルを置いた方よいそうです。
このため、WSL2も使えるようにして、います。

手順

  1. ソースを作成するフォルダを作成 work/vuetify01
  2. VSCodeでこのフォルダを開く
  3. Ctrl+Shift P でコマンドパレットを開いて、Add Development Container Cinfiguration Filesを開く
    image.png

  4. Show All Definitionsを選択
    image.png

  5. コンテナを選ぶ。今回はNode.js & TypeScriptにしてみます。
    image.png

  6. バージョンを選択
    image.png

  7. devcontainer.jsonファイルに"postCreateCommand": "yarn global add @vue/cli && yarn install",を追加
    こんな感じ
    image.png

  8. コマンドパレットで、Rebuild and Reopen in Containerを実行
    image.png
    VSCodeが再起動して、Containerが起動し接続した状態になります。
    ターミナルを開くと、コマンドプロンプトがコンテナ内になっていることが分かります。nodeも使える状態になっています。
    image.png

  9. vueプロジェクトの作成や、追加パッケージのインストール

$ cd ..
$ vue create vuetify01
$ cd vuetify01/
$ yarn serve
$ vue add vuetify

以上

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

【個人開発 参考記事 自分用メモ】ENG_QUIZ 開発にあたり参考にした記事まとめ

「元から作りたかった」+「普段の業務で触れられない、主にバックエンドの技術に触れたい」
という想いからクイズアプリを作成しました。
ちゃんと手順を記事にしようと思ったらとてつもない時間がかかってしまいますが、取り急ぎメモ的な感じで、参考記事(詰まりポイント)を羅列します。

リポジトリURL:

https://github.com/Takabun/eng_quiz/tree/master/web

使用技術:

フロント:Nuxt.js + Typescript + SSR(サーバーサイドレンダリング)
API: Golang + Echo フレームワーク DB: MySQL
インフラ: Docker + Kubernetes

インフラ構成図

eng_quiz k8sインフラ構成.png

DB構成図

(users/mylists/commentsテーブルは、作成はしたが結局使わず…)
ENG_QUIZ-Page-1.png

ここから、各技術について参考にした資料一覧

Docker + Kubernetes

参考書: Docker/Kubernetes 実践コンテナ開発入門
定番のある良書です。ただ、k8s コンテナのデバック(踏み台コンテナの作成 / コンテナの中に入ってcurlで他コンテナと通信する)については記載が無く、そこについても言及して欲しかったです。

APIのDockerイメージ作成の際、go run main.goコマンドが認識されずハマった。
その際に参考にした記事
https://qiita.com/sky0621/items/d837c566b04464469fdb

webコンテナ作成 この記事のお陰で、特に詰まる事なく実装できた
https://yopinoji.com/docker-for-nuxt-js

定番だが、Dockerの学び始めには下記のチュートリアルがオススメ
https://y-ohgi.com/introduction-docker/

DB

コンテナ化の際、日本語が文字化けした。下記の記事で解決
https://qiita.com/zongxiaojie/items/6b593ec4ce5e85bb342c

API

Golang echoフレームワーク
ORM gorm

HTTPieを導入する事で、普通にcurlコマンドを打ってAPIの挙動を確認するよりも楽になりました。
参考記事

.Relatedの使い方でハマった時に参考になった記事
http://egawata.hatenablog.com/entry/2017/01/14/143143

echoでAPIサーバーを実装するにあたり、個人的に一番コンパクトにまとまっていると思った記事
https://kimagureneet.hatenablog.com/entry/2017/12/20/163848

結局出来なかった事:
Realizeを用いたホットリロードの実装。
バージョンの違いのせいか、結局Realizeが上手く動かず、ホットリロード無しで実装した。
(世の中のgopher達みんなどうやってるんだろ…)
https://qiita.com/godgarden/items/f73e4a717f1a27b9a3b0

WEB

nuxt-typed-vuex(VuexにTSで型をつける)
ちょうど業務で、このパッケージを使う必要が出てきた頃だったので、業務での導入前にいい練習になりました。
https://qiita.com/shindex/items/a90217b9e4c03c5b5215

AWS S3を用いた画像保存/表示
https://funasaki.hatenablog.com/entry/2013/11/06/163558

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

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

  1. multipart/form-dataできたものをcgi moduleを利用してFormに変更
  2. Form化したデータからresponseBodyのfield名でファイルを取得

0. app.pyは最初こんなイメージ

app.py
import json

def lambda_handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
        }),
    }

1. multipart/form-dataできたものをcgi moduleを利用してFormのデータに変更

app.py
import 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.py
import 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",
        }),
    }

こんな感じで適当に対応しましたが、多分もっといい書き方がある気がする...

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

【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-mailcatcher

mysql: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"

ファイルやディレクトリを削除するrmLinuxコマンドにオプションの
r(指定ディレクトリ内のファイルやディレクトリを全て削除)
f(警告メッセージを表示しない)をつけて実行します。

$ rm -rf storage/mysql

以上でデータディレクトリにファイルの削除ができたのでコンテナを再起動させます。

$ docker-compose restart

mysql:5.7コンテナが起動後に落ちていないことを確認できました。

Thank you for always reading my posts.
Have a good day !

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

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.servicejournalctl -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つを解消して最後は無事起動させることが出来た。

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

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の画面で下記画像のようにインスタンスから接続を押下します。

スクリーンショット 2021-02-13 22.40.27.png

2.下記画像のようにSSHクライアントを押下後、一番下の文字列をコピーします。

スクリーンショット 2021-02-13 22.45.31.png

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 -y

2.下記コマンドでgitをインストールします。

ターミナル
$ sudo yum install git

3.下記コマンドご自身のユーザー名とパスワードを設定します。

ターミナル
$ git config --global user.name [ユーザー名]
$ git config --global user.email [メールアドレス]

4.下記コマンドで確認します。

ターミナル
$ git config --list | grep user

5.下記のように出ていればOKです。

ターミナル
user.name=[ユーザー名]
user.email=[メールアドレス]

Dockerのインストール

コマンドは全てEC2インスタンス内で行います。
Dockerのインストールは公式のAmazonECSにおけるDockerの基本で確認しました。

1.下記コマンドで最新のDocker Engineパッケージをインストールします(Amazon Linux 2用のコマンドです。)

ターミナル
sudo amazon-linux-extras install docker

2.下記コマンドでDockerサービスを開始します。

ターミナル
sudo service docker start

3.下記コマンドでec2-userdockerグループに追加するとsudoコマンドを使用せずにDockerコマンドを実行できます。

ターミナル
sudo usermod -a -G docker ec2-user

4.一旦EC2インスタンスからログアウト(exit)して再ログインします。
※これをしなくて私はエラーになりましたので大事です。

5.下記コマンドでec2-usersudoコマンドを使用せずに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 -i

2.下記コマンドでcomposeをインストールします。

ターミナル
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

3.下記コマンドで実行権限を付与します。

ターミナル
chmod +x /usr/local/bin/docker-compose

4.exitをして抜けます。

ターミナル
exit

5.下記コマンドでdocker-composeがインストールされているか確認します。

ターミナル
docker-compose --version

下記のようにバージョンが出てくればOKです。

ターミナル
docker-compose version 1.27.4, build 40524192

参考にした先ほどの記事でdocker-compose.ymlのバージョンを書き換えました。

docker-compose.yml
version: "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         ... done

5.下記コマンドでステータスを確認します。

ターミナル
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.rpm

2.下記コマンドで既存のPHPパッケージを削除します。(削除するものがなくても問題ないです)

ターミナル
sudo yum remove php

3.下記コマンドでPHPのパッケージをインストールします。

ターミナル
sudo yum install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt

4.下記コマンドでバージョンを指定してインストールします。
途中で[y/d/N]とインストールしてもいいかの選択が出るのでyを押しEnterで進めます。

ターミナル
sudo amazon-linux-extras install php7.4

5.下記コマンドでその他の必要なパッケージをインストールします。
こちらも途中で[y/d/N]とインストールしてもいいかの選択が出るのでyを押しEnterで進めます。

ターミナル
sudo yum install --enablerepo=remi,amzn2extra-php7.4 php-xml php-mbstring

6.下記コマンドで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.4

7.無事に成功すれば下記コマンドでバージョンが表示されます。

ターミナル
php --version

MariaDBのインストール

コマンドは全てEC2インスタンス内で行います。

1.下記コマンドでMariaDBのインストールをします。

ターミナル
sudo yum -y install mysql56-server mysql56-devel mysql56 mariadb-server mysql-devel

2.下記コマンドでデータベースを起動します。

ターミナル
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 bash

2.下記コマンドで.envファイルを作成します。
.envファイルはgitリポジトリにpushされないためです。

ターミナル
cp .env.example .env

3.下記コマンドでcomposerをインストールします。

ターミナル
composer install

4.下記コマンドでAPP_KEYを発行します。

ターミナル
php artisan key:generate

5.下記コマンドで権限を変更します。

ターミナル
chmod 777 storage/logs vendor
chmod 777 storage/framework/views
chmod 777 storage/framework/sessions

6.画像投稿がある場合は下記コマンドも必要みたいです。

ターミナル
php artisan storage:link
chown -R www-data:root .

7.下記コマンドでマイグレーションを実行します。

ターミナル
php artisan migrate
php aritsan db:seed

以上で無事にデプロイ ができました。

ただ、現在S3への画像の保存ができない状態なので解決出来次第修正致します。

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

Docker,CircleCI,AWS,Railsでポートフォリオを作成

前書き

就職活動用のポートフォリオをDocker,CircleCI,AWS(ECS)を用いてWebアプリケーションを作成しました。
バックエンドにRuby on Railsを用いました。
今回は作成したポートフォリオの機能、参考記事などを紹介したいと思います。

概要と作成背景

今回作成したアプリはスイーツのデリバリーに特化したECサイトです。

  • ケーキ屋のアルバイト経験からお店の業務改善をしたい
  • 手軽にお店のスイーツを食べたい
  • 店舗で販売しているようなスイーツを配達するサービスが存在しない(自分調べ)

上記の理由により飲食店にもユーザーにもメリットのあるサービスを作成しようと思いました。

アプリのURL: http://sweetsdeli.com

GitHubのURL: https://github.com/sekine617/sweetsdeli

画面イメージ紹介

トップページ

新着商品、人気商品などを表示
人気商品はユーザーの購入履歴から購入数が多い商品を表示しています。
スクリーンショット 2021-02-19 15.07.58.png

商品一覧ページ

こちらではカテゴリー検索、商品名検索などができます。
スクリーンショット 2021-02-19 15.27.36.png

商品詳細ページ

こちらでは商品をカートに入れる、お気に入り登録、商品のレビュー投稿などができます。
スクリーンショット 2021-02-19 15.27.58.png

マイページ

マイページではプロフィール編集、お気に入り、購入履歴、投稿したレビューを閲覧できます。

スクリーンショット 2021-02-19 15.21.47.png

スクリーンショット 2021-02-19 15.25.44.png

スクリーンショット 2021-02-19 15.25.57.png

スクリーンショット 2021-02-19 15.30.25.png

ショッピングカート

こちらではカートに入れた商品の確認、個数の変更、カートから削除などができます。
スクリーンショット 2021-02-19 15.29.35.png

購入画面

カートに入れた商品から合計金額を確認し、クレジットカードによる決済が可能です。実際に決済する場合はpay.jpのてすとカードを使用してください。
スクリーンショット 2021-02-19 15.30.02.png
このようにカード情報の入力フォームがモーダルウィンドウで出てきます。
スクリーンショット 2021-02-19 15.46.47.png

使用言語

  • フロントエンド
    • 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)

インフラ構成図

スクリーンショット 2021-02-19 18.41.03.png

開発環境

機能一覧

  • ユーザー関連(devise)
    • 登録機能
    • プロフィール編集機能
    • ログイン・ログアウト機能
  • 決済機能(PAY.JP API)
  • 人気商品表示機能
  • タグ機能
  • 商品登録機能
  • 画像アップロード機能(AWS S3バケット, carrierwave)
  • お気に入り機能(非同期処理, jQuery)
  • フラッシュメッセージ表示機能
  • レビュー投稿機能
  • カート関連
    • カート登録機能
    • カート編集機能
  • 住所自動入力機能(jQuery)
  • 商品名検索機能
  • カテゴリー検索機能
  • ページネーション機能(kaminari)

データベース設計

スクリーンショット 2021-02-19 21.28.45.png

テーブル説明

テーブル名 説明
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】ログイン機能を実装する

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