30代専業主婦の独学エンジニア挑戦ブログ

実務未経験の30歳の専業主婦が独学でエンジニアを目指すブログです

「プログラマのためのDocker教科書」を読みました(1)

勉強記録

今日からこちらのサイトを参考に、写真共有アプリを作ります。

www.hypertextcandy.com

開発環境構築のためにDockerを使うとのことですが、Dockerはサラっとしか使ったことがなく、知識が足りないので「プログラマのためのDocker教科書」を読みました。

第1章「おさえておきたいシステム/インフラの知識」はインフラの基礎知識について書かれており、大変勉強になったのでまとめました。

 

 

システム基盤の基礎知識

開発したアプリケーションをリリースしてユーザに使ってもらうには、システム基盤を構築して、その上にアプリケーションの実行環境を用意する必要がある。
 

システム基盤とは

アプリケーションを稼働させるために必要になるハードウェアやOS/ミドルウェアなどのインフラのこと。
インフラはハードウェア(パソコンやサーバ、ストレージ)とソフトウェア(OSやミドルウェア)に分けられる。
 

システム基盤の構成要素

システムに求められる要件は大きく分けると2つ
機能要件
システムの機能として求められる要件のこと。システムやソフトウェアでなにができるのかをまとめたもの
非機能要件
システムの性能や信頼性、拡張性、運用性、セキュリティなどの要件。
 
非機能要件を満たすにはシステム基板に関する知識が必要。基本となるシステム基盤の構成要素は・・・
ハードウェア
システム基盤を構成する物理的な要素。サーバ機器本体や、ストレージ、電源装置、データセンターの設備も含む
ネットワーク
システム利用者に遠隔地からのアクセスができるようにサーバ群をつなぐための要素。
ルータ、スイッチ、ファイアーウォール、これらを接続するためのケーブル配線なども管理する。
OS(オペレーションシステム)
ハードウェアやネットワーク機器を制御するための基本ソフトウェア。
クライアントOSはWindows / Android / Mac OSなど、サーバOSにはWindows Server / UNIXサーバー / Linuxサーバなど。
サーバOSは、システムを高速かつ安定稼働させるために、ハードウェアの性能を引き出すように作られていたり、長時間の稼働でも安定して動作するように作られている。
ミドルウェア
サーバOS上でサーバが特定の役割を果たすための機能を持つソフトウェアのこと。
 
 

システム基盤の種類(クラウドとオンプレミス環境)

オンプレミス
自社でデータセンターを保有してシステム構築から運用まで行う形態。
ハードウェアだけでなく、OSやミドルウェアもすべて自社で購入して、ライセンス管理やバージョンアップも自分たちで行う。
初期のシステム投資にかかる費用の負担が大きく、システム稼働後の運用にかかる費用もシステムの利用量にかかわらず負担しなければならない。
パブリッククラウド
インターネットを介して不特定多数に提供されるクラウドサービス。
システム基盤部分を利用するサービスはIaaSと呼ばれ、利用したいスペックの仮想サーバやストレージを選んで、使った時間やデータ量の分だけ料金を支払う。
プライベートクラウド
特定の企業グループのみに提供されるクラウドサービス。
パブリッククラウドは不特定多数に対して提供されているが、プライベートクラウドなら利用者が限定できるのでセキュリティが担保しやすく、独自の機能やサービスも追加しやすい。
 
クラウドを利用すると、短時間でインフラを構築できるし、利用した分だけ払えばいいから初期投資もいらない。
さらに、システムの利用量が増加したときに簡単にインフラ基盤を増強(オートスケール)できる。
 

クラウドが適しているケース

トラフィックが変動しやすいシステム
トラフィックの量に応じて、サーバのスペックやネットワーク帯域を見積もる設計のことをサイジングと呼ぶ。
サイジングが難しいシステムは、簡単にシステムを増強できるクラウドが適している。
災害対策をしたいシステム
国内での災害に備えて、国外でバックアップシステムを稼働させて、業務を維持させる必要のあるシステムはクラウドが適している。
なるべく早く稼働させたいシステム
新サービスを早く提供したい場合や、お試しで作りたいときなど。
 

オンプレミスが適しているケース

