いちりんのアウトプットブログ

インフラエンジニアです。まだまだ勉強中の身。わからないこと、気になる事を随時調べてアウトプットします。

Docker for Mac と Docker ToolBoxの違いって?

時間がないので超雑に調べる

Docker ToolBox

仮想VMでDocker用のホストを立ち上げ、Docker環境を簡単に利用できるようにしたツール。

  • 実際に入るもの
    • VirtalBox(アプリケーション -> Dockerフォルダではなく、VirtualBoxとして入ります) -Dockerホストを仮想環境で動かすため
    • docker-machine
      • Mac上からDocker用ホストを管理するためのコマンドラインツール
      • コマンドを使ってVirtualBox VM である default ホストをプロビジョニングできる
      • Docker用ホストの起動/停止/作成やssh、scpでのアクセスができるようになります
    • docker
      • 基本のdocker用コマンドラインツール
      • 本来はDocker用ホスト内で利用しますが、Macのターミナルから直接操作できるようになっています
    • docker-compose
      • アプリケーションを複数のDockerコンテナを使って構成したい場合に便利なツール
    • Dockerを操作するために必要なシェルもろもろ

実際homebrewでインストールしてみたらdocker,docker-machineのコマンドが普通に叩けた

Docker for Mac

  • Dockerホストの軌道にVirtualBoxではなく、HyperKitというMacネイティブの仮想化環境を利用している。
    • /Applicationsにインストールされる。
  • Docker社が公開したオープンソースの軽量な仮想化ツール「Hyperkit」で動く(VirtualBoxは使わない)
  • Docker for Mac アプリケーションは、 docker-machine は使わず直接VMを作成し、管理する
  • インストール時に /usr/local/bin に dockerとdocker-composeにシンボリックリンクが貼られる

結局どうなの

要するに、Docker toolboxはVMを利用していて、 Docker for Mac は仮想化ツールで動いている? 若干わかったような気はする。

PostgreSQL is なに?

概要

オープンソース関係データベース管理システム (RDBMS)である。
同じオープンソースRDBMSであるMySQLと比較してなにがいいのかを調べてみる。

それぞれの特徴を一言でまとめると

  • RDBMSに求められるものが過不足なく搭載されているのはPostgreSQL
  • 大規模なシステムでスケールさせる上で性能を限界まで引き出せるのはMySQL

DML(データ操作言語)を比較

  • select文

    • 大量データのソートが必要なSELECT文だとMySQLは遅くなる
    • PostgreSQLと比較するとMySQLはソートのアルゴリズムがそれほど優れていない
    • ただ、新規10件、100件のデータ(TOP n レコード)を取得するようなものは早い
  • update文

    • PostgreSQLはUPDATEする際には変更前の行に削除フラグのようなものを立てたうえで、変更後のデータを持った新しい行を追加している
    • いっぽうでMySQLは、UPDATE対象となる行の値を直接上書きしているのでUPDATEはMySQLの方が早い

テーブル結合(JOIN)

  • MySQLはネステッドループ結合しかサポートしていない。複雑なアルゴリズムはサポートしない思想のため
  • PostgreSQLはネステッドループ結合, ハッシュ結合, ソートマージ結合全てをサポートしている

トランザクション処理の分離レベル

  • MySQLはデフォルトがREPEATABLE-READとなっている
    • ファントムリードを避けるため、ネクスキーロックという仕組みを採用しているがそれが原因でロックがかかりINSERTできなくなる可能性がある
  • PostgreSQLはREAD-COMMITTEDがデフォルト
    • ファントムリードやノンリピータブルが起こる可能性はある
    • REPEATABLE-READに変更したとしてもネストキーロックとは違う方法でファントムリードを防いでいるのでロック競合が起こりづらい

レプリケーションの論理型と物理型

PostgreSQLにしかないもの

  • パラレルクエリがある。処理速度をより速くするために、複数のCPUを活用してクエリを実行するもの
  • サードパーティOSSツールであるPostGISがある点でPostgreSQLが選ばれたりする。MySQLのものより機能が豊富

所感

PostgreSQLについて名前しかわからないぐらいなので調べ他のですが、 そもそもDBというものの仕組みを詳しく知らなかったので、知識不足を実感。 もっと知っていればいい具合に比較できたかと思う。 記事のまとめのようになってしまったが、DBの知識は多くつけられたと思う。

参考記事: PostgreSQLとMySQL、使うならどっち? データベース専門家が8つの視点で徹底比較! - エンジニアHub|若手Webエンジニアのキャリアを考える!

PostgreSQLとMySQLはどちらかに明確な優位性がありますか? - QA@IT

CORS is なに?

ざっくり概要

オリジン間リソース共有(Cross-Origin Resource Sharing)といい、
異なるオリジンサーバーのリソースにアクセスできるようにする仕組みのことである。

なんで必要なの

通常、異なるオリジンサーバーの情報にアクセスしようとすると
Same-Origin Policy(日本語では同一生成元ポリシー)が適用され、エラーが起こり通信が拒否される。
しかし信頼関係のあるサーバー同士で同じリソースを使用したい場合も適用されてしまうので、CORSが利用される。

