いけすの技術メモ

趣味開発etc.用の自己満ブログです

MENU

nginxのイメージをECRのリポジトリに登録してECSでデプロイするまで

f:id:IKDrocket:20210624003528p:plain

最近ECR、ECSまわりを触るようになったので、その流れを書き留めておく。

はじめに

ディレクトリ構成

nginx/
├── Dockerfile
└── content
    └── index.html

Dockerfile

FROM nginx

COPY content /usr/share/nginx/html

index.html

<!DOCTYPE HTML>
<html lang=”ja”>

<head>
    <title>Hello, World</title>
</head>

<body>
    <h1>Hello, World</h1>
</body>

</html>

local確認

$ docker run -p 80:80 -d --name nginx0 nginx-ecs

f:id:IKDrocket:20210623225358p:plain

後始末

$ docker stop nginx0
$ docker rm nginx0

ECRに登録するまで

ログイン

$ aws ecr get-login-password --region ap-northeast-1 --profile my_project | \
  docker login --username AWS --password-stdin {account_id}.dkr.ecr.ap-northeast-1.amazonaws.com

リポジトリ作成

$ aws ecr create-repository --repository-name nginx-ecs \ 
  --image-scanning-configuration scanOnPush=true \ 
  --region ap-northeast-1 --profile my_project

タグ付け

