いますぐ実践! Linux システム管理 / Vol.263 / 読者数:2646名こんばんは、うすだです。 先週発行するはずが、まったく余裕がなく、 1文字も書くことなく当日を過ごしてしまいました。ももも申し訳ございません。 世間では、ちょうどお盆休みに入ろうとしているところですが、 その休みを利用して、えいやーで書いております。 といっても、とくにお盆休みをとる予定はなく、世間が休んでいる間に、 いろいろな遅れを取り戻そうという魂胆です。 下手に、あれもこれもと欲張らず、ほんとにやるべきことを、1つか2つに絞って、 集中してやりたいと思っています。 今までの経験で、ようやくわかった、数少ない教訓のうちのひとつです。 はい、うだうだ言ってないで、今回もさっさとはりきってまいりますね。 今回のお題 - Docker を使ってみる (レベル:初級)最近は、パワフルなサーバをどーんと購入して、 仮想化技術を使ってOSをわらわらと動かす、という使い方が増えているように思います。 そうでなくても、個人のPCでもマルチコアは当たり前になり、 VirtualBoxなどで複数のOSを難なく使えるようになってきました。 とはいえ、CPUとメモリとディスクのリソースは、あればあるだけ使ってしまうのが、 人間の性というものではないでしょうか。 となると、中で動かすゲストOSをなるべく軽く動かせた方がありがたい、 ということになりますよね。 というわけで今回は、最近はやりの「Docker」の概要と使い方を、 簡単に紹介したいと思います。 仮想化の種類をざっくり
最初に、仮想化の種類を、さらっと紹介します。
ハードウェア自体をまるっと仮想化する方式が、 「ハイパーバイザ型」や「ホストOS型」と呼ばれるものです。 中で動くゲストOSは、仮想マシンの配下にあることを意識する必要がないため、 たいていのOSがそのまま動きます。
その反面、ゲストOSに気づかれないよう、
特権命令やデバイスへの操作をエミュレートする必要があるため、
オーバーヘッドがかかります。
ホストOS型では、普通のOSで仮想化ソフトウェアを動かします。
プロセスの中でゲストOSが動作するため、パフォーマンスはよろしくありません。
ハイパーバイザ型では、普通のOSのカーネルではなく、
専用のカーネルである「ハイパーバイザ」を動かします。
ハイパーバイザの配下でゲストOSが動作するため、
ホストOS型よりもオーバーヘッドは小さくて済みます。
これに対して、カーネルは共通で(単一で)、ファイルシステム、 プロセスやネットワークなどのリソースを隔離することで仮想化を実現しているのが 「コンテナ型」と呼ばれるものです。
ホストOS のカーネルでゲストOS(「コンテナ」と言います)
のプロセスがそのまま動作しますので、オーバーヘッドはかなり小さくなります。
Linuxでは、「LXC(Linux Containers)」がこれに相当します。以前に紹介した、
cgroups や namespace などを駆使して実現しています。
Vol.228 - cgroup について理解する
というわけで、あんまりさらっとじゃない説明でした。 で、Docker とは?さて、今回のテーマである「Docker」は、前述のLXCと、 「AUFS(Another Union FileSystem)」を使った、コンテナを管理するためのソフトです。 AUFSとは、あるファイルシステムに重ね合わせてマウントできるファイルシステムです。
Docker では、もとのイメージはそのままにしておき、
AUFSを使って変更の差分をとっておきます。 ちなみに、AUFS は、だいぶ昔に少ーしだけ紹介しておりました。
Vol.187 - 複数のディレクトリを束ねてマウントする …はい、説明になっていませんが、このくらいで説明は終わりにします。 Docker のインストール以降は、ひたすら手を動かしていきます。まずはインストールです。
Ubuntu 14.04 の場合は、「docker.io」パッケージを入れるだけです。 $ sudo apt-get install docker.io Ubuntuでは、パッケージを入れると、 サービスの自動起動の設定や起動が即座に行われます。
CentOS 7 では、「docker」パッケージを入れます。 # yum install docker (CentOS の場合) # yum install docker-io (Fedora の場合) どちらも、サービスの自動起動の設定や起動は勝手にされないため、 下記のように手動で行います。 # systemctl enable docker (OS起動時に自動起動にしたいなら) # systemctl start docker (とりあえず今起動するには) コンテナを作って動かします
Dockerでは、「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 に指示するコマンドとその引数を指定して実行すると
よさそうです。 バージョンや状態を知るには、 「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
イメージは、「リポジトリ名:タグ名」で指定します。 もとにしたいイメージを見つけたら、そのイメージを取得します。
イメージを取得するには、「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」コマンドを使用します。 $ sudo docker.io run -it --name myubuntu ubuntu:14.04 /bin/bash root@123456789abc:/#
2行目の「root@...」が、コンテナ内で実行中のbashのプロンプトです。
ちなみに、「-i」オプションでコンテナの標準入力をopenします。
「-t」オプションで端末を確保します。シェルなどを起動して作業を行う際は、
これらの指定が必要となります。 試しに、コンテナ内で 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」コマンドを使います。 $ 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」コマンドを使えば、
別のホストにイメージを持って行くことができます。 $ 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 という具合に、別のマシンへイメージをコピーできました。
ちなみに、「-」は、イメージを標準入力から受け取ることを示すための引数です。 おわりに以上、Docker の概要と、とりあえず的使い方を紹介しました。 ほんとにとりあえず的で終わってしまいました。次回(がもしあれば)は、 なにかそれっぽいことをしてみたいと思います。
あと、当然ですが、CentOS や Fedora のイメージを取ってきて、
Ubuntuで起動することもできます。 $ 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 宿題の答え前回の宿題は、 ユーザ権限では実行できないサービスを探してみましょう。 でした。 思いついたモノを、以下に示します。
たぶん他にもあると思います。探してみてください。 今回の宿題今回の宿題は、 コンテナのプロセスなどがどうなっているか、コンテナの外から確認をしてみましょう。 です。 コンテナの中で動作しているプロセスは、コンテナの外からはどのように見えるのか、 あるいは見えないのか。 ファイルシステムやネットワークは外から見えるのか、 見えるならどんな感じで見えるのか。 …を、確認してみてください。 あとがき息子は、今年高校3年生です。つまり、ザ・受験生です。 受験生のはずですが、 艦これ をやっていたり、 最近 twitter でフォローされたり(= 息子が私をフォローしたり)、 緊迫感が感じられません。 自分が受験生のときも、夏期講習に行ったりはしていましたが、 それほどガツガツ勉強していたわけではなく、ゲームをやったり作ったり、 そして後で焦ったりしていた気がします。
しかし、25年前と今とでは、状況が違います。 ということは、もうすでに間に合っていない気がしますが、 それでも残りはがんばったと思えるよう、やる気を出してほしいなと思っています。 ただ、親がストレートにやれと言っても逆効果だと思っています。 だからなるべくそういったことは言わず、前向きっぽいことだけを、 やんわりと言うようにしています。 …今のところは、全く効果が現れていませんが…。 というわけで、なにか、本人のやる気が出るような策などありましたら、 ぜひ教えてください。よろしくお願いします。
それから、次回は、月はじめに戻したいという言い訳を使って、 8月中は発行しない予定でご容赦いただけますと幸いです。
…あ、親がこうだからいかんのか…そんな気がしてきました…。
今回も、ここまで読んでいただき、誠にありがとうございました。
「いますぐ実践! Linux システム管理」の解除は、以下からできます。
バックナンバーは、こちらにほぼ全部そろっています。
「栗日記」- 栗モノがじわじわ増えてきました…がんばらねば。 |
▼ トップ ▼ プロフィール ▼ リンク
▼ 作ってみました
▼ せんでん
▼ 最近読んだ本
▼ 気に入ってる本 |