高い可用性が求められるシステム
クラウドの場合、クラウドベンダーに障害が起こるとシステムも影響を受けてしまう。
機密性の高いデータを扱うシステム
物理的な保管場所を明確にする必要のある業務データを扱う場合。
特殊な要件があるシステム
特殊な要件がある場合は、クラウド側が対応していないと使えない。
トータルコストが高くなるシステム
クラウドではサーバのリソースに対する課金だけでなく、ユーザ数に応じて課金されるものもある。
 
システムの導入を考えるときには、オンプレミスとクラウドではどちらが適しているのか見極めるのが大事。
 

システム基盤の構築/運用の流れ

システム化計画/要件定義
インフラ設計
インフラ構築
運用
 
アプリケーション開発の工程に似ているが、大きく異なるのが運用フェーズ。
アプリケーション開発では、本番へシステムリリース後はバグの修正や追加機能の開発がメインで開発要員も減る。
インフラの場合は、リリース監視やセキュリティ対策のためのバージョンアップ、システム障害発生時の復旧対応など、定常業務が残る。
 
このシステム運用にかかる保守工数を減らすためにも、自動化できるとこは自動化する。
その方が、人為的な操作ミスを減らせるし、インフラ運用業務を可視化したりできる。
 
Dockerは、システム構築やシステム運用でこれまで人が作業していた部分を自動化するためのプラットフォーム。
 

ネットワーク/ハードウェアの基礎知識

ネットワークアドレス

MACアドレス
ネットワーク部品に物理的に割り当てられた48ビットのアドレス。
OSI参照モデルの第2層であるデータリンク層で使う。
IPアドレス
ネットワークに接続されたコンピュータやネットワーク機器に割り当てられた識別番号。
 

OSI参照モデル

f:id:programming_kanamama:20200328113739j:plain

OSI参照モデル
アプリケーション層
HTTPやメール転送のSMTPなど、アプリケーションに特化したプロトコルを規定
プレゼンテーション層
データの保存形式や圧縮、文字コードなどのデータの表現形式を規定
セッション層
コネクション確立のタイミングやデータ転送のタイミングを規定
トランスポート層
データ転送の制御。代表的なプロトコルTCP/UDP
ネットワーク層
異なるネットワーク間で通信するための規定
異なるネットワークにデータのパケットを転送することをルーティングと呼ぶ
データリンク層
同じネットワーク内にあるノード間での通信を規定。
MACアドレスによるデータ転送が行われる。
物理層
通信機器の物理的、電気的な特性を規定。
 
 

ファイアーウォール

内部ネットワークとその外部との通信を制御して、内部ネットワークの安全を維持する。
パケットフィルタ型
通過するパケットをポート番号やIPアドレスによってフィルタリングする
アプリケーションゲートウェイ
アプリケーションプロトコルのレベルで外部との通信を代替し制御する。
一般的にはプロキシサーバー(中間サーバー)と呼ばれている。
 

ルータ

2つ以上の異なるネットワーク間を中継するための通信機器。
OSI参照モデルネットワーク層で動作し、どのルートを通してデータを転送するのかを判断している。
 

サーバ機器の主な構成要素

CPU
プログラムの計算や処理などを行う電子回路部品。
CPUの主要演算回路のことを「コア」と呼び、コアの数が多くなるほど同時に演算処理できる数が増える。
サーバで利用されるCPUは、コアを複数持つマルチコアが利用されている。
メモリ
CPUが直接アクセスすることのできる記憶装置。
サーバ用には省電力でエラー処理が搭載されているものが選ばれる。
ストレージ
データベースに書き込まれたデータなどの永続データを保存するデバイス
 

OS(Linux)の基礎知識

Linuxの概要

一般的にLinuxには2つの意味がある
Linuxカーネル
LinuxカーネルとはOSのコアとなる部分のこと。
メモリ管理、ファイルシステム、プロセス管理、デバイス制御などOSとしてハードウェアやアプリケーションソフトを制御するための基本的機能を実装したソフトウェア。
Linuxディストリビューション
通常LinuxLinuxディストリビューションという形で配布されている。
Linuxカーネルに加えて、各種コマンド、ライブラリ、アプリケーションが含まれている。
Linuxカーネル以外の部分はユーザランドと呼び、ユーザランドからは直接デバイスにアクセスできないので、Linuxカーネルを介して処理を行う。
 

Linuxカーネルの主な機能

