初めてのDocker



















RedHat6.5から仮想化技術について改良がくわえられて
Dockerに対応しました!
米Red Hatが「RHEL 6.5」を発表――Docker対応、仮想化KVMも強

Dockerって何ですか?
何やら便利らしいので、使ってみました
下記はCentOSの話ですが。

まず、Dockerてなんでしょう?
下記サイトがわかりやすいかもしれません
最近の仮想化界隈を知る:VMWareからCoreOSまで
DockerでImmutable Infrastractureに触れる
LXCは、 Linux上でOSレベル仮想化を提供する仕組みです。 LXCを用いることで一つのコントロールホスト上で、コンテナと呼ばれる単位で 複数の隔離されたLinuxシステムを走らせる事が可能となります。
LXC(LinuxContener)なんて技術があった事を今回初めて知りましたが

なるほど、よくわかりませんが
今までのVMがハードを含めた完全仮想、エミュレートだったのに対して
LXCはOSの仮想化
それにDockerはAUFSファイルシステムを使用することで、LXCを使いやすく
計量にしている。といった感じでしょうか。

とりあえず、体感してみましょう。

DockerはLXCということなので、当然ですが環境はホストサーバに依存し
Linux上でしか動きません、また64bit版しか見つかりませんでした。

CentOSを準備し
Dockerのサイトにある通り、インストールを開始します
Red Hat Enterprise Linux - Installation
EPELリポジトリにてRPMが提供されているので、その通りインストールします。
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install --enablerepo=epel docker-io
 Dependencies Resolved
 
 ===================================================================================================
  Package               Arch               Version                        Repository           Size
 ===================================================================================================
 Installing:
  docker-io             x86_64             0.7.2-2.el6                    epel                2.5 M
 Installing for dependencies:
  libcgroup             x86_64             0.40.rc1-5.el6_5.1             updates             125 k
  lxc                   x86_64             0.9.0-2.el6                    epel                 78 k
  lxc-libs              x86_64             0.9.0-2.el6                    epel                116 k 
 
 Transaction Summary
 ===================================================================================================
 Install       4 Package(s)
 
 Total download size: 2.8 M
 Installed size: 13 M
 
 Installed:
   docker-io.x86_64 0:0.7.2-2.el6                                                                   
 
 Dependency Installed:
   libcgroup.x86_64 0:0.40.rc1-5.el6_5.1  lxc.x86_64 0:0.9.0-2.el6  lxc-libs.x86_64 0:0.9.0-2.el6 
 
 Complete!

一緒にLXCパッケージも入りましたね
dockerのインストールは以上です、細かい設定や運用を考えた設定が~
というのはあまりありません。

ではdockerを起動してみましょう
# /etc/init.d/doker start
 Starting cgconfig service:                                 [  OK  ]
 Starting docker:                                           [  OK  ]
dockerは仮想コンテナとホストの通信用に、ネットワーク設定や、iptablesの定義が変更されます
コンテナとのportフォワード連携用ですね
iptablesを利用していた方は定義が更新されている
またはサービスで使っているサーバにdockerを入れる場合はどの設定が変更されているか
ネットワーク周りの設定を確認したほうがいいと思います。
# /etc/init.d/iptables status
~省略
 Chain PREROUTING (policy ACCEPT)
 num  target     prot opt source               destination
 1    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0           ADDRTYPE match dst-type LOCAL
 
 Chain OUTPUT (policy ACCEPT)
 num  target     prot opt source               destination
 1    DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8         ADDRTYPE match dst-type LOCAL
~省略
#
# ifconfig
 docker0   Link encap:Ethernet  HWaddr FE:B0:05:F8:A2:CB
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:67 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4079 (3.9 KiB)  TX bytes:2172 (2.1 KiB)
#
# cat /etc/sysconfig/network
FORWARD_IPV4=yes
また、ホスト側サーバでコンテナとの連携ができるよう、カーネルパラメータを変更しておきましょう>br />
# vi /etc/sysctl.conf
 net.ipv4.ip_forward = 1
それではコンテナを作成しましょう
コンテナ=仮想OSというイメージでしょうか
Vagrantを利用している方はイメージ付きやすかったと思いますが
まず、コンテナにて起動するOSイメージファイルをダウンロードします。
LXC用にカスタマイズされているものが、多数準備されていて、一般の方がカスタマイズされたものもあります。
どのイメージが利用できるのか、使用するか下記で確認できます
Docker - Index
今回は使い慣れているCentOSを利用しLXCコンテナとはどういうものか、どう違うのか体感してみます。
# docker pull centos
 Pulling repository centos
 539c0211cd76: Downloading 557.1 kB/98.56 MB 1h36m24s
 539c0211cd76: Download complete

# docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
 centos              6.4                 539c0211cd76        9 months ago        300.6 MB
 centos              latest              539c0211cd76        9 months ago        300.6 MB

