paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

Dockerのすべてが5分でわかるまとめ!(コマンド一覧付き)

f:id:paiza:20160607145104p:plain

f:id:paiza:20151217152725j:plainこんにちは、吉岡(@)です。
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を動かします。

f:id:paiza:20160614162920p:plain

コンテナ(Docker)と仮想マシンを比較すると、以下のようになります。コンテナ(Docker)は、早い、リソース消費が少ない、OSはLinuxのみ、という特徴があります。

コンテナ(Docker) 仮想マシン
起動 早い 遅い
リソース消費 少ない 多い
OS Linuxのみ 何でも可

Dockerの人気

Google TrendsではDockerキーワードの人気度は以下のように増えてきています。

f:id:paiza:20160614170146p:plain (Google Trendsより)

また、以下のように、DevOpsでの利用が昨年の倍に増えているという統計もあります。

f:id:paiza:20160602180145p:plain ( New DevOps Trends: 2016 State of the Cloud Survey より)

GoogleAmazon(AWS)なども、コンテナを利用したサービスも出しています。

Dockerのインストール

Dockerのインストールは、以下のツールを使います。

paiza.hatenablog.com

Dockerの構成(5つの要素)

Dockerでは、大きく5つの重要な要素があり、図のような関連があります。

f:id:paiza:20160614163358p:plain

コンテナ

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(レジストリ)

ネットワーク

ボリューム操作

Swarmクラスタ

プラグイン

その他

Dockerfile

Dockerイメージの構築方法をコードとして記述するファイルです。 元となるイメージや、実行するコマンドを記述します。

Dockerfileの例(nginx):

# Nginx
#
# VERSION               0.0.1

FROM      ubuntu
MAINTAINER Victor Vieux <victor@docker.com>

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.hatenablog.com

Docker実戦活用ガイド

Docker実戦活用ガイド




関連記事:



記事更新履歴:

  • 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エンジニアとしてのスキルレベル測定(9言語に対応)や、プログラミング問題による学習コンテンツ(paiza Learning)を提供(こちらは21言語に対応)しています。テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。

http://paiza.jp