$ docker tag nginx-ecs:latest {account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-ecs:latest

プッシュ

docker push {account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-ecs:latest

イメージの存在確認

$ aws ecr list-images --repository-name nginx-ecs --region ap-northeast-1

ECSでデプロイするまで

クラスタ作成

f:id:IKDrocket:20210623231123p:plain

タスク作成

f:id:IKDrocket:20210623231604p:plain

f:id:IKDrocket:20210623231715p:plain

f:id:IKDrocket:20210623231921p:plain

タスクの実行

f:id:IKDrocket:20210624002926p:plain

f:id:IKDrocket:20210623235752p:plain

まとめ

後で見返してわかるか不安になっていたら、とてもわかり易いブログを見つけてしまったという落ち。 kleinblog.net

Docker Composeを用いてRailsの開発環境を構築する

目的

Docker Composeを用いてRailsの開発環境を構築する

Docker Composeとは

複数のコンテナをまとめて操作できる。

 Docker Composeの基本操作

# イメージのビルド
$ docker-compose build

# コンテナの作成と起動(-d でバックグラウンドで実行)
$ docker-compose up -d
 
# コンテナの停止・削除
$ docker-compose down

# コンテナの一覧を表示
$ docker-compose ps 

# ログを表示
$ docker-compose logs

# コマンドを作成してコマンドを実行
$ docker-compose build 

# 起動中のコンテナに対してコマンドを実行
$ docker-compose build

ディレクトリ構成(初期)

.
├── Dockerfile
├── docker-compose.yml
└── src
   └── Gemfile

Dockerfile

RailsではyarnやらNode.jsといったJavaScript関連のライブラリが必要なのでこれらもインストールしておく必要がある。

FROM ruby:3.0

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update -qq \
&& apt-get install -y nodejs yarn
WORKDIR /app
COPY ./src /app
RUN bundle config --local set path 'vendor/bundle' \
&& bundle install

Gemfile

Railsを実行すると書き換わるが、Railsの実行に利用したいので以下のように記載。

source 'https://rubygems.org'

gem 'rails', '~> 6.1.3'

 docker-compose.yml

 db:

データベースにはMySQL8.0を利用。

MySQL8.0からは認証形式の変更でcommand: --default-authentication-plugin=mysql_native_passwordと記載しないとうまく通らないらしい。

volumesでローカルとコンテナ内のディレクトリをマウントできる。

今回は、MySQLのコンテナ内で建ててるので、コンテナを作り直した際にもデータが残るようにvolumesの指定は必須。(ただし、DBはコンテナ内で建てるべきでないという思想を耳にするので、将来的にアプリケーションを作る際にはAWSのRDS等を利用したいところ。)


web:

build: .と記載することでカレントディレクトリ内のDockerfileを参照にするということを表している。

depends_on: - dbとすることで、MySQLIPアドレスを指定する手間がなくなるらしい。

 

version: '3'
services:
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./src/db/mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- ./src:/app
ports:
- "3000:3000"
environment:
RAILS_ENV: development
depends_on:
- db

 

 

初期設定

Railsの雛形を作成する。

$ docker-compose run web rails new . --force --database=mysql

新しくGemfileuが更新されたので、イメージをbuildし直す。

$ docker-compose build

データベースの設定する

src/config/database.ymlを編集する。 default:password:host:docker-compose.ymlで指定した値に変更、追記する。

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

development:
  <<: *default
  database: app_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: app_test

production:
  <<: *default
  database: app_production
  username: app
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>

データベースのを作成する

$ docker-compose run web rails db:create
Creating rails_app_web_run ... done
Created database 'app_development'
Created database 'app_test'

docker を起動する。

$ docker-compose up

http://localhost:3000/にアクセスすると・・・

f:id:IKDrocket:20210322012538p:plain

おなじみのYay! You’re on Rails!をDocker Composeを用いて表示できた!!

補足

# コンテナ内のrails環境下にアクセスする
$ docker-compose exec web /bin/bash

まとめ

ついにRails環境をDocker Composeを用いて、構築できた。
今回も以下の動画を参考にした。(ありがとうございました)

www.youtube.com

sinatraの開発環境をDockerfileを使って構築する。

今回も前回に引き続き、dockerで環境構築の学習を記しておく。 今回は主にDockerfileの作成手順についてフォーカスする。

前回、かなり適当に追記して動かしていたが、どうやら
コンテナの中に入る→作業する→うまくいってからDockerfileに記載
の手順を踏んだほうが良いらしいので、それに従って作業していくこととした。

目的

  • コンテナの中に入る→作業する→うまくいってからDockerfileに記載の手順でDockerfileを作成する
  • rubyフレームワークであるsinatraを用いて、ブラウザでトップページを表示する
$ mkdir sinatra_app
$ cd sinatra_app/
$ mkdir src
$ touch src/Gemfile
$ touch src/app.rb
$ touch Dockerfile

ディレクトリ構成

.
├── Dockerfile
└── src
    ├── Gemfile
    ├── Gemfile.lock ← 後で勝手に生成される
    └── app.rb

Gemfile

今回はGemfileでsinatraをインストールする。 sinatrarailsより軽いフレームワークらしい。(へぇ〜)

# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "sinatra"

Dockerfile

WORKDIRを指定することで中に入ったときのカレントディレクトリを指定できるみたい。 あと、CMD ["/bin/bash"]でコンテナ実行でコンテナ内のbashにアクセスできると。

FROM ruby:3.0

WORKDIR /var/www

COPY ./src /var/www

CMD ["/bin/bash"]

app.rb

前回webrickを使ったスクリプトより簡素で直感的なスクリプトだな〜と思った。

require 'sinatra'

configure do
  set :bind, '0.0.0.0'
end

get '/' do
  'Hello world!'
end

イメージの作成・起動

一通り、ファイルが揃ったので、dockerのイメージを作成してみる。

$ docker image build -t sample/sinatra:latest .

問題なく、作成できた。 では、コンテナを作成・起動!! ポートはsinatraだとデフォルトは4567らしいのでそのまま指定。 今回は、コンテナ内の/var/www/srcをマウントした。 これによって、Gemfileなどを書き換えたときに再びdocker buildでイメージを作成し直さなくてもよくなるらしい。
便利!!
また、-itを追加すると、コンテナの起動と同時にコンテナ内に入れるとのこと。

$ docker container run -it -p 4567:4567 --name sinatra -v ${PWD}/src:/var/www sample/sinatra:latest

これでコンテナの中のbashを起動できた。 ので、bundle installでGemfileの内容をインストール。

root@3922a38386d9:/var/www# bundle config --local set path 'vendor/bundle'
root@3922a38386d9:/var/www# bundle install
Fetching gem metadata from https://rubygems.org/....
Resolving dependencies...
Using bundler 2.2.3
Fetching ruby2_keywords 0.0.4
Fetching rack 2.2.3
Installing ruby2_keywords 0.0.4
Installing rack 2.2.3
Fetching tilt 2.0.10
Installing tilt 2.0.10
Fetching mustermann 1.1.1
Fetching rack-protection 2.1.0
Installing rack-protection 2.1.0
Installing mustermann 1.1.1
Fetching sinatra 2.1.0
Installing sinatra 2.1.0
Bundle complete! 1 Gemfile dependency, 7 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

できたっぽいので、さっそくwebサーバーを起動してみると・・・

root@3922a38386d9: /var/www# bundle exec ruby app.rb
/usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/base.rb:1755:in `detect_rack_handler': Server handler (thin,puma,reel,HTTP,webrick) not found. (RuntimeError)
    from /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/base.rb:1493:in `run!'
    from /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/main.rb:45:in `block in <module:Sinatra>'

は?

となったところで、前回起きたことを連想しながらググってみたところやはりwebrickがruby3.0からデフォルトで入っていないことが原因だった。 sinatraだけでは動かないのね。 ということで、Gemfileにgem "webrick"を追加。 再び、実行してみると、

root@3922a38386d9: /var/www# bundle exec ruby app.rb
[2021-03-21 13:12:08] INFO  WEBrick 1.7.0
[2021-03-21 13:12:08] INFO  ruby 3.0.0 (2020-12-25) [x86_64-linux]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2021-03-21 13:12:08] INFO  WEBrick::HTTPServer#start: pid=70 port=4567
172.17.0.1 - - [21/Mar/2021:13:12:29 +0000] "GET / HTTP/1.1" 200 12 0.0216
172.17.0.1 - - [21/Mar/2021:13:12:29 UTC] "GET / HTTP/1.1" 200 12
- -> /
172.17.0.1 - - [21/Mar/2021:13:12:29 +0000] "GET /favicon.ico HTTP/1.1" 404 469 0.0071
172.17.0.1 - - [21/Mar/2021:13:12:29 UTC] "GET /favicon.ico HTTP/1.1" 404 469
http://localhost:4567/ -> /favicon.ico

f:id:IKDrocket:20210321222706p:plain

よしよし。

Dockerfileを書き換える(追加する)

うまく動いたので、さっき実行したコマンドをDockerfileに記載する。 CMDapp.rbを実行するように書き換える。

FROM ruby:3.0

WORKDIR /var/www
COPY ./src /var/www

# 追加
RUN bundle config --local set path 'vendor/bundle'\
    && bundle install

# 追加
CMD ["bundle", "exec", "ruby", "app.rb"]

# 削除
#CMD ["/bin/bash"]

ということで、一度コンテナから抜けて、イメージを作り直す。

root@3922a38386d9:/var/www# exit
exit

$ docker rm sinatra
sinatra

$ docker image build -t sample/sinatra:latest .
[+] Building 9.2s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                                                             0.1s
 => => transferring dockerfile: 231B                                                                                                                                                                                                                                                                             0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                                                                0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                                                                  0.0s
 => [internal] load metadata for docker.io/library/ruby:3.0                                                                                                                                                                                                                                                      0.0s
 => [internal] load build context                                                                                                                                                                                                                                                                                0.0s
 => => transferring context: 121B                                                                                                                                                                                                                                                                                0.0s
 => [1/4] FROM docker.io/library/ruby:3.0                                                                                                                                                                                                                                                                        0.0s
 => CACHED [2/4] WORKDIR /var/www                                                                                                                                                                                                                                                                                0.0s
 => CACHED [3/4] COPY ./src /var/www                                                                                                                                                                                                                                                                             0.0s
 => [4/4] RUN bundle config --local set path 'vendor/bundle'    && bundle install                                                                                                                                                                                                                                8.3s
 => exporting to image                                                                                                                                                                                                                                                                                           0.4s
 => => exporting layers                                                                                                                                                                                                                                                                                          0.4s
 => => writing image sha256:459c4bd2f174ea1f7837279ec43165b9ed83e3a47502cda1910cfa1dedc33266                                                                                                                                                                                                                     0.0s
 => => naming to docker.io/sample/sinatra:latest                                                                                                                                                                                                                                                                 0.0s

そして再び、コンテナ作成・起動!!
今回はコンテナに入る必要はないので、-itは不要。

$ docker container run -p 4567:4567 --name sinatra -v ${PWD}/src:/var/www sample/sinatra:latest
[2021-03-21 13:56:15] INFO  WEBrick 1.7.0
[2021-03-21 13:56:15] INFO  ruby 3.0.0 (2020-12-25) [x86_64-linux]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2021-03-21 13:56:15] INFO  WEBrick::HTTPServer#start: pid=1 port=4567

やはり表示できた。 f:id:IKDrocket:20210321222706p:plain

まとめ

今回は、それほど詰まらなくてよかった!! 以下の動画に今回もお世話になりました。ありがとうございました。

www.youtube.com

ディレクトリ構成

.
├── Dockerfile
└── src
    ├── Gemfile
    ├── Gemfile.lock
    └── app.rb

Gemfile

# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "webrick"
gem "sinatra"

Dockerfile

FROM ruby:3.0

WORKDIR /var/www
COPY ./src /var/www

RUN bundle config --local set path 'vendor/bundle'\
    && bundle install

CMD ["bundle", "exec", "ruby", "app.rb"]

app.rb

require 'sinatra'

configure do
  set :bind, '0.0.0.0'
end

get '/' do
  'Hello world!'
end

DockerでWebサーバーのアプリケーションを動かしてみる

webアプリケーションの作成にあたって、dockerの勉強をしたくなったので、かんたんな使い方を学んでみた。
基本的には以下のyoutubeの内容を参考にさせてもらった。(ありがたい) www.youtube.com

前提

dockerのインストール等は完了している。

目的

DockerでWebサーバーを建てて、ブラウザでトップページを閲覧する。

ディレクトリ構成

今回のディレクトリ構成は以下のようなシンプルなものになる。 ※後ほど、これでは駄目なことが発覚。

.
├── Dockerfile
└── main.rb

Dockerfile

動画ではrubyは2.7だが、ここでは3.0にしてみた。(これがちょっとしたトラブルの始まり)

FROM ruby:3.0.0

RUN mkdir /var/www
COPY main.rb /var/www

CMD ["ruby", "/var/www/main.rb"]

main.rb

これを実行すれば、webサーバーが建つ。

require 'webrick'

server = WEBrick::HTTPServer.new(
  DocumentRoot: './',
  BindAddres: '0.0.0.0',
  Port: 8000
)

server.mount_proc('/') do |req, res|
  res.body = 'hello'
end

server.start

イメージの作成・起動

ビルドする。

$ docker image build -t sample/webrick:latest .

イメージ作成完了。

$ docker images
REPOSITORY                       TAG           IMAGE ID       CREATED         SIZE
sample/webrick                   latest        830ecfb45407   2 minutes ago   850MB

コンテナを作成する。

$ docker container run -p 8000:8000 --name webrick sample/webrick:latest
<internal:/usr/local/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- webrick (LoadError)
    from <internal:/usr/local/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /var/www/main.rb:1:in `<main>'

なぬ。。。

色々ググってみるとWEBrickは標準ライブラリから削除された(gemとして引き続き利用可能)らしい。 www.ruby-lang.org

とりあえずは動画の通りにポチポチしていけばいいのに変にrubyのバージョンだけアレンジするからこうなる。。。

とはいえ、gem installすれば使えると。 多分、Dockerfileにgem install webrickとベタ書きしても動くのだろうが、なんとなくGemfileでライブラリを管理したかったので、gem install bundlerしてからのbundle installとすることにした。 よって、Gemfileを追加し、Dockerfileを以下のように変更。

Gemfile

source 'https://rubygems.org'
gem 'webrick'

Dockerfile

FROM ruby:3.0

RUN mkdir /var/www
COPY main.rb /var/www

# 追加
COPY Gemfile .

# 追加
RUN gem update \
    && gem install bundler \
    && bundle install

CMD ["ruby", "/var/www/main.rb"]

そして、再びイメージ作成。

$ docker image build -t sample/webrick:latest .
[+] Building 48.0s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                                                                             0.1s
 => => transferring dockerfile: 217B                                                                                                                                                                                                                                                                             0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                                                                                0.0s
 => => transferring context: 2B                                                                                                                                                                                                                                                                                  0.0s
 => [internal] load metadata for docker.io/library/ruby:3.0                                                                                                                                                                                                                                                      0.0s
 => [1/5] FROM docker.io/library/ruby:3.0                                                                                                                                                                                                                                                                        0.0s
 => [internal] load build context                                                                                                                                                                                                                                                                                0.0s
 => => transferring context: 104B                                                                                                                                                                                                                                                                                0.0s
 => CACHED [2/5] RUN mkdir /var/www                                                                                                                                                                                                                                                                              0.0s
 => CACHED [3/5] COPY main.rb /var/www                                                                                                                                                                                                                                                                           0.0s
 => [4/5] COPY Gemfile .                                                                                                                                                                                                                                                                                         0.1s
 => [5/5] RUN gem update     && gem install bundler     && bundle install                                                                                                                                                                                                                                       46.5s
 => exporting to image                                                                                                                                                                                                                                                                                           1.1s
 => => exporting layers                                                                                                                                                                                                                                                                                          1.1s
 => => writing image sha256:5a03aa6c25c3901829dd9910d1c928b9dc0c9b1072443c40463679c43fc00648                                                                                                                                                                                                                     0.0s
 => => naming to docker.io/sample/webrick:latest

よさげ。 確認してみたら、イメージができていた。

$ docker image ls
REPOSITORY                       TAG           IMAGE ID       CREATED          SIZE
sample/webrick                   latest        5a03aa6c25c3   16 minutes ago   912MB

では、コンテナの作成、起動してみる。

$ docker container run -p 8000:8000 --name webrick sample/webrick:latest
[2021-03-21 10:02:46] INFO  WEBrick 1.7.0
[2021-03-21 10:02:46] INFO  ruby 3.0.0 (2020-12-25) [x86_64-linux]
[2021-03-21 10:02:46] INFO  WEBrick::HTTPServer#start: pid=1 port=8000

ブラウザでhttp://localhost:8000/に接続してみると・・・

無事、表示できた!!

その他のコマンド

# コンテナの起動
$ docker container start webrick

# 実行中のコンテナのログを確認する
$ docker container logs webrick

# コンテナの停止
$ docker container stop webrick

# コンテナの削除
$ docker container rm webrick

# イメージの削除
$ docker container rmi sample/webrick

まとめ

結局、ディレクトリ構成とファイルの内容は以下のようになった。
とりあえず動画の内容だけじゃなく、自分で、調べながら解決できてよかった。

.
├── Dockerfile
├── Gemfile
└── main.rb

Dockerfile

FROM ruby:3.0

RUN mkdir /var/www
COPY main.rb /var/www

# 追加
COPY Gemfile .

# 追加
RUN gem update \
    && gem install bundler \
    && bundle install

CMD ["ruby", "/var/www/main.rb"]

Gemfile

source 'https://rubygems.org'
gem 'webrick'

main.rb

require 'webrick'

server = WEBrick::HTTPServer.new(
  DocumentRoot: './',
  BindAddres: '0.0.0.0',
  Port: 8000
)

server.mount_proc('/') do |req, res|
  res.body = 'hello'
end

server.start

このブログについて

こんにちは。いけすです。

今年で27歳になるデータアナリストです。

 

普段はデータの集計などを主にやってます。

主にSQLでやってます。(最近はBigQueryも使います)

 

2021年5月より副業(エンジニア)を始めさせて頂きました。

 

残業等で死んでない日とかはぼちぼちプログラミングの勉強とかをやってたりします。

 

このブログでは、そのぼちぼちプログラミング学習等で学んだことを気まぐれで書いたり書かなかったりしていく予定です。(いや、書けよ)

 

内容はほぼ自分の備忘録です。

 

なんか、本業の分析系で使えそうなR、PythonSQLとか頑張りたいなと思っている傍ら、Web系にも興味があるので、WEBアプリケーションとかも作ってみたいな〜と思っていたりします。

 

構想としては、

これぐらい使って、作ってみ公開まで持っていきたいな〜と。

(一体僕は何を目指しているのだろうか。。。笑) 

 

PS (7/5現在).

 

とりあえず、出来合いかつ作成中のものですが、ひとまず、上げておきます。

http://13.231.129.182:3000/todos

 

 仕事で進捗死んでますが、進捗次第、更新して行く予定です。

rails APIはEC2、reactのFront側はECSで仮デプロイしてます。