こんにちは、吉岡(@yoshiokatsuneo)です。
Dockerはシンプルで軽量な仮想環境という特徴から急速に広まっており、paizaでも利用しています。ただし、発展が早いことから、断片的な情報や古い情報などもあります。そこで、ここでは今のDocker(Ver1.13: 2017/1/20更新)について、5分でわかるように簡単にまとめてみます。
目次
Dockerの特徴
Dockerは、Linux上のシンプルで軽量な仮想環境(コンテナ)で以下の特徴があります。
早い・軽い
OSレベルの仮想化なので、起動は一瞬です。コンテナ間でイメージを共有できるので、コンテナの起動自体ではディスクは消費しません。
Dockerイメージ、Docker Hub
コンテナで利用するファイル・設定はDockerイメージとして、保存・再利用できます。 Docker Hubでは、多くのイメージ(30万以上)が公開されています。
設定の明示、ビルド自動化
Dockerfile等の設定ファイルを利用し、設定をコードとして明示的に記述することで、ミスを防ぎ変更を容易にします。
アプリケーション指向
アプリケーションのビルド・実行・デプロイを簡単・便利に行う、ことを主な目的としています。
柔軟・自由
個々のツールは独立しており、様々な用途で利用することができます。最近では、コンポーネント化を更に進めています。(runC, swarmkitなど)
充実したエコシステム
アーキテクチャがしっかりしており、API・ドキュメントが整備されていることから、周辺ツールなどのエコシステムが充実しています。
充実した純正ツール
クラスタ(Docker Swarm)・クラウド(Docker Cloud)・レジストリ(Docker Hub)・インストーラ(Docker Toolbox, Docker for Mac)・GUIツール(Kitematic)などの純正ツールが充実していることから、互換性などにわずらわされず利用できます。
コンテナと仮想マシンの違い
コンテナはOSレベルの仮想化を行いその上でプロセスを動かしますが、仮想マシンはマシンレベルの仮想化を行いその上でゲストOSを動かします。
コンテナ(Docker)と仮想マシンを比較すると、以下のようになります。コンテナ(Docker)は、早い、リソース消費が少ない、OSはLinuxのみ、という特徴があります。
コンテナ(Docker) | 仮想マシン | |
---|---|---|
起動 | 早い | 遅い |
リソース消費 | 少ない | 多い |
OS | Linuxのみ | 何でも可 |
Dockerの人気
Google TrendsではDockerキーワードの人気度は以下のように増えてきています。
(Google Trendsより)
また、以下のように、DevOpsでの利用が昨年の倍に増えているという統計もあります。
( New DevOps Trends: 2016 State of the Cloud Survey より)
Google・Amazon(AWS)なども、コンテナを利用したサービスも出しています。
- Google GKE(Google Container Engine), Google GCR(Google Container Registry)
- Amazon ECS(EC2 Container Service)、Amazon ECR(EC2 Container Registry)
Dockerのインストール
Dockerのインストールは、以下のツールを使います。
Dockerの構成(5つの要素)
Dockerでは、大きく5つの重要な要素があり、図のような関連があります。
コンテナ
Dockerイメージから作られ、実行される仮想環境です。
Dockerイメージ
コンテナのファイルシステム、設定をひとまとめに保存しています。
Dockerサーバ
Docker本体ともいえる、コンテナ・イメージの管理を行うサービスです。
Dockerクライアント
ユーザが実際にDockerを操作すル時に使うコマンド、GUIツールです。Dockerを利用する周辺ツールも含まれます。
Docker Hub(レジストリ)
Dockerイメージを集めたサイトです。OS、アプリケーションのイメージが多く公開されており、誰でも自由に利用できます。
Dockerの基本コマンド
Dockerを動かすのに必要な重要コマンドを紹介します。Docker Toolboxでインストールした場合は「Docker Quickstart Terminal」を起動してコマンドを入力します。Docker for Macでは、「ターミナル」アプリケーションで、直接コマンドを入力できます。
実行(docker run)
指定したDockerイメージを実行します。
例: Hello Worldの実行
$ docker run hello-world
例: Ubuntuの実行
$ docker run -i -t ubuntu /bin/bash
例: Nginxの実行(8080番で実行)
$ docker run -p 8080:80 nginx
コンテナの一覧(docker ps)
実行中のコンテナ一覧を表示します。(-aで停止しているコンテナも表示します)
$ docker ps
終了(docker kill)
指定したDockerイメージを終了します。(削除はされません)
$ docker kill [コンテナID/名前]
削除(docker rm)
コンテナを削除します。
$ docker rm [コンテナID/名前]
Dockerコマンド一覧
Dockerコマンドは数多くありますが、概要をまとめてみます。詳しくはヘルプやDockerサイトを参照してください。
コンテナ操作
- attach コンテナにアタッチ
- cp コンテナ・ホスト間でのファイルコピー
- create コンテナ作成
- diff コンテナのファイルシステム差分表示
- exec 既存コンテナでコマンド実行
- export コンテナをtarファイルで保存
- history コンテナの履歴を表示
- import tarファイルからコンテナ作成
- inspect コンテナ・イメージの情報表示
- kill コンテナの終了
- logs コンテナのログ(出力)取得
- pause コンテナの一時停止
- port 公開ポートの表示
- ps コンテナ一覧表示
- rename コンテナ名の変更
- restart コンテナの再起動
- rm コンテナの削除
- run コンテナの実行
- start コンテナの実行
- stats コンテナのリソース利用状況表示
- stop コンテナの停止
- top コンテナの実行状況表示
- unpause コンテナの再開
- update コンテナの設定を動的に変更
- wait コンテナの終了を待つ
イメージ操作
- build イメージのビルド
- commit コンテナからイメージ作成
- images イメージ一覧表示
- inspect コンテナ・イメージの情報表示
- load tarファイルからイメージ作成
- rmi イメージの削除
- save イメージをtar保存
- tag イメージにタグ名を設定
Docker Hub(レジストリ)
- login Docker Hub(レジストリ)にログイン
- logout Docker Hub(レジストリ)からログアウト
- pull Docker Hub(レジストリ)からコンテナ取得
- push Docker Hub(レジストリ)にコンテナ保存
- search Docker Hub(レジストリ)の検索
ネットワーク
- network connect コンテナをネットワークに接続
- network create ネットワーク作成
- network disconnect コンテナのネットワークからの切断
- network inspect ネットワークの状態表示
- network ls ネットワーク一覧
- network rm ネットワークの削除
ボリューム操作
- volume create ボリュームの作成
- volume inspect ボリュームの内容表示
- volume ls ボリュームの一覧表示
- volume rm ボリュームの削除
Swarmクラスタ
- node accept Swarmノードをクラスタに追加
- node demote Swarmノードをマネージャからワーカーに降格
- node inspect Swarmノードの状態表示
- node ls Swarmノードの一覧表示
- node promote Swarmノードをワーカからマネージャに昇格
- node rm Swarmノードをクラスタから削除
- service create Swarmクラスタ上にサービス作成
- service inspect Swarmクラスタ上にサービス状態表示
- service ls Swarmクラスタ上のサービ一覧表示
- service rm Swarmクラスタ上のサービス削除
- service scale Swarmクラスタ上のサービスのコンテナ数(task)変更
- service task Swarmクラスタ上のサービスのコンテナ(task)一覧表示
- service update Swarmクラスタ上のサービスの設定変更
- swarm init Swarmクラスタの作成
- swarm join Swarmクラスタへのノード追加
- swarm leave Swarmクラスタからのノード削除
- swarm update Swarmクラスタの設定変更
プラグイン
- plugin disable プラグインの無効化
- plugin enable プラグインの有効化
- plugin inspect プラグインの状態表示
- plugin install プラグインのインストール
- plugin ls プラグインの一覧表示
- plugin rm プラグインの削除
その他
- daemon サーバ起動
- events イベントの監視
- info Dockerの情報表示
- system df ディスク利用状況の表示
- system prune 不要なファイルの削除
- version バージョン表示
Dockerfile
Dockerイメージの構築方法をコードとして記述するファイルです。 元となるイメージや、実行するコマンドを記述します。
Dockerfileの例(nginx):
# Nginx # # VERSION 0.0.1 FROM ubuntu MAINTAINER Victor Vieux <[email protected]> LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0" RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
Dockerイメージの構築コマンド例:
$ docker build -t mynginx .
Dockerの仕組み
Dockerでは、コンテナを実現するために以下のLinuxの機能を利用します。
chroot
コンテナごとにファイルシステム空間を分けます
スタッカブルファイルシステム
ファイルシステムの階層を利用することで、ディスクを効率良く利用します。
ネームスペース
コンテナごとに名前空間を分けます。 名前空間には、プロセス・ネットワーク・IPC・マウント・ホスト名・ユーザがあります。
cgroups
CPU、メモリ、ディスク入出力等のリソース管理を行います。
Dockerの純正ツール
Dockerは、以下のような純正ツール・サービスを提供しています。
Docker Engine
Docker本体ともいえる、コンテナ・イメージの管理・実行を行うツールです。
Docker Hub(レジストリ)
Dockerイメージを集めたサイトです。OS、アプリケーションのイメージが多く公開されており、誰でも自由に利用できます。
Docker Toolbox
Mac, Windows上でDockerを利用するためのインストーラです。VirtualBoxの仮想マシンの上でLinux、Dockerサーバを動作させます。
Docker for Mac
Mac上でDockerを利用するためのインストーラです。VirtualBox不要でMacと密に統合されており、Docker Toolboxより、遥かに便利に利用できます。 VirtualBoxと同時に利用できます。
Docker for Windows
Windows上でDockerを利用するインストーラです。VirtualBox不要でWindowsと密に統合されています。VirtualBoxと同時には利用できません。
Kitematic
GUI操作でDockerが利用できるツール(クライアント)です。
Docker Machine, Docker Swarm, Docker Compose
クラスタ環境にアプリケーションを展開するためのツールです。Docker MachineはDockerホストを構築し、Docker Swarmがクラスタを管理し、Docker Composeがアプリケーションの展開を行います。
Docker Cloud
ウェブ上で、Dockerホストの管理や、アプリケーションのデプロイが行えるツールです。
考え方
Dockerに関連して、ソフトウェア・インフラのあり方に影響を与える考え方が出てきています。
Immutable Infrastructure
従来、サーバは常時動作しており、設定やアプリケーションは適時変更していました。手動で設定するとミスが発生しますし、構成管理ツール(Puppet, Chef, Ansible等)を使っても完全にすべてのサーバを同じ状態に保つことは難しいです。Immutable Infrastructureでは、サーバ起動後、設定を変更したりアプリケーションをインストールせず、必要に応じてコンテナを作り直します。 これにより、適用忘れやサーバごとに状態が変わることを確実に避けます。
マイクロサービス(Micro Service)
軽量で起動が早いというコンテナの特徴を生かすことで、アプリケーション・プロセスなど小さい単位でコンテナを分離します。これにより、依存関係が減り、開発やアップデートが容易になります。
Infrastructure as Code
マシンの状態をコードで記述するという考え方です。コードで記述し自動化することで、ミスを減らし変更・管理が容易になります。
DevOps
従来、物理マシンの管理(インフラ)、ソフトウェアの開発は役割が分離されていました。しかし、マシンの仮想化が進み、インフラの状態をコードとして記述できることから、ソフトウェア開発とマシンの管理を密に統合し、効率よく開発するという考えが生まれています。
Windowsコンテナ
現時点では、DockerはLinux上のコンテナと言っていいです。Windows上で動かす場合も、Windows上の仮想マシン上のLinux上でDockerが動いています。しかし、今後状況が変わる可能性があります。Windows Server 2016では、WindowsコンテナがDockerプロトコルをサポートする予定です。これにより、WindowsがDocker上で動くようにになります。
まとめ
Dockerの発展は早いですが、基本的なアーキテクチャはしっかりしており、基本を理解すればDocker以外にも考え方は応用できます。
是非Dockerに触れてみてください。
手前味噌ですが、本記事の説明の詳細は以下の書籍『Docker実戦活用ガイド』にも記載していますので、こちらもよろしければ手に取ってみてください。
- 作者: 吉岡恒夫,paiza
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/05/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
関連記事:
- Docker for Mac プライベートベータを早速使ってみた! - paiza開発日誌
- paizaの中の人による2016年のDocker本『Docker実戦活用ガイド』が本日発売! - paiza開発日誌
- ある社内プログラマが初めて技術書(『Docker実戦活用ガイド』)を出版するまで - paiza開発日誌
- 今からでも遅くない! Dockerをしっかり学ぶための書籍全10冊まとめ - paiza開発日誌
- Dockerは危険という誤解と、本当に注意すべき点 - paiza開発日誌
記事更新履歴:
- 2016/6/21変更: Docker for Mac, Docker for Windowsがプライベートベータからパブリックベータになりましたので、記述を変更しました。
- 2016/6/22変更: Docker1.12で追加されたSwarmクラスタ関連、プラグイン関連のコマンドを一覧に追加。
- 2017/1/20変更: Docker1.13で追加された"docker system df"、"docker system prune"コマンドを一覧に追加。Docker for Mac、Docker for Windowsは正式版ですので、「ベータ版」の記述を削除。タイトルを2017年版に変更。
paizaは、技術を追い続けることが仕事につながり、スキルのある人がきちんと評価される場を作ることで、日本のITエンジニアの地位向上を目指したいと考えています。
自分のスキルを磨いていきたいと考えている方におすすめなのが「paizaラーニング」。オンラインでプログラミングしながらスキルアップできる入門学習コンテンツです。初心者でも楽しくプログラミングの基本を学ぶことができます。
そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。
スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。