Edit
Dockerとは。

Dockerはソフトウェアコンテナ内のアプリケーションのデプロイメントを自動化するオープンソースソフトウェアである。LinuxカーネルにおけるLXCと呼ばれるLinuxコンテナ技術とAufsという特殊なファイルシステムを利用してコンテナ型の仮想化を行う。(Wikipedia)

公式ページ

Edit
他の仮想化との違い

他の仮想化との大きな違いは、厳密にはハード(xen,kvm)などの仮想化などと違い、あくまでホストOSのプロセスの1つとして動作し、chrootのようなファイルアクセス範囲の制限などで、ゲストOSを1つの環境に見立てているため、論理上のハードウェアエミュレーションのような、オーバーヘッドがほとんど存在しない。

<特に注意するべき点>
dockerは環境をソースのような形で定義できるようにすることで、メンテナンス性を高めており、複雑化した環境設定を視覚化している。そのためコンテナという概念は、サブバージョンのような、更新履歴の概念で管理され、一般的な仮想化システムにおけるゲストOSのような概念ではない。

ようするに、コマンドを実行するたびに、コンテナを作成していくことで、環境変更の履歴がすべて、コンテナとして残る。また、そのコンテナから新しいコンテナと実行コマンドを指定して、さらにコンテナを作成し、それらを繰り返し後、すべての環境が設定された時点で、commit してコンテナイメージとして作成し配布イメージとする。

もちろん、最初のコンテナ作成時にシェルを指定して、通常の仮想化システムのように、シェルを通じて環境を整備することも可能だが、それらの環境整備の履歴は当然のこらないので、出来上がったコンテナのみを使いまわすことになる。

Edit
インストール

ここでは、Centos7 をベースとする。基本は yum で下記のようにインストールする。

# yum install docker

<起動>

# systemctl enable docker
# systemctl start docker

<確認>

# docker info

Edit
コンテナイメージの作成について

コンテナイメージの作成は、Dockerfile に記述し、それをビルドすることで実現できる。

Edit
Dockerfileについて

このファイルでは、下記の指定ができる。

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

<例>

# vi Dockerfile
 FROM centos:latest               <- 元イメージ必須。
 RUN yum install -y wget

Edit
ビルド

# docker build -t <イメージファイル名> ./     <- 最後の指定はdockerfileのあるフォルダを指定

<ビルドの確認>

#docker images

Edit
コンテナイメージの操作

<イメージ削除>

# docker rmi <イメージファイル名>

※<イメージファイル名>は、ユーザー名/イメージファイル名 で構成される。ただしトップレベルイメージは別。

Edit
リポジトリーからのイメージ取得

docker hubからすでに作成済みのdocker コンテナイメージをダウンロードできる。ちょっとしたツールのテストなどでは、重宝する。

# docker pull <イメージファイル名>:<tag>

基本的にはイメージファイル名は、投稿したユーザー名/イメージファイル名で構成されるが、centos のように、トップレベルリポジトリのものは、投稿したユーザー名が無い場合がある。

<ダウンロードしたコンテナイメージの一覧表示>

# docker images

Edit
コンテナの実行

通常の仮想化のように、利用するのであれば、centos などコンテナイメージなどをダウンロードして、実行されるだけでよい。

# docker pull centos:latest
# docker run -it --name centos_image01 centos:latest /bin/sh

これで、centos:latest というコンテナイメージから、centos_image01 という新しいコンテナが起動し、/bin/sh を起動するので、コンテナのコンソールとして、新しいコマンドプロンプトが表示される。この場合、コンテナのコマンドプロンプトからホストOSに戻る場合は、ctrl + D で起動時に指定したプログラム(上記の場合 /bin/sh )が終了するため元のホストOSのコンソールに戻れる。(同時に作成されたコンテナも停止状態になる)

Edit
ホストのドライブをコンテナに割り振り

オプション -v <ホストのフォルダ位置>:<コンテナのフォルダ位置> で指定できる。

<例>

# docker run -it -v /usr/local/src:/src centos /bin/sh

ただしこの場合、read-only となる。書き込みを許可する場合には、さらに --privileged オプションを指定する。

# docker run --privileged -it -v /usr/local/src:/src centos /bin/sh

Edit
ホストのポートを、コンテナのポートに割り当て

オプション -p host_port:conteiner_port

<例>

# docker run -it -p 8080:80 centos /bin/sh

Edit
現在実行中+停止中のコンテナ一覧

# docker ps -a    (-a を指定しないと実行中のみ、-q だとIDのみスクリプトに便利)

Edit
現在実行中のコンテナでコマンド実行

# docker exec centos_image01 /bin/sh

※停止中のコンテナは、すでにコンテナとして実行終了しているので、exec コマンドでは、命令をコンテナに与えられない。

Edit
コンテナの操作

<一時停止(StatusがUpのものだけ)>

# docker pause <コンテナ名>

<一時停止の解除(STATUSが pauseのものだけ)>

# docker unpause <コンテナ名>

<コンテナの停止(shutdown:StatusがUpのものだけ)>

# docker stop <コンテナ名>

<コンテナの再起動(Statusが、Exited (-1)のものだけ)>

# docker start <コンテナ名>

<コンテナの削除>

# docker rm <コンテナ名>

<コンテナの全削除>

# docker rm 'docker ps --no-trunc -aq'

<ログ表示>

# docker logs <コンテナ名>

<起動中のコンテナのコンソールに接続>

# docker attach <コンテナ名>

※注意:現在のコンソールと、コンテナのコンソールを接続するが、キーコントロールが入力できないので、元のホストのコンソールに戻ってこれなくなる。他のシェルを起動して、doccker stop でコンテナを停止させると、戻ってくる。

<コンテナの詳細表示>

# docker inspect <コンテナ名>

Edit
コンテナイメージの作成

<コンテナからコンテナイメージの作成>

# docker commit <コンテナ名> <ユーザー名/イメージファイル名>

※上記にあるように、ユーザー名/ をイメージファイル名の頭につけること。

<コンテナイメージをdockerサイトのリポジトリに登録>

 # docker push <ユーザー名/イメージファイル名>

※公開されてしまうので、pushは十分に注意の上実行