最初はイメージをダウンロードするため、時間がかかりますが
イメージのサイズが300MB程とは、軽いですね。

ダウンロードしたイメージ等はdockerのインストールディレクトリ配下に管理されます
# ls /var/lib/docker/graph/
では早速コンテナを作成・起動しましょう
今回ダウンロードしたイメージは最低限動くようのパッケージのみになっていて
少しセットアップが必要です
# docker run -i -t -d centos /bin/bash
# docker ps -a
 CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
 ab728139164b        centos:6.4          /bin/bash           14 seconds ago      Up 14 seconds                           romantic_brown

起動時に指定したコマンドでコンテナは起動し、そのコマンドに対してのリソースを提供します
今回は初期設定を行いたいので、bashで起動し、[-d]オプションでデーモン起動させます

コンテナは一つの処理、コマンドに対して動作を行い、動作が終了すると、コンテナも終了します。
そもそものDocker事態が使い捨て前提なので、なるほどという感じです
確かに、恒久的な開発環境としては使えないですね。

では起動したコンテナのbashに対してログインして最低限SSH等が使えるようセットアップします。
# docker attach ab728139164b

bash-4.1#
bash-4.1# yum install rsyslog
bash-4.1# yum install cronie
bash-4.1# yum install logrotate
bash-4.1# yum install openssh-server
bash-4.1# yum install passwd

ログインできるユーザーを作成、またはrootのパスワードを設定
bash-4.1# passwd

SSHの認証周りが問題でうまく接続できなくなることがあるそうなので
下記設定をコメントアウト
bash-4.1# vi /etc/pam.d/sshd
# session    required     pam_loginuid.so
bash-4.1# /etc/init.d/sshd start

最低限のOS設定
bash-4.1# echo 'NETWORKING=yes' >> /etc/sysconfig/network 
bash-4.1# echo ' LANG="ja_JP.UTF-8"' >> /etc/sysconfig/i18n
bash-4.1# cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime 
bash-4.1# exit
取り急ぎの最低限設定です。これが正しい設定方法かは自信がないので申し訳ありません・・・
これでSSH接続できるイメージが準備できました。
※SSHは再起動しておきましょう、鍵等が作成されませんので
カスタマイズしたOSをテンプレートとして新しいイメージとして保存します。
dockerはコミットという方式でイメージファイルを管理します
この辺が新しく、また今後に期待できる管理方法らしいです。
# docker commit <コンテナID> <イメージ名>
# docker commit ab728139164b Template1.0/CentOS:CentOS6.4
新しくイメージができているのが確認できるでしょう
# docker images
そのほか、作成したイメージの削除やコンテナの削除、コンテナの再起動等
コマンドの使い方は下記Gitが詳しく日本語訳されています。
Docker 虎の巻

作成したイメージをもとに、SSH接続できるコンテナを作成しましょう
# docker run -d -p 22 -p 80 -name=dock-srv01 Template/CentOS:CentOS6.5 /usr/sbin/sshd -D
全開とはオプションが違いますね、これはコンソール接続する必要がないからです
代わりに[-p]オプションで、公開ポートを指定します。
dockerのコンテナは172~のローカルセグメント上に作成されてい行きます。
そのコンテナに外部から接続できるよう。ホストサーバとコンテナのポートがフォワードできるよう
マッピングしてくれます。
コンテナのマッピング情報やIPを確認してみましょう
# docker inspect <コンテナID>
ポートのマッピングだけであれば、下記コマンドでも確認できます
# docker ps -a
これでSSH接続でき、開発環境準備は完了です。
基本的にはcommitして、runして、やることはそれ位です。

なるほど、これでdockerの掴みにはなったと思います
起動後にポートを変えられなかったり、起動コマンドを変えられなかったり、コンテナ名を変えられなかったり、IPを指定できなかったり、OSバージョンのバリエーションが少なかったり
まだまだ痒いところには手が届かない感じですが
ミドルウェアの検証や、わざわざVMで仮想サーバを立てる程でもない検証には使えそうです。
私はホストサーバにPoundを入れて、公開ポートに縛られないようしていますが
本格的に使う場合は同様にソフトウェアルータか、ソフトウェアLBを入れると捗るかもしれません

とても便利ですが、コンセプトである”使い捨て開発環境”という前提は忘れない利用の仕方を心がけしたほうが良さそうです。
本当に開発環境として使いたいのであれば、Vagrantのほうがいいです。

Dockerfileというコンテナをrunする際にビルドしてくれる方法もあるようですが
こちらは後で見てみましょうかね


Vagrant: Up and Running
Vagrant: Up and Running
posted with amazlet at 14.02.08
O'Reilly Media (2013-05-30)

0 コメント:

コメントを投稿