いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.263 / 読者数:2646名

こんばんは、うすだです。

先週発行するはずが、まったく余裕がなく、 1文字も書くことなく当日を過ごしてしまいました。ももも申し訳ございません。

世間では、ちょうどお盆休みに入ろうとしているところですが、 その休みを利用して、えいやーで書いております。

といっても、とくにお盆休みをとる予定はなく、世間が休んでいる間に、 いろいろな遅れを取り戻そうという魂胆です。

下手に、あれもこれもと欲張らず、ほんとにやるべきことを、1つか2つに絞って、 集中してやりたいと思っています。

今までの経験で、ようやくわかった、数少ない教訓のうちのひとつです。

はい、うだうだ言ってないで、今回もさっさとはりきってまいりますね。

今回のお題 - Docker を使ってみる (レベル:初級)

最近は、パワフルなサーバをどーんと購入して、 仮想化技術を使ってOSをわらわらと動かす、という使い方が増えているように思います。

そうでなくても、個人のPCでもマルチコアは当たり前になり、 VirtualBoxなどで複数のOSを難なく使えるようになってきました。

とはいえ、CPUとメモリとディスクのリソースは、あればあるだけ使ってしまうのが、 人間の性というものではないでしょうか。

となると、中で動かすゲストOSをなるべく軽く動かせた方がありがたい、 ということになりますよね。

というわけで今回は、最近はやりの「Docker」の概要と使い方を、 簡単に紹介したいと思います。

仮想化の種類をざっくり

最初に、仮想化の種類を、さらっと紹介します。
興味のない方、すでにご存じな方は、すっ飛ばしてください。

 

ハードウェア自体をまるっと仮想化する方式が、 「ハイパーバイザ型」や「ホストOS型」と呼ばれるものです。

中で動くゲストOSは、仮想マシンの配下にあることを意識する必要がないため、 たいていのOSがそのまま動きます。

その反面、ゲストOSに気づかれないよう、 特権命令やデバイスへの操作をエミュレートする必要があるため、 オーバーヘッドがかかります。
(ゲストOSが仮想マシン配下で動いていることを知っている 「準仮想化」という方法もあります。知ってる分オーバーヘッドを小さくできます。)

ホストOS型では、普通のOSで仮想化ソフトウェアを動かします。 プロセスの中でゲストOSが動作するため、パフォーマンスはよろしくありません。
ですが、仮想化ソフトを入れるだけなので、お手軽に使えます。
VirtualBox、VMware Workstationなどがこれに相当します。

ハイパーバイザ型では、普通のOSのカーネルではなく、 専用のカーネルである「ハイパーバイザ」を動かします。 ハイパーバイザの配下でゲストOSが動作するため、 ホストOS型よりもオーバーヘッドは小さくて済みます。
ただ、設定や確認をするためのインタフェースが独特だったりします。
Xen、VMware ESX、Hyper-Vなどがこれに相当します。

 

これに対して、カーネルは共通で(単一で)、ファイルシステム、 プロセスやネットワークなどのリソースを隔離することで仮想化を実現しているのが 「コンテナ型」と呼ばれるものです。

ホストOS のカーネルでゲストOS(「コンテナ」と言います) のプロセスがそのまま動作しますので、オーバーヘッドはかなり小さくなります。
ただ、Linuxの中でWindowsを動かす、といったようなことはできません。
(ですので、同じLinuxでも、 カーネルのバージョンが違いすぎて動かないということはありえます。)

Linuxでは、「LXC(Linux Containers)」がこれに相当します。以前に紹介した、 cgroups や namespace などを駆使して実現しています。
FreeBSDのjailや、SolarisのContainer(Zone)も、これに相当します。

Vol.228 - cgroup について理解する
http://www.usupi.org/sysad/228.html
Vol.229 - cgroup でメモリと走行時間に制限を加える
http://www.usupi.org/sysad/229.html
Vol.260 - namespace を使ってみる
http://www.usupi.org/sysad/260.html
Vol.261 - namespace をもう少し使ってみる
http://www.usupi.org/sysad/261.html

 

というわけで、あんまりさらっとじゃない説明でした。

で、Docker とは?

さて、今回のテーマである「Docker」は、前述のLXCと、 「AUFS(Another Union FileSystem)」を使った、コンテナを管理するためのソフトです。

AUFSとは、あるファイルシステムに重ね合わせてマウントできるファイルシステムです。

