Docker for mac 正式版が公開されたので改めて導入手順を見てみましょう


f:id:Naotsugu:20160730000709p:plain

2016年7月28日 「Docker For Mac And Windows Is Now Generally Available And Ready For Production」というポストで Docker For Mac と Docker For Windows の正式リリースが発表されました。

2016年3月に公開された限定ベータ、パブリックベータを経た いよいよのリリースを記念して、Docker For Mac の導入手順を紹介しておきます。

blog.docker.com

Docker とは

Docker は Linux 上でコンテナ型の仮想環境を提供します。 Go言語 で開発されており、2013年3月にバージョン0.1がリリースされた比較的新しいプロダクトとなります。

仮想化の製品である VMware などは ソフトウェアにより仮想的な機械を提供し、その機械の上に OS をインストールして利用する完全仮想化を提供します。 これをハイパーバイザー型の仮想化と言います。

一方、Docker はコンテナ型の仮想化と言われます。 Linux カーネルの名前空間(ネームスペース)などを利用して、ホストOSの上にシステムリソースを隔離し、互いに干渉できないコンテナの上で仮想環境が提供されます。 コンテナ自身はホストOSの Linux カーネルを共有し、通常のアプリケーションと同等のプロセスとして管理されます。 コンテナ同士は互いに独立した環境となっており、その中で動作するアプリケーションから見るとコンテナが一つのOSのように見えます。

コンテナは Docker イメージと呼ばれるイメージファイルを元にして実行されます。 Docker イメージ にはコンテナ内で構築した設定やファイルなどの情報が含まれ、このイメージを異なるマシンでコンテナとして動作させることでイメージに含まれる環境がそのまま他の環境で簡単に再利用できるようになっています。 環境をポータブルに扱えるため、Docker は仮想サーバではなくアプリケーションのデプロイに最適化されています。

ハイパーバイザー型の仮想化と比べてコンテナー型の仮想化は OS の起動が不要であり仮想化によるオーバーヘッドも小さいことからかなり高速です。 またコンテナに加えた変更は差分情報として管理されるためディスク使用量も大幅に削減できます。 そのためホストOSの上で複数コンテナを動かすといった運用が かなり現実的に実現できます。 一方 制限事項としては仮想環境の上で異なるOSを動作させるといったことができないため Linux 限定である点があります。

Docker for Mac (Windows) とは

Docker は Linux の機能を利用しているためホスト OS には Linux が必要になります。 以前は Mac や Windows で Docker を利用する場合、Docker Toolbox という Docker 純正のツールが提供されており、VirtualBox 上で Linux を動作させ その上で Docker を動かすものでした。

Docker for Mac は OSX のネイティブアプリとして提供されています。内部では軽量なハイパーバイザーである xhyve を利用しており軽快な動作が実現できます。 xhyve は Hypervisor.framework を使っているため OSX は Yosemite 以降のOSXが必要です。

Docker for Windows は Hyper-V による仮想化が使われているため Windows 10 などの Hyper-V が利用できる環境が必要です。

Docker for Mac のインストール

Beta 版を利用していた場合には自動アップデートによりインストールできます。

f:id:Naotsugu:20160730024114p:plain

新規でインストールする場合は 公式サイトからプラットフォームに応じたインストーラを落として実行します。

f:id:Naotsugu:20160730024638p:plain

Drag & Drop して実行するとWelcomeダイアログが表示されます。

f:id:Naotsugu:20160730025903p:plain

ネットワークコンポーネントのインストールとリンクの確認ダイアログが表示されます。

f:id:Naotsugu:20160730025912p:plain

パスワード入力します。

f:id:Naotsugu:20160730030138p:plain

初回起動時にはメニューバーに説明が表示されます。

f:id:Naotsugu:20160730030149p:plain

ターミナルを開いてバージョンを確認してみましょう。

$ docker --version
Docker version 1.12.0, build 8eab29e

$ docker-compose --version
docker-compose version 1.8.0, build f3628c7

$ docker-machine --version
docker-machine version 0.8.0, build b85aac1

Beta 版の時にはバージョン番号に rc 表記が付いていましたが、正式版では rc 表記が消えています。

コンテナ の実行

コンテナを実行するには docker run コマンドを利用します。

nginx が動作する Docker イメージを取得して実行してみましょう。

$ docker run -d -p 80:80 --name webserver nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx

51f5c6a04d83: Pull complete
a3ed95caeb02: Pull complete
51d229e136d0: Pull complete
bcd41daec8cc: Pull complete
Digest: sha256:0fe6413f3e30fcc5920bc8fa769280975b10b1c26721de956e1428b9e2f29d04
Status: Downloaded newer image for nginx:latest
b3997f27f063490a3b46b73986e5c63644fcc1b964c9523f6458647a12929b1d

