docker
Dockerとは何か
- コンテナ型仮想環境を作成、実行、管理するためのプラットフォーム
- Dockerのソフトウェアを使って素早くコンテナを起動し、様々なアプリケーションを実行することができる
- 異なる環境で簡単に同じ仮想環境を再現できる
- Dockerのソフトウェア自体はGo言語で書かれている
用語
Dockerイメージ
Dockerコンテナを作成するための雛形となるもの Dockerイメージはアプリケーション、ライブラリ、設定ファイルなどのアプリケーション実行に必要なものを一式をまとめたもの 出来上がったアプリケーションをDockerイメージとして保存して、別のサーバーに持っていくことで同じ環境を別のサーバー上で再現が可能
Dockerコンテナ
Dockerイメージを元に作成されるコンテナ型仮想環境のことをDockerコンテナ、または単にコンテナと呼ぶ イメージからコンテナを作成することで何度でも簡単に同じコンテナ(仮想環境)を作成することができる コンテナを起動することで予めイメージにセットアップしたアプリケーションの機能を提供することができる
Docker Hub
Dockerイメージを保存するための機能などを提供しているサービス ベンダーや他のユーザーが作ったイメージも公開されており、公開されているイメージをダウンロードすることでさまざまなコンテナを起動することができる
ホストOS
仮想化において、仮想サーバーを起動させる側のOSのことをホストOSをいう ホストOS上に仮想化のソフトウェアをインストールすることで、仮想マシンを作成して複数の仮想環境を起動することが可能
ゲストOS
仮想化において、ホスト上に作成された仮想マシン上で動作するOSのことをゲストOSと呼ぶ
Virtual Machine
仮想環境のことをVirtual Machineを略してVMと呼ぶ。一般的にはホスト型仮想化の仮想マシンのことを指す
ホスト型仮想化
ホストOSにハイパーバイザーと呼ばれる仮想化の機能を用意して行う仮想化のことをホスト型仮想化という ハイパーバイザーの機能を提供するソフトウェアとして、Virtual Boxなどがある。 ホストOSに依存せずに仮想マシンに好きなOSをインストールできる点や、仮想マシン間の分離レベルが高い点などがコンテナ仮想化と異なる
コンテナ型仮想化
Dockerといったコンテナ仮想化を行うソフトウェアを用いて行う仮想化をコンテン型仮想化という Dockerの場合はDockerエンジンによってコンテナの作成、削除などの管理が行われる ホスト型とは異なり、ゲストOSというものはなく、ホストOSのカーネルを共有してアプリケーションが実行される
ハイパーバイザー
ホスト型仮想化の仮想マシンを管理するための機能を提供するものがハイパーバイザー。 ホストOSとゲストOSの間を仲介する形でハイパーバイザーが機能する
Dockerエンジン
Dockerにおいてコンテナ型仮想化を実現するためのコアとなる機能をもった部分がDockerエンジン Dockerエンジンによってコンテナ作成などの機能が提供される ここにコマンドで指示することでコンテナが立ち上がったりする
オーバーヘッド
コンピューターで何らかの処理を行う際に、その処理を行うために余計に費やされるシステムへかかる負荷や処理時間などのこと
ミドルウェア
コンピュータの基本的な制御を行うオペレーティングシステムと、各業務処理を行うアプリケーションソフトウェアとの中間に入るソフトウェアのことをミドルウェアと呼ぶ WebアプリケーションではデータベースサーバーやWebサーバー、アプリケーションサーバーへの機能を提供するミドルウェアなどが頻繁に使用されている
カーネル
OSのコアとなる部分をカーネルという。 ハードディスクやメモリーなどコンピューターリソースの管理や、プログラムの実行プロセスへのリソースの割り当てなどを行う
パッケージ
特定の機能を提供するために、必要なプログラムをまとめたものをパッケージと呼ぶ Linuxサーバーなどでは、公開されている様々なパッケージをインストールすることで、サーバーとしての機能を追加することができる
ホスト型仮想化とコンテナ型仮想化の違い
仮想化のオーバーヘッド
ホスト型仮想化 - リソース(CPUやメモリの使用率など)の面でオーバーヘッドが多く、起動や停止に時間がかかる コンテナ型仮想化 - コンテナはアプリケーション実行に必要なものだけを含み、ホストOSのカーネルを使用するため、動作が早くリソースの使用率も少なくて済む。
アプリケーション実行の再現性
ホスト型仮想化 - 仮想マシンの環境の違いによりアプリケーションが動作しなくことが稀に発生する
コンテナ型仮想化 - 特定のアプリケーションを動作させるために必要なものはDockerイメージにまとまっており、同じDockerイメージからコンテナを起動する限り、環境が変わっても同様に動作する
OSの自由度
ホスト型仮想化 - 仮想マシン上で任意のOSを動作させることができる コンテナ型仮想化 - コンテナはホストOSのカーネルを使用して動作するので、WindowOS上で直接Linuxコンテナを動作させることができない - またLinuxOS上で直接Windowsコンテナも動作させることもできない
分離レベル
ホスト型仮想化 - ハードウェアレベルtで仮想化されており、ホストOSや仮想マシン間の分離レベルが高く、それぞれが影響を受けにくい - OSの機能を使用した仮想化は、従来の仮想化に比べて分離レベルは低い
用語解説
Dockerデーモン
Dockerの常駐型プログラミングでDockerコンテナの作成やDockerイメージの作成などDockerに対する操作はこのDockerデーモンが受け取り、実際の処理を行う Dockerデーモンが起動していないとDockerに対する操作を受け取れないためエラーになる そのため、もし停止している場合には事前に起動しておく必要がある
Dockerクライアント
Dockerの利用者がDockerに指示を出すためのクライアントソフト。 一般的にはdockerコマンドを用いてDockerに指示を出す
PCでのDocker実行環境
次の順で実行される 1. Dockerクライアント(Dockerコマンド) 2. Dockerデーモンが受けとる 3. コンテナに指示を出す ※DockerデーモンはLinuxの仮想マシン(軽量)の中で行われる。 ← インストールしたdockerが自動でやってくれる
用語解説
バインドマウント
DockerにおいてOS(Dockerデーモンが動作しているOS)上のファイルをコンテナに共有する機能をバインドマウントという。 ソフトウェアの開発時など、PCでソースコードを変更してDockerコンテナ上で実行したい場合などにソースコードのあるフォルダをコンテナにバインドマウントしてプログラムを実行するといった使い方が良くされる
Kubernetes
コンテナのオーケストレーションツール。 オーケストレーションツールとは主に複数のコンテナを効率よく管理するための機能が備わったツールのこと。 様々なコンテナが多数動作する環境において、使用するイメージ、コンテナへのCPUやメモリの割り当て、コンテナ停止時の復旧処理、パスワードなどの秘匿情報の管理、ストレージの割り当て、コンテナの稼働状況の監視等様々なことを考慮する必要があるため、管理が難しくなる Kubernetesはこういったコンテナ管理の機能を持ったソフトウェアであり、コンテナを管理するための設定ファイルを書くことで様々なコンテナ管理の機能を利用することができる
hello-worldの実行と動作の解説
docker run コマンドの実行時の動作
docker run コマンドは複数のコマンドを合わせたもの - docker pull: イメージの取得 - docker create: コンテナの作成 - docker start: コンテナの起動
用語解説
レジストリ
Dockerの文脈ではリポジトリを管理する場所のことをレジストリをいう。 リポジトリの作成など、リポジトリの管理機能を提供するサービスをレジストリサービスという。 レジストリの機能を提供するサービスとしては、Docker Hubなどがある。レジストリにDockerイメージを保存することで異なる環境間にイメージを移送することが可能
タグ
イメージに付けることができるラベル名のことをタグという。バージョンの管理に使う
ビルド
Dockerの文脈において、DockerfileからDockerイメージを作成することをビルドという
Docker Hubとは
- Dockerイメージのレジストリサービス
- Dockerイメージの公開、検索、ダウンロードをすることができる
用語解説
ファイルシステム
コンピューター上でファイルを管理するための機能のことをファイルシステムという。 通常ファイルシステムの機能はOSに備わっている
ストレージドライバ
ハードディスクなどのストレージにデータを書き込むための機能を持ったソフトウェアのこと。 ストレージドライバによってデータの書き込み形式や管理方法は異なる
AUFS
Dockerで使用できるストレージドライバの一種。 Dockerの説明においてはファイルシステムの一種として解説されているものもある Dockerイメージをどのようにストレージに保持するのかを司るソフトウェアとしてAUFSという選択肢があるという風に理解する
Dockerイメージとは
- コンテナに必要なファイルをまとめたファイルシステム
- AUFSなどの特殊なファイルシステムが使用されている
- イメージ上のデータはレイヤで構成され読み取り専用
- コンテナで立ち上げる際にイメージから読み取ったものは読み取り専用であり、直接編集できない。読み取り専用の上に読み書き可能なコンテナレイヤーが積み上げられ、そこから下のレイヤーのファイルを削除することができるが、元々のレイヤーは消えない。イメージのファイルを小さくすることがdockerでは大切なので削除を検討する場合、イメージから削除する方法を考えた方が良い
- イメージはできるだけ小さくしたほうが良い。 ベースイメージ(CentOSなど)が共通している場合は共通部分は同じイメージを使用することができるでイメージの節約に繋がる。
用語解説
プル
リポジトリからイメージをダウンロードすることをプル(pull)という
プッシュ
リポジトリにイメージをアップロードすることをプッシュ(push)という
ローカル
相対的に見て、手元のPCやサーバーのことをローカルという 例えば、PC上にダウンロードしたイメージを指してローカルにあるイメージという。 この場合、相対的にみてダウンロード元のインターネット上のリポジトリのことをリモートレポジトリと呼ぶこともある。 このように手元の環境をローカル、ローカルから見て相手側をリモートと呼ぶ
エイリアス
別名のことをエイリアスと呼ぶ
ローカル上のDockerイメージの管理
イメージの一覧を表示するサブコマンド
docker images
イメージにタグ付けするコマンド
docker tag 元となるイメージ名 新しいイメージ名
イメージの詳細情報を表示するコマンド
docker inspec 対象のイメージ名orイメージID
ローカルのイメージを削除するコマンド
docker rmi 対象のイメージor対象のイメージID #強制したい場合は、-fコマンドを付ける docker rmi -f 対象のイメージor対象のイメージID
イメージを取得(PULL)するコマンド
docker pull 取得したいイメージ名
ビルドコンテキスト
Dockerイメージをビルドする際にDockerデーモンに送信するホストOS側のディレクトリのことをビルドコンテキストと呼ぶ。 ホストOS側に置いてあるファイルをDockerイメージに内包する場合は、ビルドコンテキスト上にファイルが存在する必要がある ビルドコンテキスト上のファイルはビルト時に全てDockerデーモンに送信されるため、ビルドに不要なファイルは含めないことが推奨されている。 あくまで一時的にDockerデーモンに送信されるだけで、どのファイルをイメージに含めるかどうかはDockerfileに定義する
Dockerfile
Dockerイメージを作成するための指示書となる設定ファイル。 DockerではデフォルトでDockerfileという名前のファイルがイメージのビルドに使用される。 Dockerでビルドを行なった場合、Dockerfileに定義された内容を上から順に処理していき、最終的な状態の環境がDockerイメージとして保存される
※ビルドとはプログラミング言語を元に実行可能ファイルや配布パッケージを処理や操作すること
ビルドプッシュ
Dockerイメージをビルドした際に、イメージのレイヤーごとにビルド結果がキャッシュされる。 Dockerfileを元にビルド内容に差がない場合、2回目以降のビルドした場合はこのビルドキャッシュが使用されるため、初回より早くビルトが完了する。 Dockerfileに変更があったり、関連するファイルに差があった場合は、ビルドキャッシュが使用されずに再度ビルドが行われる。
Dockerfileを使用したイメージビルド方法
Dockerfileからイメージをビルドするコマンド - ビルドコンテキスト配下のDockerデーモンに送られるので不要なファイルは削除するべき
docker build タグ名の指定 ビルドコンテキスト
ビルドを再度する際にはキャッシュが使われる。キャッシュを使用しない場合は-no-cacheオプションを使用する。
nginxコンテナの実行とデタッチモード
-p 8080:80でポートマッピングした場合の簡略化したネットワーク図 仮想マシンの8080ポートに来た場合、コンテナの80ポートにアクセスするようにする
バインドマウントの解説
ITの分野では、コンピュータ本体に接続した周辺機器をオペレーティングシステム(OS)などのソフトウェアに認識させ、操作・利用可能な状態にすることをマウントということがある。 ホストOS上にあるファイルをコンテナで使用できる状態にすること
DockerfileのCOPY命令、ADD命令
docker cpコマンドの説明
ホストマシンのファイルをコンテナ内にコピーする場合
$ docker cp ホスト上にコピーしたいファイルのパス \ コンテナ名orID : コピー先のパス
コンテナ内のファイルをホストマシンにコピーする場合
$ docker cp コンテナ名orID : コンテナ上のコピーしたいファイルのパス \ コピー先のパス
用語解説
標準入力
標準入力とはコンピュータ上で実行されているプログラムが特に何も指定されていない場合に標準的に利用するデータ入力元のことを指す
TTY
TTYとはteletypewriterを略したものでコンピュータの利用者が入力した文字を別の機器に送信したり、別の機器から受信した文字情報を利用者に提示したりする機能を持った端末やソフトウェアのこと
フォアグラウンド
プログラムを実行した際に処理状況や、処理結果が逐一画面に表示されるような動作をするものをフォアグラウンドと呼ぶ。 逆にバックグラウンととは処理の呼び出し後に裏側で実行され、表立って処理状況や処理結果が画面に表示されないものを言う
コンテナのライフサイクル
↓のブログの図を見るとわかりやすい
用語解説
デーモン
Linuxにおいて常駐型のプログラムのことをデーモンという。 例えば、Webサーバーのプログラムなどはデーモンとして起動し続け、クライアントからのリクエストがあった際に常に応答を返せるように常駐
コンテナのシェルに接続するコマンド
docker attachを使用する場合 ※ただし、シェルに接続できるのはコンテナシェルで実行している場合のみ。
$ docker attach コンテナ名orコンテナID
docker execを使用する場合
$ docker exec -it コンテナ名orコンテナID /bin/bash
Dockerコミットの解説
コンテナからイメージを作成するコマンド。通常は docker commitコマンド
$ docker commit コンテナ名orコンテナID イメージ名:タグ名
用語解説
リバースプロキシ
クライアントとサーバの通信の間に入って、サーバの応答を代理しつつ中継する機能、あるいはその役割を担うサーバのことをリバースプロキシという
環境変数
OSが設定値などを永久的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの。 Dockerではコンテナ起動時に環境変数を設定することでコンテナ起動時に外からアプリケーションで使用するパラメーターやパスワードといった秘匿情報を渡すことができる
名前解決
IPネットワークにおいて、ドメイン名やコンピュータのホスト名、コンテナ名などからコンピュータが通信時に使用するIPアドレスを検索することを指す。 IPアドレスがわからないと異なるホスト間やコンテナ間で通信できないため、名前からIPアドレスを照会するためのシステムとしてDNSが使用される。 また、DNSを使わずに名前解決する方法として、hostsと呼ばれる設定ファイルにホスト名とIPアドレスの対応を記載することで、hostsファイルを元に名前解決することもできる
hostsファイル
手動でホスト名とIPアドレスの対応を管理するための設定ファイル。名前解決のために使用される。
Automated Build(自動ビルド)とは
GithubやBitbucketといったソースコードのホスティングサービスでビルドコンテキスト(Dockerfileやその他のビルドに必要なファイル群)を管理し、リポジトリ上のビルトコンテキストの内容が変更された場合に自動的にビルドを実行する仕組みのこと ここではgithubでDockerfileが変更した場合、docker hubのイメージが変更される
Docker Machineとは
Docker Machine は仮想マシン上に Docker Engine をインストールするツール。 Docker Engineを搭載した仮想マシンの作成、起動、停止、再起動などをコマンドラインから実行できるツール。 ローカルPCだけでなく、リモートのクラウドプロパイダでDockerホストを立ち上げ管理することも可能。
用語解説
ブリッジネットワーク
同一のDockerホスト上でコンテナ間通信するために使用されるネットワーク 同一のブリッジネットワークに属するコンテナ同士は相互に通信することができる
デフォルトゲートウェイ
異なるネットワークに出る場合の出口となるIPアドレスのことをデフォルトゲートウェイと呼ぶ 例えばインターネット上のサーバーのIPアドレスと通信する場合、PCはデフォルトゲートウェイを経由してインターネットに出て対象のサーバーと通信する。 この際デフォルトゲートウェイのIPを持つネットワーク機器は異なるネットワークと通信するためのルーティング情報(経路情報)が設定されている必要がある
用語解説
ループバックアドレス
ホストが自分自身のホストを指す特殊なアドレスのこと。 127.0.0.1のアドレスがループバックアドレスを指す。 また通常localhostというホスト名は127.0.0.1を指す
オーバーレイネットワーク
複数のDockerマシン(Dockerデーモンが動作するホスト)間で相互通信を可能にするためのネットワークをオーバーレイネットワークという。 ネットワーク上に存在するホストの情報や状態管理を行うためにキーバリューストア(データベース)が別途必要になる。
Dockerのデータ管理
volumeを使用したデータ管理 ボリュームとは、Docker コンテナーにおいて生成され利用されるデータを、永続的に保持する目的で利用される仕組み コンテナにマウントして使用する。複数のコンテナにマウントできる。
Docker Composeの概要
Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツール
Compose実行のステップ
- Dockerfileを用意するか、使用するイメージをDocker Hubに用意する
- docker-compose.ymlを定義する
- docker-compose upを実行する
用語解説(ECS)
クラスタ
ECSインスタンスを管理 複数サービスを管理
ECSインスタンス
ECSエージェントが稼働するEC2インスタンス