Docker では、もとのイメージはそのままにしておき、 AUFSを使って変更の差分をとっておきます。
こうすることで、もとのイメージから複数のコンテナを作って動かすことができます。

ちなみに、AUFS は、だいぶ昔に少ーしだけ紹介しておりました。

Vol.187 - 複数のディレクトリを束ねてマウントする
http://www.usupi.org/sysad/187.html

…はい、説明になっていませんが、このくらいで説明は終わりにします。

Docker のインストール

以降は、ひたすら手を動かしていきます。まずはインストールです。

Ubuntu 14.04 の場合は、「docker.io」パッケージを入れるだけです。
(docker はまったく別のソフトです。ご注意くださいませ。)

  $ sudo apt-get install docker.io

Ubuntuでは、パッケージを入れると、 サービスの自動起動の設定や起動が即座に行われます。

CentOS 7 では、「docker」パッケージを入れます。
Fedora 20 では、「docker-io」パッケージを入れます。
(Fedora でも、Ubuntu と同様 docker は別モノです。ご注意ください。)

  # yum install docker     (CentOS の場合)
  # yum install docker-io  (Fedora の場合)

どちらも、サービスの自動起動の設定や起動は勝手にされないため、 下記のように手動で行います。

  # systemctl enable docker  (OS起動時に自動起動にしたいなら)
  # systemctl start docker   (とりあえず今起動するには)

コンテナを作って動かします

Dockerでは、「docker」というコマンドで操作を行います。
ただ、Ubuntu では「docker.io」というコマンド名になります。
以降では、Ubuntu に合わせて docker.io と記載しています。 CentOS や Fedora をお使いの貴兄は、脳内で docker に変換してご覧ください。

まず、オプションなしで実行すると、ヘルプの一覧表示が得られます。

  $ docker.io
  Usage: docker [OPTIONS] COMMAND [arg...]

  ...中略...

  Commands:
    attach    Attach to a running container
    build     Build a container from a Dockerfile
    commit    Create a new image from a container's changes
  ...後略...

基本的には、Docker に指示するコマンドとその引数を指定して実行すると よさそうです。
コマンドの詳細説明を見るには、「help」とコマンド名を引数に指定して実行します。 $ docker.io help logs Usage: docker logs CONTAINER Fetch the logs of a container -f, --follow=false: Follow log output

バージョンや状態を知るには、 「version」や「info」コマンドを引数に指定して実行します。

  $ sudo docker.io version
  Client version: 0.9.1
  Go version (client): go1.2.1
  Git commit (client): 3600720
  Server version: 0.9.1
  Git commit (server): 3600720
  Go version (server): go1.2.1
  Last stable version: 1.1.2, please update docker

  $ sudo docker.io info
  Containers: 2
  Images: 33
  Storage Driver: aufs
   Root Dir: /var/lib/docker/aufs
   Dirs: 37
  Execution Driver: native-0.1
  Kernel Version: 3.13.0-32-generic

 

さて、今度こそ、コンテナを作ります。
もとになるイメージは、下記にあります。

Docker Hub Registry - Repositories of Docker Images
https://registry.hub.docker.com/

イメージは、「リポジトリ名:タグ名」で指定します。
上記のページのアイコンを押すと、 それぞれのリポジトリ名とタグの一覧を確認できます。 あるいは検索窓にキーワードを入れて検索します。

もとにしたいイメージを見つけたら、そのイメージを取得します。

イメージを取得するには、「pull」コマンドとイメージ名を指定して実行します。 以下では、「ubuntu」の「14.04」を取得しています。
(環境やものにもよりますが、かかる時間は数分です。)

  $ sudo docker.io pull ubuntu:14.04
  Pulling repository ubuntu
  ba5877dc9bec: Pulling dependent layers 
  511136ea3c5a: Download complete 
  9bad880da3d2: Downloading 17.44 MB/67.49 MB 55s
  ...後略...

取ってきたイメージは、「images」コマンドで確認できます。

  $ sudo docker.io images
  REPOSITORY   TAG      IMAGE ID       CREATED        VIRTUAL SIZE
  ubuntu       14.04    ba5877dc9bec   2 weeks ago    192.7 MB