バイス管理
CPUやメモリなどのハードウェアをデバイスドライバというソフトウェアを利用して制御する。
プロセス管理
Linuxは命令を実行するとき、ファイルに書かれた内容を読み込み、メモリ上に展開してプログラムを実行する。
この実行されたプログラムのことをプロセスと呼ぶ。
プロセスは複数同時に実行され、LinuxカーネルではプロセスにPIDという識別子をつけて管理する。
プロセス実行のために必要となるCPUを効率よく割り当てている。
メモリ管理
プログラム/データを物理メモリに効率よく割り当てる。実行が終わったプロセスが使っていたメモリ領域を解放する。
メモリには容量の制限があるので、容量を超える場合にはハードディスクに仮装メモリ領域をつくる。この仮装メモリ領域をスワップと呼ぶ。
 
Linuxカーネルを操作するには、シェル(Shell)が使われる。シェルは命令をコマンドで受けて、Linuxカーネルに伝える。
 

Linuxファイルシステム

ファイルシステムは、Linuxでデータにアクセスするための仕組み。
LinuxカーネルVFS(仮装ファイルシステム)という仕組みを使って、データがどこに保存されてようが透過的にアクセスできる。(アプリケーションはデバイスの違いを意識しなくてよい)
VFSでは各デバイスをファイルとして取り扱っている。
つまり、アプリケーションからみるとどこにデータを保存しても、ファイルに見える。
 

Linuxディレクトリ構成

Linuxディレクトリ一覧はFHSという規格によって標準化されている。
 

Linuxのセキュリティ機能

UNIXおよびLinuxは強固なセキュリティ機能を持つOSである。
アカウントによる権限設定
システムを利用できるユーザアカウントに権限を設定できる。
ネットワークフィルタリングによる機能
パケットフィルタリングがファイアーウォールのような役目を果たすので、不正なパケットを破棄できる。
SELinux
アメリカ国家安全保障局が提供している、Linuxカーネルに強制アクセス制御機能をつける機能。
 

ミドルウェアの基礎知識

ミドルウェアとは

OSと業務処理を行うアプリケーションとの中間に入るソフトウェアのこと。目的や用途によって幅広い種類が利用されている。
 

Webサーバ/Webアプリケーションサーバ

Webサーバとは、ブラウザからHTTPリクエストを受け、HTMLやCSSなどのWebコンテンツをレスポンスとして返したり、他のサーバサイドプログラムを呼び出したりする機能を持つサーバ。
 

データベースサーバ

システムが生成するさまざまなデータを管理するためのミドルウェアDBMS(MySQLPostgreSQLOracleなど)
 

システム統合運用監視ツール

システムが本番リリースすると、システムを安定稼働させるためにどのような状態で稼働しているのか俯瞰的な観点で監視する必要がある。
この監視を統合運用管理ツールでおこなう。
 
ミドルウェアはこれらの他にもあり、ミドルウェアの特徴や機能を調査し、要件に応じて組み合わせて利用するためのスキルが必要。
 

インフラ構成管理の基礎知識

インフラ構成管理

オンプレミス環境では、いったん構築したものをメンテナンスしながら長く使う。インフラ環境の規模が大きくなるほどインフラ構成管理が大変。
クラウドではサーバやネットワークを簡単に構築したり、すぐに破棄したりできるようになっている。
そのため、インフラの変更履歴を管理するのでなく、今動いてるインフラの状態を管理すればよい。このようなインフラは不変のインフラと呼ばれる。
 

Infrastructure as Code

インフラを手動で構築する場合、手作業では数が多いし、作業ミスを完全に防ぐのは難しい。
インフラをコードで構築すれば、プログラムコードに書かれたとおりの内容を自動で設定するので、だれが実行しても同じ状態のインフラ環境が構築できるようになる。
 
さらにコードで管理しておけば、本番運用中に構成変更があったときにも、Gitなどのバージョン管理ソフトで変更履歴を管理することが可能。
インフラの構成をコードで管理することを「Infrastructure as Code」と呼ぶ。
 
DockerではDockerfileにインフラの構成情報を記述することができる。
 

代表的なインフラ構成管理ツール

・OSの起動を自動化するツール(Bootstrapping)
・OSやミドルウェアの設定を自動化するツール(Configuration)
・複数サーバの管理を自動化するツール(Orchestration)
 
DockerはBootstrapping〜Configuration〜Orchestrationまでを取り扱うプラットフォームである。