ダウンロード(PDF)

http://www.conoha.jp/
まえがき
ConoHaは一台の物理サーバーの上で何台かの仮想
サーバーが動く
「VPS」です。でも、VPS って自由度が高い
だけに設定するところが多すぎて面倒ですね。VPSの中に
さらに小さな仮想サーバーを立ち上げて、用途別に動か
せたら便利なのに…。こういう人に最適なのが、サーバー
の中に「コンテナ」という
“子サーバー”を立てるコンテナ型
仮想化です。そのためのパッケージとして近ごろ注目されて
いるのが「Docker」というもの。これを使うと、ConoHaの
サーバーに中にさらにドカドカとサーバーを立てることが
y
)
・
ω
・
(
ね
親父ギャグや
できてしまいます。ちょっと楽しそうですね。あなたもやって
みませんか?
目 標
■ Dockerでコンテナを立ち上げる
■ DockerfileでWebサーバーのイメージ・コンテナをつくる
前 提
■ とりあえず ConoHaでVPSを1 台契約済みであること。
[ 標準 OS] CentOS 6.4(64bit)を使用していることを前提にご説明します
■ Webサーバーのインストール程度はできる知識がある
I. はじめのいっぽ
とにかくDockerを導入してみる
1
「Dockerを導入する」というと、以前はいろいろとめんどくさかったのですが今は EPEL
リポジトリから yum 一発で入ってしまいます。
# rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
# yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-rele
ase-6-8.noarch.rpm
# yum -y install docker-io
# service docker start
これで、DockerがホストOS 側でいつも起動している状態になりました。次に“子サー
バー”
=コンテナになるOSをセットアップしましょう。これも簡単で、Docker の提供元か
ら各ディストリビューションのイメージがある程度提供されています。ここでは CentOS
6.4 のイメージを引っ張ってきます。
# docker pull centos
Pulling repository centos
539c0211cd76: Download complete
ファイルサイズとしては 300MB 程度しかないのであっというまに終わったんじゃないで
しょうか。ここで見てわかるように、Docker のコマンド群は基本的に「docker なになに」
というかたちで呼び出します。いま手元にどんなイメージがあるかをリストアップするには
「docker images」を使います。
# docker images
REPOSITORY
TAG
centos
6.4
centos
latest
IMAGE ID
539c0211cd76
539c0211cd76
CREATED
10 months ago
10 months ago
VIRTUAL SIZE
300.6 MB
300.6 MB
これでひととおりの用意ができました…と言いたいところですが、あともうひとつ。
dockerコマンドを使いやすくするためのお約束の呪文 alias を bash に追加しておきま
しょう。
# echo "alias dl='docker ps -l -q'" >> ~/.bashrc
これで、dl という alias が追加され、コンテナ名を参照しやすくなります。
2
コンテナを起動してみる
とにかく、
“子サーバー”=コンテナとやらを立ち上げてアクセスしてみたいですね。
それには docker run コマンドを使います。
# docker run -i -t centos /bin/bash
これは「centosというイメージを使って bashを起動してね。そのとき標準入出力を端末
につなげたままにしてね」という意味になります。うまくいけば
bash-4.1#
という、bash のコマンドラインが表示されるはずです。さぁ、これでもうコンテナ側の世界に
入りました。cat のような一般コマンドも、外部ネットワークへの ping もふつうに動くはず
です。
bash-4.1# cat /etc/redhat-release
CentOS release 6.4 (Final)
bash-4.1# ping www.yahoo.co.jp
PING www.g.yahoo.co.jp (124.83.203.233) 56(84) bytes of data.
64 bytes from f8.top.vip.ogk.yahoo.co.jp (124.83.203.233): icmp_seq=1 ttl=51
time=12.9 ms
とりあえず満足したら、exit でbashを終了させてください。ホストOS に戻り、コンテナは
終了させられます。
bash-4.1# exit
II. 自分好みの女 =コンテナを育てる
1
`●)
ε
すわ(´
出
い
思
を
い
会
女房との出
これだけだと他人の押し付けのコンテナしか使えないですね。なんかバリバリカスタマイズ
telnetコマンド入りコンテナをつくる
したコンテナが欲しいです。ちなみにはじめの状態だとtelnetコマンドすら入っていません。
じゃあ、telnetコマンド入りコンテナを作ってみましょう。
最初に、
「centosイメージを元に作業するからもう一度bashを触らせてくれ」とお願いし
ましょう。
# docker run -i -t centos /bin/bash
Docker #
ふつうにDockerのコンテナが起動しましたね(以下、Dockerコンテナ内のコマンドライン
は Docker # と書きます)
。
Docker # telnet localhost 80
bash: telnet: command not found
ごらんのとおり、telnetコマンドがありません。21世紀にtelnetコマンドすらないとは!
ということで yum でインストールします。終わったらさっさとログアウトしちゃいましょう。
Docker # yum -y install telnet
Docker # exit
コンテナを終了させたら、それを新しいイメージとして保存しておくことができます。
イメージの名前は「自分の名前/なんとかかんとか」にすることが推奨されているので、
ここでは「conoha/telnet」にします。
# docker commit `dl` conoha/telnet
df287aa8b65f8152f6f928f07eb210f8d0c916a8e8ba7170d069acf61990bb2c
これでホントに保存されたかな? docker images で確認しましょう。
# docker images
REPOSITORY
TAG
conoha/telnet latest
centos
6.4
centos
latest
IMAGE ID
df287aa8b65f
539c0211cd76
539c0211cd76
CREATED
About a minute ago
10 months ago
10 months ago
VIRTUAL SIZE
340.7 MB
300.6 MB
300.6 MB
たしかにあるみたいですが、念のために作ったイメージを立ち上げて使ってみましょう。
# docker run -i -t conoha/telnet /bin/bash
Docker # telnet localhost 80
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
結果はともかくインストールされているみたいです。
2
Webサーバー入りコンテナをつくる
おなじようにApache Webサーバー入りのコンテナも作ることができます。
Docker # yum -y install httpd
Docker # exit
# docker commit `dl` conoha/apache
このイメージからApacheの動作しているコンテナを起動するには、以下のようにする必
要があります。
「httpdを起動して、ホストの80番ポートとコンテナの80番ポートをつな
げて」という意味です。
# docker run -p 80:80 -i -t conoha/apache /usr/sbin/httpd -D FOREGROUND
これをやるといきなりhttpdが動いてしまい、こちらの操作に応えなくなります。CTRL-P
CTRL-Qを押してやると一時的にプロセスをサスペンドしてコマンドラインに戻ることがで
きるので、bg コマンドでバックグラウンドに逃がしましょう。
# bg
docker ps コマンドを使うとコンテナが動いている状態を確認できます。
ぇ〜(・´з`・)
て
い
と
ん
せ
に
気
れてんの、
改行さ
途中#でdocker
ps
CONTAINER ID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
c5f373ca398c
conoha/apache:latest
/usr/sbin/httpd -D F
50 seconds
ago
Up 49 seconds
0.0.0.0:80->80/tcp
compassionate_fermat
telnetで80番ポートを叩くと確かにWebサーバーが動いています。確認できたらdocker
ps の右端に表示されていたコンテナの名前を指定して、コンテナを終了させましょう。
# docker kill compassionate_fermat
でも、これじゃサーバーのコンテナを自動起動させたりしづらいですね。
III. もうちょっとちゃんとWebサーバーを立てる
1
Dockerfileを使う
Dockerには「Dockerfile」というものがあります。作成手順や起動するコマンドを書くと、
そのとおりのイメージを作ってくれる設定ファイルです。これを利用して、もうちょっと使いや
すいサーバーのコンテナができないか試してみましょう。
ここでは~/docker/anotherapache/Dockerfile として設定ファイルを作ります。
# mkdir -p ~/docker/anotherapache
# vi ~/docker/anotherapache/Dockerfile
Dockerfileの内容は以下のとおり:
FROM centos
RUN yum -y install telnet
RUN yum -y install httpd
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
これは「centosというイメージを元にいくつかyumを実行してイメージを作ってね。
起動するときはhttpdを呼び出すんだよ」という設定になっています。vi を終了させたら、
# docker build -t conoha/anotherapache ~/docker/apache
Successfully built 36a0fe96f3d6
などとすればイメージファイルのできあがり。そして、docker run を以下のように
実行します。
# docker run -p 80:80 -d conoha/anotherapache
こんどはふつうにコマンドラインに戻ってきましたね。docker ps でも
# docker ps
CONTAINER ID
c9a1370f4e1d
5 seconds ago
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMES
conoha/anotherapache:latest
/usr/sbin/httpd -D F
Up 4 seconds 0.0.0.0:80->80/tcp
backstabbing_poincare
y
)
・
ω
・
(
か
い
な
や
る
き
で
ば
れ
Web サーバーのコンテナが動作しているのを確認できます。
IV. DockerとConoHaの意外な相性
1
Dockerのなにがうれしい?
さて、簡単にDockerの使い方を見てきましたが、いったいどんなところがうれしいので
しょうか。それはなんといっても、最後に触れた「Dockerfile」のような定義さえ書けば、
どんな環境でも「同じサーバー(コンテナ)が一瞬で構築できてしまう」ということです。
古くはLAMP環境の提唱、最近では「vagrant」の人気で「開発用のサーバー環境を持ち
歩く」のが当たり前になっていますが、Dockerはそれをさらに抽象化し、ポータブルにして
しまいます。
さらに詳しい応用のしかたは、Dockerの開発元サイト(http://www.docker.io/)を
参照してみるとよいでしょう。
・ω・`)ノ
あっ!九時ら!|
2
ConoHaの17個のIPv6アドレスを活かせる
Dockerでいくつものコンテナを立ち上げても、IPアドレスは親サーバーの1つを共有する
しかありません。しかし、ご存知のとおり、ConoHaのVPSには無料で17個のIPv6アドレス
が付属しています。多少ネットワークの設定が必要ですが、各コンテナに専用のアドレスを
割り振るというぜいたくな使い方ができます。実際に試してくださった方がいらっしゃるので、
以下のページを参考にチャレンジしてみてはいかがでしょう。
● ConoHaで使えるIPv6アドレスをDockerで有効活用する(nabekenさん)
http://projects.tsuntsun.net/~nabeken/diary/Sysadmin/conoha-docker-ipv6.html
VPSは、まだまだ楽しくなる。
http://www.conoha.jp/
「ConoHaの薄い本!」
vol.3 ConoHa+Dockerでサーバーをドカドカ立てよう!
2014年2月28日 初版発行
編集:ConoHaの中の人たち
発行者:児玉公宏
発行所:GMOインターネット株式会社
住所:東京都渋谷区桜丘町26-1セルリアンタワー
TEL: 03-6702-0428