docker run は、nginx というイメージがローカルに存在すればそのイメージからコンテナを実行し、存在しない場合は Docker Hub からイメージを取得して実行します。

イメージはイメージ名:タグ名の形式で指定します。 タグ名を省略した場合は最新版の指定となるため、上記例では nginx:latest のイメージを取得しています。

-d でコンテナをバックグラウンドで実行、-p ホストのポート番号:コンテナのポート番号 でDocker サーバ側のホストとのポートマッピングを指定しています。

ブラウザを開いて localhost を開くと、nginx が動いていることが分かります。

f:id:Naotsugu:20160720001154p:plain


docker ps でコンテナのリストを見てみましょう。

$ docker ps
CONTAINER ID  IMAGE  COMMAND                 CREATED             STATUS             PORTS                        NAMES
b3997f27f063  nginx  "nginx -g 'daemon off"  About a minute ago  Up About a minute  0.0.0.0:80->80/tcp, 443/tcp  webserver

docker psは実行中のコンテナを一覧します。-aオプションを付けると停止中のコンテナも表示されます。


バックグラウンドで実行中のコンテナは、docker stop で停止できます。 引数にはコンテナID かコンテナ名を指定します。

$ docker stop b3997f27f063

Docker の仕組み

Docker イメージとコンテナ

Docker イメージはコンテナを作成するための定義であり、この定義を元に docker create によりコンテナが作成できます。 作成したコンテナはdocker start により実行できます。

先ほどの例で動かしたdocker run はコンテナの作成と実行を同時に行うコマンドです。

Docker イメージ は、自身の元になる Docker イメージに加えた変更分を保持することで Disk 使用量を削減しています。 この差分管理に UnionFS というファイルシステムを使っています(AUFSなどの実装)。 Docker イメージ は親となるイメージからのファイルシステムに対する変更内容の差分であり、コンテナではこれらの差分の積み上げ(Union)結果を単一のフィルシステムとして見ています。

Docker イメージは Read Only のファイルシステムです。 このイメージからコンテナを作成し、変更を加え、docker commit をすることで差分情報が新たなDockerイメージとして作成されます(docker commit を行わない場合はコンテナでの操作は残りません。DockerイメージはあくまでもRead Only です)。

Docker イメージはDocker Hubという共有のレジストリに多数登録されており、ここから取得したものをベースとして使うことで自身の環境を加えた新しいDockerイメージを作成することができます。

Dockerfile

コンテナのベースイメージと、そこに加えたアプリケーションのインストールなどの手順を記載してDocker イメージの生成を自動化することができます。 この手順を記載したものが Dockerfile です。

Docker Hub で公開されるイメージは大抵 Dockerfile も合わせて公開されており、そのイメージがどのような構成になっているかを知ることができます。

先ほど実行した nginx の Dockerfile は以下のようになっています。

FROM debian:jessie

MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"

ENV NGINX_VERSION 1.11.1-1~jessie

RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 \
  && echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.list \
  && apt-get update \
  && apt-get install --no-install-recommends --no-install-suggests -y \
      ca-certificates \
      nginx=${NGINX_VERSION} \
      nginx-module-xslt \
      nginx-module-geoip \
      nginx-module-image-filter \
      nginx-module-perl \
      nginx-module-njs \
      gettext-base \
  && rm -rf /var/lib/apt/lists/*

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
  && ln -sf /dev/stderr /var/log/nginx/error.log

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

FROM でベースとなるDockerイメージを指定し、インストールや設定を定義しています。

このファイルを docker build によりビルドすることで、Docker イメージを作成することができます。 Immutable Infrastructure を実現するための仕組みとして利用できます。 主なコマンドは以下となります。

コマンド 説明
FROM 元となるDockerイメージの指定
MAINTAINER 作成者の情報
RUN コマンドの実行
ADD ファイル/ディレクトリの追加
CMD コンテナーの実行コマンド
WORKDIR 作業ディレクトリの指定
ENV 環境変数の指定
USER 実行ユーザーの指定
EXPOSE ポートのエクスポート
VOLUME ボリュームのマウント

Dockerfile のリファレンスはこちらを参照してください。

Docker Client / Server

Docker は Client / Server 型のアーキテクチャーとなっています。 Docker の機能自体はサーバー側で実現されています。 先ほどの例ではターミナルでClientコマンドを実行し、サーバ側にコマンドに応じた要求を行いました。

ターミナルからコマンドを叩く他に REST API による要求もできます。 このような構成となっているため 別サーバにあるDockerをリモートから操作することができます。

Docker コマンド

-help オプションでコマンドの一覧を見ることができます。

$ docker -help
Usage: docker [OPTIONS] COMMAND [arg...]
       docker [ --help | -v | --version ]

A self-sufficient runtime for containers.

Options:

  --config=~/.docker              Location of client config files
  -D, --debug                     Enable debug mode
  -H, --host=[]                   Daemon socket(s) to connect to
  -h, --help                      Print usage
  -l, --log-level=info            Set the logging level
  --tls                           Use TLS; implied by --tlsverify
  --tlscacert=~/.docker/ca.pem    Trust certs signed only by this CA
  --tlscert=~/.docker/cert.pem    Path to TLS certificate file
  --tlskey=~/.docker/key.pem      Path to TLS key file
  --tlsverify                     Use TLS and verify the remote
  -v, --version                   Print version information and quit

Commands:
    attach    Attach to a running container
    build     Build an image from a Dockerfile
    commit    Create a new image from a container's changes
    cp        Copy files/folders between a container and the local filesystem
    create    Create a new container
    diff      Inspect changes on a container's filesystem
    events    Get real time events from the server
    exec      Run a command in a running container
    export    Export a container's filesystem as a tar archive
    history   Show the history of an image
    images    List images
    import    Import the contents from a tarball to create a filesystem image
    info      Display system-wide information
    inspect   Return low-level information on a container, image or task
    kill      Kill one or more running container
    load      Load an image from a tar archive or STDIN
    login     Log in to a Docker registry.
    logout    Log out from a Docker registry.
    logs      Fetch the logs of a container
    network   Manage Docker networks
    node      Manage Docker Swarm nodes
    pause     Pause all processes within one or more containers
    port      List port mappings or a specific mapping for the container
    ps        List containers
    pull      Pull an image or a repository from a registry
    push      Push an image or a repository to a registry
    rename    Rename a container
    restart   Restart a container
    rm        Remove one or more containers
    rmi       Remove one or more images
    run       Run a command in a new container
    save      Save one or more images to a tar archive (streamed to STDOUT by default)
    search    Search the Docker Hub for images
    service   Manage Docker services
    start     Start one or more stopped containers
    stats     Display a live stream of container(s) resource usage statistics
    stop      Stop one or more running containers
    swarm     Manage Docker Swarm
    tag       Tag an image into a repository
    top       Display the running processes of a container
    unpause   Unpause all processes within one or more containers
    update    Update configuration of one or more containers
    version   Show the Docker version information
    volume    Manage Docker volumes
    wait      Block until a container stops, then print its exit code

Run 'docker COMMAND --help' for more information on a command.

たくさんありますね。

コマンドの詳細は以下のように確認できます。

$ docker pull --help

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Pull an image or a repository from a registry

Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --help                    Print usage

Docker 基本コマンド

よく使う主なコマンドを見てみましょう。

イメージまたはリポジトリをレジストリから取得(pull)
$ docker pull NAME[:TAG]

タグを指定しない場合は最新版の取得になります

コンテナイメージの一覧表示
$ docker images
イメージからコンテナを作成
$ docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

create は停止状態のコンテナを作成します。

コンテナを起動(start)
$ docker start CONTAINER
コンテナを停止(stop)
$ docker stop CONTAINER
コンテナの強制終了(kill)
$ docker kill CONTAINER
コンテナの実行状態表示(ps)
$ docker ps

-a ですべてのコンテナを表示します(デフォルトでは動作中のもののみ)。

コンテナを削除(rm)
$ docker rm CONTAINER
イメージを削除(rmi)
$ docker rmi IMAGE
新しいコンテナ内でコマンドを実行(run)
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • -d:バックグラウンドで実行
  • -i:コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定
  • -t:tty(端末デバイス)を確保する。/bin/bashなどでコンテナーを操作する際に指定
  • -p ホストのポート番号:コンテナのポート番号:ポートマッピングを構成

Ubuntu の実行 $ docker run -i -t ubuntu /bin/bash

Hello Worldの実行 $ docker run hello-world

nginxの実行 $ docker run -p 8080:80 nginx

実行中コンテナへの接続(attach)
$ docker attach CONTAINER

バックグラウンドで実行しているコンテナがフォアグラウンドになります

コンテナのビルド(build)
$ docker build PATH

Dockerfile のパスを指定します。-t で作成するDockerイメージのイメージ名とタグ名を指定できます。

コンテナイメージの保存(commit)
$ docker commit CONTAINER

-m でコミットメッセージ、-a で作者を指定します。



Docker実戦活用ガイド

Docker実戦活用ガイド

Docker 実践ガイド (impress top gear)

Docker 実践ガイド (impress top gear)