コンテナを作って起動するには、「run」コマンドを使用します。
以下では、先ほど取得した「ubuntu:14.04」をもとにして、 「myubuntu」というコンテナを作成・起動し、その中で「/bin/bash」を実行します。

  $ sudo docker.io run -it --name myubuntu ubuntu:14.04 /bin/bash
  root@123456789abc:/# 

2行目の「root@...」が、コンテナ内で実行中のbashのプロンプトです。
ほぼ瞬時に出力されます。超速いです。すばらしい!

ちなみに、「-i」オプションでコンテナの標準入力をopenします。 「-t」オプションで端末を確保します。シェルなどを起動して作業を行う際は、 これらの指定が必要となります。
あと、「--name」オプションでコンテナ名を指定しています。
その後に、もとにするイメージと実行するコマンドを指定しています。

試しに、コンテナ内で ps コマンドを実行すると、 docker.io run で指定した bash くらいしか動作していないことがわかります。

  root@123456789abc:/# ps aux
  USER   PID %CPU %MEM    VSZ   RSS TTY  STAT START  TIME COMMAND
  root     1  0.0  0.0  18156  1996 ?    Ss   11:16  0:00 /bin/bash
  root    15  0.0  0.0  15568  1140 ?    R+   11:18  0:00 ps aux

bash を exit すると(run で指定したコマンドが終了すると)、 コンテナは停止します。(消えたりはしませんので、安心してください。)

コンテナの操作・確認

コンテナの状態を確認したり、操作してみましょう。

まず、コンテナの一覧を表示するには、「ps」コマンドを使います。
(ご存じとは思いますが、コンテナの内ではなく外で実行してください。)

  $ sudo docker.io ps
  CONTAINER ID   IMAGE         COMMAND    CREATED        STATUS       PORTS   NAMES
  123456789abc   ubuntu:14.04  /bin/bash  2 minutes ago  Up 2 minutes         myubuntu

起動中のコンテナしか表示されないため、もしコンテナを停止しているのなら、 「-a」オプションをつけてください。

  $ sudo docker.io ps -a
  CONTAINER ID   IMAGE         COMMAND    CREATED        STATUS       PORTS   NAMES
  123456789abc   ubuntu:14.04  /bin/bash  5 minutes ago  Exit 0               myubuntu

外からコンテナを起動、停止および再起動するには、 「start」「stop」および「restart」コマンドを使います。
また、「attach」コマンドでコンテナに接続します。

  $ sudo docker.io start myubuntu
  $ sudo docker.io attach myubuntu
  root@123456789abc:/# 

ちなみに、コンテナ名の代わりにコンテナIDを指定することもできます。

ログを確認するには、「logs」コマンドを用います。
実行した内容が、そのまま出力されます。

  $ sudo docker.io logs myubuntu
  ...略...

コンテナが要らなくなったら、「rm」コマンドで削除できます。

  $ sudo docker.io ps -aq
  fedcba987654
  deadbeefface
  123456789abc
  $ sudo docker.io rm deadbeefface
  $ sudo docker.io ps -aq
  fedcba987654
  123456789abc

ちなみに、イメージを消すには、「rmi」コマンドを使用します。

コンテナをイメージにする

コンテナに対していろいろ操作を行った結果、よいものができたら、 それを新たなイメージにしてコンテナのもとにすることができます。

コンテナからイメージを作成するには、「commit」コマンドを使います。
対象のコンテナと、作成するイメージ名を指定して実行します。

  $ sudo docker.io commit myubuntu kuriking/myubuntu:14.04
  $ sudo docker.io images
  REPOSITORY         TAG     IMAGE ID       CREATED        VIRTUAL SIZE
  kuriking/myubuntu  14.04   e7a75d812832   53 minutes ago 192.7 MB
  centos             centos6 b1bd49907d55   10 days ago    212.5 MB
  ubuntu             14.04   ba5877dc9bec   2 weeks ago    192.7 MB

自分で作成したイメージは、 「ユーザ名/リポジトリ名:タグ名」という名にする必要があります。上記では、 「kuriking/myubuntu:14.04」としておきました。

また、「export」と「import」コマンドを使えば、 別のホストにイメージを持って行くことができます。
まず、コンテナ名を指定して「export」コマンドを実行すると、 ファイルシステムのイメージをtar形式で標準出力に出力します。

  $ sudo docker.io export myubuntu | gzip > myubuntu.tar.gz

そのままだと 200MB くらいになりますので、上記では gzip コマンドで圧縮しています。

