【技術書要約】TCP/IPの絵本を3分で理解する
実現したいこと
TCP/IPの絵本という本を読みました.
内容が深いところまでは入っていかないですが,概念的な理解には十分で,とてもいい本だったので,少しでも興味がある人が読んでいただけるように,簡単に要約しました.
やったこと
以下,各目次ごとのポイントを,質疑応答形式でまとめました
TCP/IPの勉強をはじめる前に
プロトコルとは?
LANとWANの違いを説明すると?
- LANはLocal Area Networkで,WANはWide Area Network.WANは,会社の支店間など,インターネットほどつながっていないが光ファイバーなどでつながっている中間規模のネットワーク
イントラネットとは?
- インターネットを使った地域限定版のLANのこと
TCP/IPの概要
TCP/IPとは?
- ネットワーク疎通を確認する通信プロトコル?
- データの送受信に関わる,信号への変換=>伝達=>データの再変換という一連の手続きをまとめたもの.
- Transmission Control Protocol
- パケット通信はTCP/IPの特徴
TCP/IPの構造はどうなっている?
- 4つの層があって,ネットワーク層,インターネット層,アプリケーション層とかだっけ?
- ユーザー側から,アプリケーション層,トランスポート層,ネットワーク層,データリンク層,物理層の5つの層がある.物理層はコンピュータ側.物理層とデータリンク層は合わせて呼ぶこともある
データの後ろに付加する情報をなんと言う?
- トレーラ
通信サービスとプロトコル
URLってなんの略?
- Uniform Resource Locator
メールサーバーの仕組みを2つのプロトコルを用いて説明すると?
- SMTP(Simple Mail Transfer Protocol)が送信者からメールサーバーへの送信,メールサーバーAからBへの送信を行う.メールサーバーBからPOP(Post Office Protocol)でメールを取得し,受信を完了する
ファイル転送の仕組みをプロトコルを使用して説明すると?
- FTP(File Transfer Protocol)によって一時的にサーバーにファイルがアップロードされ,通信を許可されたクライアントがダウンロードできる仕組み
遠隔ログインのクライアントを挙げると?
- Telnetクライアント(TELNETプロトコルで通信)と,Tera Term
- リモートデスクトップは,RDP(Remote Desktop Protocol)を使用
TelnetとSSLの違いは?
- Telnetはコマンドをそのまま流すので,通信の内容が筒抜けになる
IMとは?
- インスタントメッセンジャーのこと.LINEやSkypeなどのように,常に他のクライアントの状態をチェックしており,リアルタイムで通信できるサービスのこと
アプリケーション層
アプリケーション層の役割は?
- 実際の処理をするところ?
- アプリケーションでデータを扱えるように加工,表示,再生する層
- HTTP,POP3,FTPなどはこの層
アプリケーションヘッダにはどんな情報が入っている?
ヘッダとボディはどうやって分ける?
- 空行を入れると,その下はボディ.GETメソッドの場合はボディは空になる
HTTPのように,1回の要求と応答で完結する通信のことをなんと言う?
- ステートレスプロトコル
クッキーはなぜ必要?
- ステートレスでない場合,前回の通信の続きということを証明するため
クッキーはどうやって埋め込む?
クッキーはどこにどれだけの期間保存される?
- クライアント側のブラウザに保存され,基本はブラウザを閉じたら削除される
SSL/TLSとは?
- SSLはセキュアな通信のこと?TLSは全くわからない.セキュアな通信だけど公開暗号鍵方式を使っていないとか?
- Secure Sockets LayerとTransport Layer Securityのことで,インターネット上のデータ通信を暗号化するためのプロトコル.SSLを標準化したものがTLS.
SSL/TLSの仕組みを流れで説明できる?
- wwwサーバーがロック専用の公開鍵と秘密鍵を作成
- CA(認証局)が共通鍵を作成
- CAは共通鍵でデータを暗号化する.データと共通鍵を安全にわたすため.それを公開鍵で暗号化する
- wwwサーバーが秘密鍵で共通鍵と暗号化されたデータを取り出す.これにより.共通鍵が暗号化されて渡された.
- 以後,クライアントとwwwサーバーは共通鍵を使って暗号化・復号を行う
SMTPプロトコルとは?
- 全くわからん.電子メール系のプロトコル?
- Simple Mail Transfer Protocol だったはず.
SMTPの手順は?
- コマンドはアルファベット4文字.レスポンスは3桁の数字らしい
- 通信確立=>220 => HELO => 250 => MAIL FROM<~.jp> => 250 => RCPT TO <~.jp> => 250 => DATA => 354 => メッセージ => 250 => QUIT => 221 => 通信切断という手順
POPプロトコルとは?
POPの手順は?
- コマンドはアルファベット4文字.レスポンスは+OKか-ERRのいずれか
- 通信確認,ユーザー認証=>メールボックスの状態確認=>メールを取り込む=>通信の切断という感じ
エンコード・デコードとは?
MIMEとは?
- これもまったくわからん.なんやろ.処理のこと?
- 本来,メールの件名は英数のみ,本文はテキストのみだが,それを日本語や画像に対応させる仕組みのこと
- 日本語や画像などをUS-ASCIIの文字列にエンコードし,デコードするときに必要な情報をヘッダーに加える
- BASE64という方式が有名
トランスポート層
トランスポート層の役割は?
- これはなんだ?通信を疎通させる役割?
- 送信されたデータを確実に受信側のアプリケーションに届ける層.
- パケット分割はこの層の役割.どのポートがどのサービスにつながっているかを判断して振り分けるのもここ
- TCP,UDPはこの層
UDPとは?またどこで使われる?
問題があったときの処理はどうなる?
- TCP/IPなら,そのパケット自体をキャンセルする.DBならトランズアクションはってループバックする?
- TCPの場合,通信をやり直したり,再送してだめなら切断する信号を送ったりする
- UDPの場合,何もしない
TCPヘッダの中身を12個挙げるとしたら?
チェックサムとは?
- データが無事か判断するヘッダ要素
オプションとは?
- TCPの機能を拡張するときに使用する
通信状況を調べるコマンドは?
ネットワーク層
ネットワーク層の役割は?
- インターネットとつながる層なのか?
- 受信側のコンピュータまでデータを届ける層.データが壊れていたり,受信失敗していたりは感知しない
- IP(Internet Protocol)がこの層
- IPしかプロトコルがないので,通信手段の違いを吸収できる
IPの通信の確実性を担保する機能は何か?
- ネットワーク層はセキュリティが問題?
- IPはコネクションレス型のベストエフォート方式なのでUDPと同じ.ICMP(Internet Control Message Protocol)はIPが直接送信するのではなく,IPのヘッダをつけたIPデータグラムというものに変換してから送信するので,失敗したら送信元に知らせることができる
IPv4のビット数は何列で,どういう意味がある?
相手のPCの接続状況を調べるコマンドは?
自分のPCの接続状況を調べるコマンドは?
- ifconfig
宛先までの経路を調べるコマンドは?
- tracert
DHCPとは?
- Dynamic Host Configuration Protocolで,必要なときだけ自動的にIPを振るプロトコル
ブロードキャストアドレスとは?
- 255.255.255.255で,LAN内のすべての機器に送信する特殊なアドレス
- 送信時は,0.0.0.0だが,DHCPサーバーが反応することで,アドレスが振り分けられる
NATとNAPTの違いは?
- Network Adress Translationは,PIP=>GIPとして振り分けるのでGIPの数だけインターネットにつなげるが,Network Adress Port Translation(IPマスカレードとも言う)は,同じGIPを使用してポートによってPIPを区別するから,何台でも同時につなげる
DNSはなんの略?
- Domain Name System
データリンク層と物理層
データリンク層の役割とは?
- データリンクというくらいだから,データの入出力をする層?
- データとビット列をそれぞれに変換する層
- EthernetやPPPなどがこの層
データリンク層と物理層の関係は?
データリンクとは?
- 機器同士が同一の方法でつながったひとかたまりのこと
NICとは?
- Network Interface Cardで,LANカードやネットワークアダプタとも言う.コンピュータからネットワークに接続するときの玄関口
MACアドレスとは?
- IPアドレスみたいなやつだが,表記がピリオド区切り?
- Media Access Controlアドレスで,データリンク層内の個体識別番号.ネットワークまでいくとIPだが,その中で機器を特定する
- データリンク内ではIPではなくMACアドレスがわかっていないと通信できない
- 8ビット×6列で示す
MACアドレスを調べる方法は?
- わからない.ls -llとか?
- ARP(Address Resolution Protocol)
トークンリングとは?
PPPとPPPoEとは?
- わからん.personal private portてきな?
- Point-to-Point Protocol は2点間で1対1の通信を行う.ユーザー認証付きだから,MACアドレスは使わない
- PPP over Ethernet はイーサネット上にある2台のPC間の認証
ブリッジとは?
- データリンク間をつなぐ機器.宛先MACアドレスが流れてきたのと別のデータリンクであるときのみ送り出す
ルーティング
経路の決めかたを簡単に説明すると?
- DNSが決めるっていう話?
- IGP(Interior Gateway Protocol)とEGP(Exterior Gateway Protocol)の2種類があって,ルーティングテーブルを見ながら最適な経路を静的,もしくは動的に決定する
tracertコマンドとは?
- 通信経路を確認するコマンド
セキュリティ
付録
OSI参照モデルとは?
- OSのインターフェースの規格を決めるの?
- 基本的にはTCP/IPの親戚.アプリケーション層が更に3層に分かれているだけ
注意点
参考
以下の記事を参考にさせていただきました.
TCP/IPの絵本 第2版 ネットワークを学ぶ新しい9つの扉
- 作者: 株式会社アンク
- 出版社/メーカー: 翔泳社
- 発売日: 2018/07/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.
【技術書要約】nginx実践入門のポイントを3分で押さえる
実現したいこと
nginx実践入門を読みました.
ポイントを3分で押さえられる程度にまとめました. とても良い本だったので,これをきっかけに読者が増えれば嬉しいです
やったこと
以下に各目次と簡単な要点をまとめました. ご参考にしていただければ.
nginxの概要とアーキテクチャ
nginxの用途を2つ挙げるなら?
- 静的ページを返す
- リバースプロキシとして使う
リバースプロキシとは?
- クライアントとアプリケーションサーバーの中間をつなぐサーバーのこと
Apacheとのモデルの違いは?
- ApacheはMPM(Multi Processing Module)を採用おり,prefork, worker, eventなどの複数の動作モデルを使用できるのに対し,nginxはイベント駆動のみ
Apacheとの拡張性の違いは?
- Apacheは拡張モジュール単体でビルドできるのに対し,nginxは本体のビルド時にしか拡張モジュールを組み込めない
Apacheとnginxのプロセスの違いは?
- Apacheは,preforkモデルの場合,クライアントごとにプロセスを起動し,一連の処理を並行して行うのに対し,nginxは発生したイベント毎に並行して処理していく
イベント駆動とは?
- 各イベントに対応したコールバック関数のみが実行される仕組み
I/O処理の効率化手法を3つ挙げるなら?
- I/O Multiplexing
- ノンブロッキングI/O
- 非同期I/O
I/O Muitiplexingとは?
- 複数のファイルディスクリプタを監視し,それらのどれかが使用可能になるまでプログラムを待機させること
ブロッキングi/Oとは?
ノンブロッキングI/Oとは?
非同期I/Oとは?
- ノンブロッキングI/Oと同じだが,先にエラーや完了をプログラムに通知するためのインターフェースがある
Nginxのプロセス構成は?
- マスタプロセスが一つと,ワーカープロセスが複数ある
- マスタプロセスが起動や設定を管理するので,マスタプロセスに対して特定のシグナルを送ると全体のプロセスを制御できる
インストールと起動
基本設定
設定ファイル名とその確認方法は?
- nginx.confで,確認コマンドは
$ nginx -V
ディレクティブとは?
- 設定ファイルの各項目のこと
ディレクティブの種類は?
- ;で終わるシンプルなディレクティブと,
ブロックディレクティブがある
コンテキストとは?
- ブロック内のディレクティブのこと
バーチャルサーバーとは?
- Serverブロックディレクティブで囲んだサーバーで,IP,ポート,ホスト名毎に設定できる
Rootディレクティブのデフォルト値は?
- html
MIMEタイプとは?
- Content-typeヘッダフィールドに指定されるファイルの種類と拡張子のこと.image/pngとか
ルーティングの仕組みを具体的に説明すると?
- http://www.example.com/images/example.pngにリクエストが送られてきたとき, server_name: www.example.com で,URIによる絶対パスが/images~.pngである.
root: /var/www/htmlだった場合は,/var/~/.pngにルーティングされる.listenしているポートが80以外に明示されていれば,そのポートからつながる
静的なWebサイトの構築
locationディレクティブとは?
Dos攻撃対策となるディレクティブは?
- limit_conn_zoneディレクティブで特定のIPなどから同時にコネクションする数を制限できる.
ngx_http_limit_req_moduleで時間あたりのリクエスト数を制限できる
leaky bucketアルゴリズムを説明できる?
- 10r/sで1秒に10リクエストまで許容しており,burst=50で入り切らなかった分は50までキューイングし,それでも超えたら503を返す
安全かつ高速なHTTPサーバーの構築
HTTPSとはどのレイヤーで暗号化されている?
- TLS(Transport Layer Security)
TLSを実現するために使用しているライブラリは?
- OpenSSL
暗号化スイートとは?
PFSとは?
- Perfect Forward Secrecyの略で,ある期間の鍵が盗まれたとしてもその一定期間の通信しか複合できないようにする仕組み
HSTSとは?
Webアプリケーションサーバーの構築
リバースプロキシの主な2つの役割とは?
- フロントサーバーとしてのリバースプロキシ
- アプリケーションサーバーにおけるリバースプロキシ
フロントサーバーとしてのリバースプロキシの役割を3つ挙げるなら?
Webアプリケーションサーバーにおけるリバースプロキシの役割を6つ挙げるなら?
- 静的ファイルの配信
- リクエストの書き換え
- Route53もここは担える?
- アクセス制限,不正なリクエストのフィルタリング
- gzip圧縮転送
- リクエストのロギング
- リクエストとレスポンスのバッファリング
Railsに適したサーバープロセスとその理由は?
- Unicornで,Rackインターフェースを持っているから
Unicornの弱点は?
- forkを用いたマルチプロセスにはなっているが,イベント駆動型でないため,プロセス数以上のリクエストを処理できない
RailsにUnicornを入れるためのgemは?
- unicornをそのまま.foremanもプロセス管理が楽になるから良い.
nginxでプロキシするときに,ユーザーリクエストのホスト情報をいれるためにはどうする?
- proxy_set_headerディレクティブで指定する
大規模コンテンツ配信サーバーの構築
ロードバランサの種類を2つ挙げるなら?
- TCPレベルで分散するL4ロードバランサ
- HTTPレベルで分散するL7ロードバランサ
L4ロードバランサの方式を2種類挙げるなら?
- NAT(Network Adress Translation:ネットワークアドレス変換)方式
- DSR(DIrect Server Return)方式
NAT方式を簡単に説明すると?
DSR方式を簡単に説明すると?
- アップストリームからの帰りのパケット(行きよりサイズが大きい)はロードバランサを経由しないため,トラフィックを削減できる
L7ロードバランサを簡単に説明すると?
- HTTPリクエストを解釈し,同じリクエストをアップストリームサーバーに送信するため,コンテンツの種類や内容に応じてカスタマイズ可能.
- HTTPをプロキシするため,DSR方式は使用できないが,ディスクI/OやCPUといったハードウェアの負荷削減には有効
DNSを使ってロードバランスする仕組みをなんと言う?また簡単に説明すると?
DNSラウンドロビンの弱点は?
- TTL(Time To Live パケット有効期間)の関係で,障害発生時にキャッシュのTTLが切れるまでHTTPサーバーを切り離せない
- RFC3484では,ネットワークが近いアドレスを優先的につなぐため,ネットワークがまたがるとアドレスに偏りが出る
Webサーバの運用とメトリクスモニタリング
Luaによるnginxの拡張
OpenResty
注意点
後半は個人的にまだ必要でなかったので,ほとんど流しています.
参考
以下の記事を参考にさせていただきました.
- 作者: 久保達彦,道井俊介
- 出版社/メーカー: 技術評論社
- 発売日: 2016/01/16
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (5件) を見る
http://ecogis.sfc.keio.ac.jp/online/java/2002/9th/basic.htm
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.
【AWSを知る】AWSを使ってネットワーク構成を勉強する その1
実現したいこと
今回は,「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」を使ってネットワークの勉強をしたいと思います.
Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版
やったこと
まず,この本から学ぶことをリストアップします.今回はネットワークについて技術的な観点からしっかり学びたいということもあって,だいたい以下の問いに答えられるようになることを目指します.
システム構築をインフラから始めるには
開発者がネットワークやサーバーを構築するメリットは?
サーバーの構成は大体どんな感じか?
ネットワークの構築はイメージできるか?
ネットワークを構築する
サーバーを構築する
パブリックIPを固定するには?
鍵ファイルのパーミッションはどうすればいいか?
webサーバーソフトをインストールする
HTTPの動きを確認する
プライベートサブネットを構築する
NATを構築する
DBを用いたブログシステムの構築
TCP/IPによる通信の仕組みを理解する
パケットキャプチャで通信をのぞいてみる
ネットワークの管理、運用とトラブルシューティング
ネットワークを管理する意義は?
ネットワーク構成を把握するコツは?
Pingの目的,使い方は?
tracerouteの目的,使い方は?
TCP到達性の確認方法は?
Nslookupコマンドやdigコマンドの目的と使い方は?
zabbixとは?
New Relicとは?
cloudwatch を使うときの注意点は?
さて,もちろんすべてをここに残すわけではないですが,実況中継的にどんどん進めていきましょー.
まず,
開発者がネットワークやサーバーを構築するメリットは?
これは,ざっくり言うと,障害対策に強くなる.システム全体について考えて構成を作ることができる点ですね.全体観はエンジニアリングの基本かと思われます.
サーバーの構成は大体どんな感じか?
これはわりとどこにでも載っている話なので,簡単にまとめておきます. サーバーは,リクエストを送ったら何かしらの処理をしてレスポンスを返してくれるものなわけですが,技術的には,OSの上に目的のソフトウェアをいれたものとなりますね.ここもさらっと.
ネットワークの構築はイメージできるか?
これまたどこにでも勉強できるソースはあるので,割愛します.たとえば以下のリンクにはわかりやすくまとまっているかも
https://hesonogoma.com/visio/networkdiagram.html
ざっくり要点を押さえると, - 各サーバーはプライベートIPアドレスを持っている - ルーターにパブリックIPアドレスが振られて,ネットワークにアクセスできる - IPアドレスには,ドメインと紐付けることで名前でアクセスできる - DNSサーバーがドメインを管理している. こんなところでしょうか.
パブリックIPを固定するには?
プロバイダやルーターを固定すればできますね.
パブリックIPを管理しているのはICANNという団体だそうです.そこから地域ごとに支社のようなものがあり,日本では,JPNICが統括をしているとのこと.IPv4は今枯渇していて問題になっており,IPv6に移行する流れはあるものの,互換の都合上まだまだ先の話になりそう.
そこで出てきた概念がNAT(Network Adress Transaction)で,これは,一つのIPアドレスを複数のエンドユーザーで共有しよう!というものです.
VPCを作ってみる
さて,ざっくり概念を学んだところで,VPCくらいは作ってみましょう.
AWSのVPC作成画面から,東京リージョンでVPCを作成してみます.
ここでは,CIDRブロックは10.0.0.0/16で切ります.8進数なので10.0までがホストで,下2桁の0.0はネットワーク部ですね.
サブネットを作成する
VPCはさらに小さな単位,サブネットに分割できます. - 障害が起きたとき,影響範囲を最小限にできる - セキュリティを分割できる という理由で,サブネットに細かく分割することには意味があります.
今回は,パブリックサブネットとプライベートサブネットを作成します.ともにCIDRブロックは,10.0.1.0/24と,10.0.2.0/24のように,.1と.2で分割します.
パブリックサブネットをインターネットにつなぐには,インターネットゲートウェイを使用します. 基本はデフォルトで作成されるので問題なし.
TCP/IPとは?
インターネット通信のプロトコル(規約みたいなもの)で,パケットという単位でヘッダー情報(送信元IP, 送信先IP, その他のヘッダー)と,データに分割されます.
このパケットを適切なIPに振り分けるのがルーターで,デスティネーション(送信先IPアドレス)と,ターゲット(流すべきネットワーク先)を紐づけたテーブルを持っています.
このルートテーブルは,サブネットの画面から確認できます.
初期設定では,10.0.0.0/16がlocalにつながるだけで,他のIPはすべて破棄されてしまうので,デフォルトゲートウェイ(すべてのIP 0.0.0.0/0を送るルートテーブルを持つもの)を作成します.というかデフォルトで作成されています.ルートテーブルを確認すればOK.
そのあと,ルートテーブルからサブネットにいけるよう,割当てを選択して,パブリックサブネットにつなげます.
インターネットゲートウェイをデフォルトゲートウェイにつなげる必要があるので,設定します.具体的には,ルートテーブルから,タグの追加で,デスティネーション:0.0.0.0/0のをターゲット:デフォルトゲートウェイにつなぎます.
これで, - 宛先に内部のIPを指定 => 内部でルーティング - 宛先にそれ以外のIPを指定 => インターネットゲートウェイにルーティング される設定が完了しました!!
今回はここまで.次回は,具体的にサーバーを構築していこうと思います!といってもEC2インスタンス作るだけなのですごく簡単なんですけどね.
参考
以下の記事を参考にさせていただきました.
Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.
【AWS】ALBの料金について
起こったこと
ある日,AWSからメールが届きました.
見てみると3USDを超える料金が発生しており,びっくり!
確認したところ,EC2のどこかで急に課金が始まっていたようです.
やったこと
CloudWatchログからメトリクスを探し,コストレポートからサービスを特定しました.どうやらALBのせいみたい.network形式のロードバランサーを使いもしていないのに設置していたせいで,じわじわ課金されていたのでした.
削除して解決
注意点
アラートを設定していないとメールが飛ばないので注意ですね.
参考
以下の記事を参考にさせていただきました.
https://aws.amazon.com/jp/elasticloadbalancing/pricing/
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.
DockerでRailsを動かす その4 番外編
実現したいこと
DockerでRailsアプリを動かし,それをAWSのECS上で実行するところまでを完成させたいと思います.
前回までの戦いはこちら...
DockerでRailsを動かす その3 - 初心者インフラエンジニアが困ったときに試行錯誤するブログ
やったこと
前回,拾ってきたRailsサンプルをうまく動かせなかったので,今回は別のサンプルを作成したいと思います.
まず,RDSを使うコンテナの勉強から..
RDSにとりあえずPostgre入れてみよう
RDSのコンソールからポチポチで作成.特に設定をいじった部分もなく,ほとんどデフォルトでいきました.KnowledgeというDockerでQiita:Teamのオープンソースクローンを使用してみたいと思います!これ使えれば本番運用もありかもしれない
$ git clone https://github.com/support-project/docker-knowledge.git $ vi volumes/knowledge/custom_connection.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <connectionConfig> <name>custom</name> <driverClass>org.postgresql.Driver</driverClass> <URL>[DBのエンドポイント]/URL> <user>[ここにユーザー名]</user> <password>[ここにパスワード]</password> <schema>public</schema> <maxConn>0</maxConn> <autocommit>false</autocommit> </connectionConfig> ~
Dockerfileに設定を反映させます.
# Dockerfile for Knowledge FROM tomcat:jre8 # ==== dumb-init ==== RUN apt-get update && \ apt-get install -y dumb-init && \ apt-get clean # ==== environment ==== RUN rm -rf /usr/local/tomcat/webapps/ROOT \ && update-ca-certificates -f # ==== add Knowledge ==== ADD https://github.com/support-project/knowledge/releases/download/v1.13.1/knowledge.war \ /usr/local/tomcat/webapps/ROOT.war VOLUME [ "/root/.knowledge" ] COPY ./volumes/knowledge/custom_connection.xml /root/.knowledge/ EXPOSE 8080 CMD [ "dumb-init", "/usr/local/tomcat/bin/catalina.sh", "run" ]
さて,設定が完了したところで,イメージを作成し,ECRにpushしたいと思います!!
$ docker build -t knowledge . $(aws ecr get-login --no-include-email --profile <ユーザー名>) #これでAWS CLIからECRにログイン $ docker tag knowledge:latest <ECRリポジトリのURI>:latest $ docker push <ECRリポジトリのURI>:latest
さて,これでECRにDockerイメージを置くことができました.
それでは,早速起動していきたいと思います.
ECSでタスク定義を適当に作り,Fargateで適当に起動...
あれ?PENDINGになりますね.なんでだ...セキュリティグループなど間違っているのか?果たしてそうだったとしてもコンテナ自体立ち上がらないのか?
もう少し待ってから見てみよう...と思ったら!!!起動している!!
IPで接続しても全然つながりませんが,とりあえずコンテナの立ち上げはうまく行ったみたい
よかったー.
これから,ネットワーク周りの構築に移行します.
ALBを新規に作成しました.この辺はもう適当.とりあえずつながればいいのでセキュリティなどもテスト用で設定.
ここまでやっておきながら,やっぱりセキュリティグループ的にポート空いていればアクセスできるはずじゃ?と思い,やっぱりそのまま接続に挑戦.
接続に失敗するエラーはでるけど,Fargateのサンプルアプリはそのまま繋げるしなーと.やはり,アプリ側の設定ミスの模様.
ローカルでの実行を試す
$ docker compose up -d
コンテナが起動.localhost:8080に接続してみるが...
...動かない
なんで!?せめてどこでエラーになっているのかのログだけでも教えてくれ!
再度,git cloneし,そのまま起動してみると,接続に成功.
ということは,DB周りの設定がおかしいことは確か.RDSにつなぎたいんだけどなーー
参考
以下の記事を参考にさせていただきました.
Amazon Fargate でコンテナを動かす - Qiita
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.
DockerでRailsを動かす その4
実現したいこと
AWS Fargateを使って,クラウド上でRailsのコンテナを起動させてみたいと想います.
前回までの戦いはこちら
https://ktaka.hatenablog.com/entry/2018/11/12/002519
今回は,心機一転新しいサンプルアプリを上げてみます.
やったこと
railsのサンプルを拾ってきて,実行してみます
new: echo "$$_gemfile" > Gemfile touch Gemfile.lock docker-compose run web rails new . --force --database=mysql --skip-bundle --skip-javascript sudo chown -R $$USER:$$USER . echo "$$_database_yml" > config/database.yml docker-compose build docker-compose run web rails generate controller welcome index docker-compose run web sh -c 'sleep 10 && rake db:create' sudo chown -R $$USER:$$USER . run: docker-compose up --build define _gemfile source 'https://rubygems.org' gem 'rails', '~> 5' endef export _gemfile define _database_yml default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: host: db development: <<: *default database: myapp_development test: <<: *default database: myapp_test production: <<: *default url: <%= ENV['DATABASE_URL'] %> endef export _database_yml ~
docker-compose.yml
version: '2' services: db: image: mysql environment: MYSQL_ROOT_PASSWORD: '' MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' web: image: ${APP_NAME} build: . volumes: - .:/myapp ports: - "8080:3000" environment: PORT: "3000" depends_on: - db
Dockerfile
FROM ruby:2.4-alpine RUN apk add -U mariadb-client-libs tzdata RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN apk add -U build-base ruby-dev mariadb-dev --virtual .build-deps \ && bundle install -j 4 \ && gem sources --clear-all \ && apk del .build-deps \ && rm -rf /var/cache/apk/* \ /root/.gem/ruby/2.4.0/cache/*.gem COPY . /myapp CMD exec bundle exec rails s -p ${PORT} -b '0.0.0.0'FROM ruby:2.4-alpine RUN apk add -U mariadb-client-libs tzdata RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN apk add -U build-base ruby-dev mariadb-dev --virtual .build-deps \ && bundle install -j 4 \ && gem sources --clear-all \ && apk del .build-deps \ && rm -rf /var/cache/apk/* \ /root/.gem/ruby/2.4.0/cache/*.gem COPY . /myapp CMD exec bundle exec rails s -p ${PORT} -b '0.0.0.0'
さて,とりあえずローカルで動かそうか...と思いきや...
$ APP_NAME=rails make new .... RROR: unsatisfiable constraints: mariadb-client-libs (missing): required by: world[mariadb-client-libs] ERROR: Service 'web' failed to build: The command '/bin/sh -c apk add-U mariadb-client-libs tzdata' returned a non-zero code: 1 make: *** [new] Error 1
あらら,エラーですよ.今度は何だ.そろそろECSに行かせてくれ
更新かなーとか思ったけど,apk addのときに -Uオプションはちゃんとついているし.
ググってもいい感じの解決方法がわからないので,この手法は諦めます.Postgreがいいし.
今日はこの辺にして,また明日以降がんばります.
参考
以下の記事を参考にさせていただきました.
AWS FargateでRuby on Railsを動かしてみる - Qiita
Alpineでパッケージをインストールしようとしたらエラーがでたので解消する - TOEIC940点の文系プログラマー
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.
pgを立ち上げるのにエラーが出たとき
実現したいこと
postgresqlを立ち上げて,さあ開発しようという矢先,
psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
という謎のエラー.これをなんとかしたい.
やったこと
$ rm /usr/local/var/postgres/postmaster.pid
これはそもそもpostmaster.pidがなかったので不発.
$ brew services restart postgresql
これで解決した.AWSとかも再起動したら直ったりするし,そういうもんなのかなと.プロセスとかもっと勉強しないと.
参考
以下の記事を参考にさせていただきました.
本記事について
本記事は,学習を目的に書かれています.
間違い,改良案などございましたら,コメントしていただけると幸いです.
基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,
その情報を中心に追記します.