nginxのイメージをECRのリポジトリに登録してECSでデプロイするまで
最近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
後始末
$ 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でデプロイするまで
クラスタ作成
タスク作成
タスクの実行
まとめ
後で見返してわかるか不安になっていたら、とてもわかり易いブログを見つけてしまったという落ち。 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
とすることで、MySQLのIPアドレスを指定する手間がなくなるらしい。
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/
にアクセスすると・・・
おなじみのYay! You’re on Rails!
をDocker Composeを用いて表示できた!!
補足
# コンテナ内のrails環境下にアクセスする $ docker-compose exec web /bin/bash
まとめ
ついにRails環境をDocker Composeを用いて、構築できた。
今回も以下の動画を参考にした。(ありがとうございました)
sinatraの開発環境をDockerfileを使って構築する。
今回も前回に引き続き、dockerで環境構築の学習を記しておく。 今回は主にDockerfileの作成手順についてフォーカスする。
前回、かなり適当に追記して動かしていたが、どうやら
コンテナの中に入る→作業する→うまくいってからDockerfileに記載
の手順を踏んだほうが良いらしいので、それに従って作業していくこととした。
目的
$ 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
をインストールする。
sinatra
はrails
より軽いフレームワークらしい。(へぇ〜)
# 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
よしよし。
Dockerfileを書き換える(追加する)
うまく動いたので、さっき実行したコマンドをDockerfileに記載する。
CMD
もapp.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
やはり表示できた。
まとめ
今回は、それほど詰まらなくてよかった!! 以下の動画に今回もお世話になりました。ありがとうございました。
ディレクトリ構成
. ├── 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、Python、SQLとか頑張りたいなと思っている傍ら、Web系にも興味があるので、WEBアプリケーションとかも作ってみたいな〜と思っていたりします。
構想としては、
- Docker
- MySQL
- Ruby on Rails
- HTML, CSS
- JavaScript
- React.js
- AWS
-
- EC2
- ECR
- ECS
- RDS
- S3
- Route53
- Terraform
これぐらい使って、作ってみ公開まで持っていきたいな〜と。
(一体僕は何を目指しているのだろうか。。。笑)
PS (7/5現在).
とりあえず、出来合いかつ作成中のものですが、ひとまず、上げておきます。
http://13.231.129.182:3000/todos
仕事で進捗死んでますが、進捗次第、更新して行く予定です。