そして、作った myubuntu.tar.gz を別のマシンに持って行き、 イメージ名を指定して「import」コマンドを実行します。

  $ sudo docker import - kuriking/myubuntu:14.04 < myubuntu.tar.gz

という具合に、別のマシンへイメージをコピーできました。

ちなみに、「-」は、イメージを標準入力から受け取ることを示すための引数です。
受け取る形式は、tar形式、(上記と同じ)tar+gzip形式やtar+xz形式などです。
(詳しくは docker.io help import をご覧ください。)

おわりに

以上、Docker の概要と、とりあえず的使い方を紹介しました。

ほんとにとりあえず的で終わってしまいました。次回(がもしあれば)は、 なにかそれっぽいことをしてみたいと思います。

あと、当然ですが、CentOS や Fedora のイメージを取ってきて、 Ubuntuで起動することもできます。
ファイルシステムは CentOS なのに、カーネルが 3.13.0 だったりして、 ちょっと面白いです。

  $ sudo docker.io pull centos:centos6
  ...中略...
  $ sudo docker.io run -it --name mycent6 centos:centos6 /bin/bash
  bash-4.1# cat /etc/redhat-release 
  CentOS release 6.5 (Final)
  bash-4.1# uname -a
  Linux fedcba987654 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 \
  x86_64 x86_64 x86_64 GNU/Linux
  bash-4.1# getenforce
  Disabled

宿題の答え

前回の宿題は、

  ユーザ権限では実行できないサービスを探してみましょう。

でした。

思いついたモノを、以下に示します。

デバイスを触るサービス
デバイスをあれこれするため、root権限が必要です。
例: udevd, irqbalance, NetworkManager など
rootしか読み書きできないファイルに触るサービス
/etc にあるファイルを書き換えたりなどするサービスは、 ユーザ権限で動かせない(動かしたくない)場合が多いです。
例: NetworkManager, dhcpcd など (他とかぶってますが…)
ユーザ認証に関するサービス
できたとしても、ユーザ権限で動いてほしくはないですよね…。
例: slapd, saslauthd など
ポート番号を変えられないサービス
1024未満のポートを使うにはroot権限が必要ですが、 別のポート番号を指定できないとか、別だと意味のない場合は、 どうしようもないです。
例: inetd/xinetd自身が提供するサービス(echo, chargenなど), dhcpd, dhcpcd, ftpd など

たぶん他にもあると思います。探してみてください。
そして、上記と全然違うものがありましたら、ぜひご教示くださいませ。

今回の宿題

今回の宿題は、

  コンテナのプロセスなどがどうなっているか、コンテナの外から確認をしてみましょう。

です。

コンテナの中で動作しているプロセスは、コンテナの外からはどのように見えるのか、 あるいは見えないのか。

ファイルシステムやネットワークは外から見えるのか、 見えるならどんな感じで見えるのか。

…を、確認してみてください。

あとがき

息子は、今年高校3年生です。つまり、ザ・受験生です。

受験生のはずですが、 艦これ をやっていたり、 最近 twitter でフォローされたり(= 息子が私をフォローしたり)、 緊迫感が感じられません。

自分が受験生のときも、夏期講習に行ったりはしていましたが、 それほどガツガツ勉強していたわけではなく、ゲームをやったり作ったり、 そして後で焦ったりしていた気がします。

しかし、25年前と今とでは、状況が違います。
当時は、半年くらいがんばって何とかなりました。ですが、今は、 2年生から準備しないといけないくらい世知辛いらしいのです。

ということは、もうすでに間に合っていない気がしますが、 それでも残りはがんばったと思えるよう、やる気を出してほしいなと思っています。

ただ、親がストレートにやれと言っても逆効果だと思っています。 だからなるべくそういったことは言わず、前向きっぽいことだけを、 やんわりと言うようにしています。

…今のところは、全く効果が現れていませんが…。

というわけで、なにか、本人のやる気が出るような策などありましたら、 ぜひ教えてください。よろしくお願いします。

 

それから、次回は、月はじめに戻したいという言い訳を使って、 8月中は発行しない予定でご容赦いただけますと幸いです。

 

…あ、親がこうだからいかんのか…そんな気がしてきました…。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、9月7日(日) 未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 栗モノがじわじわ増えてきました…がんばらねば。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)
http://twitter.com/kuriking/ (栗つぶやき)
http://facebook.com/kuriking3 (栗顔本)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本