dockerを触りそうなので、基本的な知識をインプットする。
今回のとりくみを始めるにあたっての前提
私のDockerに対する認識は...
- なんか仮想環境をいい感じに用意してくれるやつ
- クジラが潮吹いてるロゴのやつ
程度のものです.
調べ方もよく分かっていない状態からのスタートなので,たまに間違った情報が入っているかもしれませんが,見つけたらtwitterのDMとかリプライで教えていただけると嬉しいです.
Dockerとは何なのか
「公式ドキュメントには100%正しいことが書いてあるでしょ」という考えのもと,このページを和訳しながら理解を深めていきます.
概要
公式ドキュメントには,以下のように書かれていました.
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.
Docker overviewより
まとめると以下のようになるでしょうか.
- アプリ開発・提供・運用のためのオープンプラットフォームである.
- アプリが開発環境に縛られなくなるから,素早くサービス提供できる.
- 開発環境をアプリの管理と同じように管理できる.
- Dockerの便利機能を使うと,コーディングから運用までの遅れをむちゃ減らすことができる.
Dockerのプラットフォーム
- コンテナはふんわり分離されている環境[1]であり,アプリケーションのパッケージングと実行を手助けしてくれる.
- コンテナは動作が軽くて,アプリケーションの運用に必要なすべてを含んでいるため,自分の環境に必要な要素がインストールされているかを気にする必要がない.
- コンテナは同業者とのシェアが簡単で,同じ環境で作業できるようになる.
Dockerのライフサイクル[2]は以下の通り.
- コンテナを使うことで,アプリ開発とコンポーネントをサポートできる.
- コンテナはアプリケーションの配布とテストのための要素になる.
- 準備ができたら,コンテナ・組織化されたサービスとしてアプリケーションを本番環境にデプロイできる.本番環境の場所に関わらず,同じように機能する.
Dockerを「何に」使えるのか
高速で一貫性のあるアプリケーションの提供
アプリケーションやサービスを提供するローカルに存在するコンテナを使用した,標準化されたローカル環境で開発することを可能にすることで,Dockerは開発のライフサイクルを合理化する.コンテナはアプリケーションの連続的な統合や提供に特化している.
以下のようなシーンで活用できるらしい.
- コードをローカル環境で書き,Dockerコンテナを用いて同僚に成果物を共有する.
- テスト環境にアプリケーションをプッシュし,自動/手動テストを実行する.
- バグが発見されたとき,開発環境でデバッグすることが可能である.その後,テストや検証のためにテスト環境に再度デプロイすることができる.
- テストが完了したとき,本番環境にイメージをプッシュするのと同じくらい簡単に,ユーザーに修正版を提供できる.
レスポンシブなデプロイと拡張
- コンテナベースのプラットフォームは,むっちゃ移植性の高いワークロードを実現する.
- コンテナは,開発者のローカル環境が,物理的であっても仮想的であっても,データセンターであってもクラウド上であっても,環境が混ざっていても動作する.
- Dockerは移植性が高く動作が軽いため,リアルタイムのワークロードの動的管理,アプリケーションやサービスのスケールアップ/ダウンが簡単.
複数のワークロードを同じハードで実行できる
Dockerの仕組み
- Dockerはサーバクライアントのアーキテクチャ形式を採用していて,Docker clientはDocker demonと通信する(demonはDockerコンテナのビルド・実行・配布を担当してくれる).
- clientとdemonは同じシステム上で実行することができるし,リモート上のdemonに接続することもできる.
- clientとdemonはREST APIを用いて通信している.
- clientには,Docker Composeと呼ばれるものもあり,コンテナ群で構成されるアプリケーションを実行することができる.
Docker demon (dockerd)
- Dockerオブジェクトの管理と,Docker APIからのリクエストを処理している.
- 他のdemonとも通信することができ,Dockerサービスを管理できる.
Docker client (docker)
- DockerのユーザーとDockerサービスをつなぐ手段.
-
docker run
コマンドが実行されるとき,dockerはdockerdに指示を送る. -
docker
コマンドはDocker APIを活用している. - dockerは1つ以上のdockerdと通信することができる.
Dockerレジストリ
- Dockerイメージを蓄積している場所.
- Docker Hubは誰でも使える公用レジストリであり,Dockerがイメージを探す際のデフォルトのレジストリとして設定されている.
-
docker pull
やdocker run
を実行したときに,必要なイメージをレジストリからとってくる. -
docker push
を実行したとき,ローカルのイメージをレジストリにアップロードする.
Dockerオブジェクト
イメージ
- 読み取り専用のコンテナを作るためのテンプレート.
- たまにイメージは,カスタマイズされた別のイメージに基づいていることもある.例えば,個人のイメージをubuntuのイメージに基づいて作成することができる.
- 自分でイメージを作ることもできるし,他の人が作成してレジストリにアップされているイメージを使用することもできる.
- 自分のイメージを作成するとき,シンプルな文法でイメージの作成や実行に必要な手順を定義しているDockerfileを作成しなければならない.
- Dockerfileはイメージにレイヤーを一つ作成する.
- Dockerfileの中身を変更し再度ビルドするとき,変更が加わったレイヤーだけを再ビルドするため,他の仮想化技術と比べてイメージが軽量で早い.
コンテナ
- コンテナとは,イメージの実行可能なインスタンスのことを呼び,Docker APIやCLIを用いて,作成・実行・停止・移動・削除することができる.
- コンテナは,1つ以上のネットワークに接続することができ,新しいイメージを現在の状態に基づいて作成することができる.
- コンテナは他のコンテナやホストマシンと比較的よく分離されている.また,他のコンテナやホストマシンから,コンテナのネットワークやストレージをどの程度分離するのかをユーザーが制御できる.
- コンテナは,作成や実行時にイメージによって定義される.
- コンテナが削除されるとき,ストレージに保存されていないコンテナの変更は同時に削除される.
docker run
コマンドの使用例
以下のDockerコマンドを実行したときの処理を確認していく.
$ docker run -i -t ubuntu /bin/bash
- ローカル環境に
ubuntu
のイメージが存在しない場合,docker pull ubuntu
を自動的に実行しローカル環境にイメージを用意する. -
docker container create
の実行と同じように,新規コンテナを作成する. - 最終レイヤとして,コンテナにファイルシステムの入出力権限を付与し,コンテナがローカル環境のファイルシステムに変更を加えられるように設定する.
- ユーザーがネットワークオプションを設定していない場合,コンテナにネットワークインターフェースを作成する.このとき,コンテナにIPアドレスを割り当てる.デフォルトでは,ホストマシンのネットワーク接続を用いて,コンテナは外部ネットワークと通信することになる.
- コンテナが実行され,
/bin/bash
が実行される.-i
と-t
オプションを指定しているので,入力はキーボードからでき,出力はターミナル上に表示されるようになる. -
exit
コマンドを実行し/bin/bash
を終了したとき,コンテナは終了するが消去されない.そのため,再度コンテナを実行することも可能であり,別途コンテナを消去することも可能.
Dockerの中核となる技術
- DockerはGo言語で記述されており,Linuxカーネルの機能を提供することに関して利点がある.
- Dockerは
namespace
という技術を用いて,分離されたワークスペース(コンテナ)を実現している.コンテナを実行したとき,そのコンテナに対応するnamespaceが作成される. - namespaceは分離層を提供することができる.そのため,コンテナは分離されたnamespaceで実行され,namespaceが異なるためにアクセス制限が実現できている.