tkrd-stack

学習ノート

自分の理解を深めるための技術メモ

← 一覧に戻る

Docker

Docker

概要

Docker はアプリケーションを開発(developing)、移動(shipping)、実行(running)するためのオープンなプラットフォームです。Docker はインフラストラクチャとアプリケーションを切り離すため、ソフトウェアを短時間で提供できます。Docker があれば、アプリケーションを管理するのと同じ方法で、あなたのインフラも管理できます。Docker 的な手法を最大限活用しますと、テストやコードのデプロイを素早くできますので、コードを書いてから、プロダクション(実行環境)で動かすまでにかかる時間を著しく軽減できます。

Docker デーモン

Docker デーモン( 

dockerd
 )は Docker API リクエストを受け付け、イメージ、コンテナ、ネットワーク、ボリュームといった Docker オブジェクトを管理します。また、Docker サービスを管理するため、他のデーモンとも通信を行います。

Docker クライアント

Docker クライアント( 

docker
 )は Docker とのやりとりを行うために、たいていのユーザが利用するものです。
docker run
  のようなコマンドが実行されると、Docker クライアントは  
dockerd
  にそのコマンドを伝えます。そして  
dockerd
  はその内容を実現します。
docker
  コマンドは Docker API を利用しています。Docker クライアントは複数のデーモンと通信することができます。

Docker レジストリ

Docker レジストリは Docker イメージを保管します。Docker Hub は公開レジストリであり、誰でも利用可能です。また Docker はデフォルトで Docker Hub のイメージを探すよう設定されています。独自にプライベート・レジストリを運用することもできます。

docker pull
  や  
docker run
  コマンドを使うと、設定されたレジストリから必要なイメージを取得します。 
docker push
  コマンドを使えば、イメージを指定したレジストリに送信します。

Docker オブジェクト

Docker の利用時は、イメージ、コンテナ、ネットワーク、ボリューム、プラグインや、その他のオブジェクトを作成・利用します。このセクションは各オブジェクトの概要を説明します。

イメージ

イメージ( 

image
 )とは、Docker コンテナを作成する命令が入った読み込み専用のテンプレートです。通常イメージは、他のイメージをベースにしてそれをカスタマイズして利用します。

たとえば  

ubuntu
  イメージをベースとするイメージを作ったとします。そこには Apache ウェブ・サーバや自開発したアプリケーションといったものをインストールするかもしれません。さらにアプリケーション実行に必要となる詳細な設定も加えることにもなるでしょう。

イメージは作ろうと思えば作ることができ、他の方が作ってレジストリに公開されているイメージを使うということもできます。イメージを自分で作る場合は Dockerfile というファイルを生成します。このファイルの文法は単純なものであり、そこにはイメージを生成して実行するまでの手順が定義されます。Dockerfile 内の個々の命令ごとに、イメージ内にはレイヤというものが生成されます。Dockerfile の内容を書き換えたことでイメージが再構築されるときには、変更がかかったレイヤのみが再生成されます。他の仮想化技術に比べて Docker イメージというものが軽量、小さい、早いを実現できているのも、そういった部分があるからです。

コンテナ

コンテナとは、イメージが実行状態となったインスタンスのことです。コンテナに対する生成、開始、停止、移動、削除は Docker API や CLI を使って行われます。コンテナは、複数のネットワークへの接続、ストレージの追加を行うことができ、さらには現時点の状態にもとづいた新たなイメージを生成することもできます。

デフォルトでは、コンテナは他のコンテナやホストマシンとは、程よく分離されています。コンテナに属するネットワーク、ストレージ、基盤となるサブシステムなどを、いかにして他のコンテナやホストマシンから切り離すか、その程度は制御することが可能です。

コンテナはイメージによって定義されるものです。またこれを生成、実行するために設定したオプションによっても定義されます。コンテナを削除すると、その時点での状態に対して変更がかかっていたとしても、永続的なストレージに保存されていないものは消失します。

docker run
  コマンドの例

次のコマンドは  

ubuntu
  コンテナを実行し、ローカルのコマンドライン処理のセッションを結びつけます。そして  
/bin/bash
  を実行します。

$ docker run -i -t ubuntu /bin/bash

このコマンドを実行すると、以下のようになります(デフォルトのレジストリ設定を使用している想定です)。

  1. ubuntu
      イメージがローカルになければ、Docker は設定されているレジストリからイメージを取得します。この動作は手動で  
    docker pull ubuntu
      を実行するのと同じです。
  2. Docker は新しいコンテナを作成します。これは手動で  
    docker create
      コマンドを実行するのと同じです。
  3. Docker はコンテナに対して読み書き可能なファイルシステムを、最後のレイヤとして割り当てます。このため、実行中のコンテナは、コンテナ内のローカルなファイルシステムで、ファイルやディレクトリの生成や変更ができます。
  4. Docker はネットワーク・インターフェースを生成し、コンテナをデフォルト・ネットワークに接続します。これは、ネットワークのオプションを一切指定していないからです。この処理には、コンテナに対する IP アドレスの割り当ても含みます。デフォルトでは、コンテナが外部ネットワークに接続するには、ホストマシンのネットワーク接続を利用します。
  5. Docker はコンテナを起動し、 
    /bin/bash
      を実行します。コンテナは( 
    i
      と  
    t
      のフラグにより)対話的に、かつターミナルに接続して実行しているため、手元のキーボードを使って入力でき、その間の出力はターミナル上に表示されます。
  6. exit
      を入力すると、 
    /bin/bash
      コマンドは終了します。コンテナは停止状態となりますが、削除はされません。コンテナは再起動や削除できます。