CORSの利用

ブラウザがリクエストヘッダ(Access-Control-Allow-Origin)にアクセス元の情報を追加する。
アクセスを受けるWEBサーバーは、HTTPレスポンスヘッダにアクセスした側の情報を追加する。
そしてブラウザのアクセスが許可され、表示される。
(多分すごく簡潔にいうとこれで良いと思ったのですが、間違っている可能性あり。)

参考:

包括的にSame-Origin Policy(同一生成元ポリシー)を理解する<2018年夏> - Qiita

memcached is なに?

memcachedとは分散型メモリキャッシュシステムのことである

 

分散型メモリキャッシュシステムとは

数十~数千台のサーバーに搭載される物理メモリを連携させて、巨大な論理メモリとして利用する技術である。

 

なんのために作られたのか?

webアプリケーションの多くは、RDBMS(Relational DataBase Management System)にデータを格納し、サーバーからデータを引き出しブラウザに表示させている。

しかしアクセスが集中すると負荷が上がりレスポンスが悪化、WEBサイトの表示遅延などの影響が出てしまう。

 

これに対しmemcachedはデータベースの問い合わせ結果を一時的にキャッシュし、データベースのアクセス回数を減らし高速化や負荷軽減をする。

 

特徴

  • 単純なテキストプロトコル
  • データは全てメモリ上にのみ保存される
  • 揮発性のKVS
  • 分散はクライアント側で制御される

 

参考: 

http://gihyo.jp/dev/feature/01/memcached/0001

Memcachedにtelnetで接続する。 | キムラデービーブログ

HTTP/2 is なに?

HTTP/2についての理解が浅いのでまとめ

 

HTTP/2は新しいWEBサーバーのデータのやり取りの仕組みのこと。

前バージョンのHTTP/1.1と比べてみる。

 

HTTP/1.1

  • 1999年に発表された
  • 1つのTCPコネクションでリクエストを一つずつ処理
  • 一つのWEBサーバーで異なるドメインのページが公開できる「バーチャルホスト」が追加された

 

HTTP/2

  • GoogleがWEBページ高速化のために開発したSPDYを改良したもので、2015年に発表
  • 一つのTCPコネクションに対して複数のリクエストを並列処理
  • ヘッダー圧縮ができるようになった
  • クライアントからのリクエストから次のリクエストを予想しレスポンスを返すことができる(サーバープッシュ)

 

ぶっちゃけ、この記事を読めばOKなのですが

qiita.com

 

DHCP is なに?

DHCP(Dynamic Host Configuration Protocol)とは、LANなどの閉じたネットワーク内で、自動的にコンピューターにIPを割り当てる仕組みのこと。

 

DHCPサーバーを構築すれば新規端末を追加した際にIPアドレスを設定しなくても、ネットワークに接続すれば通信ができるようになる。

 

DHCPは、TCP/IPのあプリケーション層のプロトコルであり、トランスポート層UDPを用いる。

ポート番号として、DHCPサーバーに67,クライアント用に68を利用する。

 

実際にどのような動作をするのかを以下にまとめる

 

①DHCPDISCOVER

クライアントは、ネットワークに接続した時点でIPアドレスを要求するDHCPDISCOVERパケットをDHCPサーバーに送る。

この時点ではDHCPサーバーのIPアドレスも知らないので、IPヘッダの送信元のIPアドレスを0.0.0.0,宛先IPアドレスを255.255.255.255(ブロードキャストアドレス)とする。

フレームの宛先MACアドレスもブロードキャストアドレスで送信する。

 

②DHCPOFFER

ブロードキャストでパケットを受信したDHCPサーバーはそのPCが属するサブネットの中で未使用のIPアドレスを選択し、DHCPOFFERを返送する。

この時、複数のDHCPサーバがネットワーク上にある場合、OFFERを複数受信することになる。

 

③DHCPREQUEST

クライアントはこれを受け取るとDHCPREQUESTをブロードキャストする。

これで複数のDHCPサーバからOFFERを受信した場合にも、全てのサーバに"応答が届く。なお、DHCPREQUESTにはどのサーバーからのDHCPOFFERを選択したのかが設定される。

 

④DHCPACK

DHCPサーバーはDHCPREQUESTを受け取ったら、自身が選択されたことを同じユーザーIPアドレスが返送されたことで確認する。そして割り当てるIPアドレスデフォルトゲートウェイIPアドレスなどをDHCPACKにより返送する。DHCPREQUESTが正しくなければPANKを返送する。

PACKを正常に受信したクライアントは、指定されたユーザIPアドレスを自分のIPアドレスとして保存し、以降はこのIPアドレスで通信を行うように設定するPNAKが返信された時は、再度DISCOVERの送信からやり直される。

 

なお、クライアントはIPアドレスが不要になった時点で、IPアドレス開放パケットをDHCPサーバに送ることでIPアドレスを返却する。

DHCPサーバーは自分で構築したことはなく、通常の業務ではあまり使用しない知識なのですが理解が曖昧だったので調べてかいてみました。