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 の導入手順を紹介しておきます。
- Docker とは
- Docker for Mac (Windows) とは
- Docker for Mac のインストール
- コンテナ の実行
- Docker の仕組み
- Docker コマンド
- Docker 基本コマンド
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 版を利用していた場合には自動アップデートによりインストールできます。
新規でインストールする場合は 公式サイトからプラットフォームに応じたインストーラを落として実行します。
Drag & Drop して実行するとWelcomeダイアログが表示されます。
ネットワークコンポーネントのインストールとリンクの確認ダイアログが表示されます。
パスワード入力します。
初回起動時にはメニューバーに説明が表示されます。
ターミナルを開いてバージョンを確認してみましょう。
$ 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 が動いていることが分かります。
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
で作者を指定します。
- 作者: 吉岡恒夫,paiza
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/05/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
Docker 実践ガイド (impress top gear)
- 作者: 古賀政純
- 出版社/メーカー: インプレス
- 発売日: 2015/12/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
- メディア:
- この商品を含むブログを見る