View Vietnamese Version

お客様のサーバーOSはまちまちです。Webシステム系なら、大抵はCentosですが、Centos5, Centos6の2つが分かれます。これからまたCentos7となりますね。これらのOSは社内で今まで一台PCをパーティション分けてインストールしています。メインテナンス作業が面倒で社内にしかテストできないということもあります。VirtualBoxは使ったことがありますが、なんだか重くてVagrantもいまいちです。もうちょっとシンプルで手軽いのはないかなと思ってDockerをインストールして使ってみました。

私はメインで使っているのがMacbook Proですので、今回はMacにインストールした手順を書きたいと思います。

 

Dockerのインストール

 

Brew経由でもいいですが、今回はDockerサイトの手順に従います。

https://docs.docker.com/installation/mac/

記事を書いた時点では、最新版は1.1.2です。

GUIインストーラですので、ボタンをクリックして終わりです。

 

これでインストール完了です。実際にはboot2dockerとVirtualBoxがインストールされます。Linux系ならVirtualBoxが必要ないらしいですが、Macで使う場合は内部でVirtualBoxが必要です。

 

実際使って見ます。boot2dockerをクリックすると自動的にターミナルが起動されて、Dockerが起動されます。

この時点ではDockerが起動されました。確認すると、VirtualBoxにはboot2docker-vmが存在して起動中というステータスとなります。

 

Dockerのコンテナー仕組み

 

Dockerでよく使っているのはコンテナーです。Dockerの利用流れはこんな感じ

  • イメージをPullしてローカルに保存する
  • イメージからコンテナーを作成し、Runする
  • イメージはある程度アップグレードできたら、その状態をコミットして最新のイメージにする
  • コンテナーはベースとなるイメージからOS立ち上がりますが、コンテナー自体を削除しない限り、そのコンテナー上での作業ファイル等はそのまま残る
  • コンテナーは複数起動できる

※写真はatmarkitサイトからコピーさせていただきました。

 

DockerイメージをPullする

 

まずOSイメージをダウンロードしましょう。

先起動されたboot2Dockerターミナルで作業を行います。

イメージはできるだけDockerのオフィシャルイメージをダウンロードするようにしましょう。Dockerのオフィシャルイメージサイトは以下です。

https://registry.hub.docker.com/search?page=1&q=library&f=official

これを見ると、なんとOSだけではありません。各アプリケーション単体のイメージもあります。すげ〜〜〜。

また面白いのは同じイメージでもタグ(バージョン)が複数用意されているので、複数バージョンの運営も可能ですね。

さて、私は自分が必要なものをダウンロードしていきます。

docker pull centos:centos6
docker pull centos:centos7
docker pull tianon/centos:5.10
docker pull ubuntu:12.04
docker pull ubuntu:14.04

※オフィシャルレポジトリにはCentos5がないので、tianon/centos:5.10をダウンロードしました。
https://registry.hub.docker.com/u/tianon/centos/

 

結果は下記となります。

bash-3.2$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               ba5877dc9bec        4 days ago          192.7 MB
ubuntu              12.04               b9e56c8f2cf5        4 days ago          103.9 MB
centos              centos7             1a7dc42f78ba        2 weeks ago         236.4 MB
centos              centos6             cd934e0010d5        2 weeks ago         206.9 MB
tianon/centos       5.10                0252ee3ea03b        5 months ago        127.7 MB
Dockerコンテナーを起動する

 

Centos6は例に起動したいと思います。起動コマンドは以下です。

docker run -t -i --name centos6-up centos:centos6 /bin/bash

centos6-upというコンテナー名で起動し、該当OSシステムのbashも起動します。

bash-4.1# cat /etc/redhat-release 
CentOS release 6.5 (Final)
bash-4.1# uname -a
Linux c65b77d29dbc 3.15.3-tinycore64 #1 SMP Thu Jul 24 03:10:37 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

ここでExitすると、そのコンテナーは停止させます。また作成されたコンテナーを再開するためには先のコマンドじゃなくて、docker startとなります。この際、前回まで作業した環境をまた使えることになります。

bash-4.1# exit
exit
bash-3.2$ docker start -i centos6-up
centos6-up
bash-4.1# 

コンテナー自体を削除する場合は以下のコマンドを利用します。

docker rm centos6-up

 

自分用のイメージを作成する

 

Dockerサイトで提供しているイメージはOSの最低限のものです。当然LAMPのAMPは入っていません。ですので、一旦使える環境に構築して、その状態を自分用の新しいイメージに保存(コミット)します。

私の場合はこんな感じでシステムを構築しています。

yum update
yum install httpd
yum install php php-gd php-mysql php-intl php-xml php-xmlrpc php-soap php-pecl-apc php-odbc php-mbstring
yum install mysql mysql-server
bash-4.1# vi /etc/php.ini 
timezoneを日本にする
bash-4.1# chkconfig httpd on

そして、新しいイメージに保存します

docker commit centos6-up chung/centos6-up

結果を見ると、新しいイメージが追加されるのを確認できます。

bash-3.2$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
chung/centos6-up    latest              f2b53c371d38        22 hours ago        402.3 MB
ubuntu              14.04               ba5877dc9bec        4 days ago          192.7 MB
ubuntu              12.04               b9e56c8f2cf5        4 days ago          103.9 MB
centos              centos7             1a7dc42f78ba        2 weeks ago         236.4 MB
centos              centos6             cd934e0010d5        2 weeks ago         206.9 MB
tianon/centos       5.10                0252ee3ea03b        5 months ago        127.7 MB

 

ホストOSとDockerコンテナーのポートマッピング

 

一番の狙いはWebシステムをDockerコンテナーで実行させ、ホストPC(Mac)のブラウザーで確認・テストしますので、そのためには、ホストOSとDockerコンテナーのポートマッピングをします。やり方は簡単です。コンテナーを作成する時、-pオプションを利用します。

docker run -t -i -p 80:80 --name centos6-up chung/centos6-up /bin/bash

それから、VirtualBox接続ネットワークのホストPCのIPを調べます。

bash-3.2$ boot2docker ip

The VM's Host only interface IP address is: 192.168.59.103

準備が整えました。これから実際確認していきます。まず、Dockerコンテナーを起動し、HTTPDを起動します。PHP Infoページも作ってみましょう。

bash-3.2$ docker start -i centos6-up
centos6-up
bash-4.1# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.5 for ServerName
                                                           [  OK  ]
bash-4.1# vi /var/www/html/info.php
bash-4.1# cat /var/www/html/info.php 
<?php
phpinfo();
?>

ホストPCのプラウザーでそのページを開きます。

 

これで成功しました!!!簡単すぎて感動!!!

 

TODO

 

上記のポートマッピングでもいいですが、もう一つやりたいのはファイルシステムの共有です。

http://docs.docker.com/userguide/dockervolumes/

上記のドキュメントにあるように設定は簡単ですが、なぜか現MAC用バージョンでMACシステムにおいてはうまくできませんでした。

ファイルシステムのマウントができたものの、実際データが表示されませんでした。

どうもDocker Github上、Issueも上がっています。

https://github.com/docker/docker/issues/4023

これはちょっと残念ですが、ちょっと我慢しときます。


[Vietnamese Version]

 

Server của khách hàng thì sử dụng rất nhiều hệ OS. Về Web system thì dùng chính là Centos, cho dù vậy thì cũng chia ra làm 2 loại Centos5, Centos6. Và từ đây về sau là Centos7. Trước giờ thì trong công ty dùng 1 máy tạo các partition rồi cài từng os vào. Maintenance kém, mất công mà cũng chỉ test được ở công ty. Sau này dùng VirtualBox, loại này cũng nặng nề, Vagrant cũng cảm thấy chưa hài lòng. Có loại gì mà thật simple, nhẹ nhàng dễ sử dụng nhất nhỉ? Cho nên có 1 giải pháp mà hiện tại đang rất nổi tiếng là: Docker.

Hôm nay tôi viết về việc sử dụng Docker trên môi trường Mac.

 

Install Docker

 

Install qua Brew cũng ok, nhưng lần này install theo hướng dẫn của Docker site:

https://docs.docker.com/installation/mac/

Ở thời điểm viết blog này thì version cao nhất của Docker là 1.1.2.

Vì là GUI installer nên chỉ nhấn vài button là xong.

 

Như vậy đã cài xong Docker. Thực tế thì có 2 soft được cài vào: boot2docker và VirtualBox. Ở system Linux thì hình như không cần install VirtualBox vào, Mac thì trong lòng vẫn phải cần xài VirtualBox.

 

Chúng ta dùng thử. Chỉ cần click vào icon boot2docker thì tự động start terminal của Docker lên.

Như vậy là Docker đã được khởi động. Chúng ta quan sát bên VirtualBox thì thấy tồn tại 1 boot2docker-vm đang chạy.

 

Cấu trúc Docker Container

 

Đơn vị quan trọng của Docker là container. Dòng chảy sử dụng Docker như sau.

  • Pull Image về Local OS
  • Từ Image tạo Container và Run
  • Image thì sau khi chạy update xong có thể commit thành 1 version image mới
  • Container sẽ vẫn giữ nguyên trạng thái OS, và các file chúng ta thêm vào. Chúng ta tắt khởi động lại container thì sẽ có môi trường đúng như trước.
  • Có thể chạy 1 lúc nhiều container

※Hình ở trên lấy từ atmarkit site.

 

Pull Docker Image

 

Trước hết chúng ta download OS Image. Thao tác làm trên terminal của Docker.

Image nên download từ repository official của chính docker.com thì mới yên tâm. 

https://registry.hub.docker.com/search?page=1&q=library&f=official

Docker mạnh là không phải chỉ tạo virtual os không mà ngay cả các software riêng biệt(ví dụ nginx) cũng có image để tự tạo container để chạy.

Với 1 image thì chúng ta có thể download các version(Tag) khác nhau. Với tôi thì hiện tại cần những images sau:

docker pull centos:centos6
docker pull centos:centos7
docker pull tianon/centos:5.10
docker pull ubuntu:12.04
docker pull ubuntu:14.04

※Official Repos của Docker không còn centos5 nên download từ chỗ khác. 
https://registry.hub.docker.com/u/tianon/centos/

 

Kết quả như sau: 

bash-3.2$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               ba5877dc9bec        4 days ago          192.7 MB
ubuntu              12.04               b9e56c8f2cf5        4 days ago          103.9 MB
centos              centos7             1a7dc42f78ba        2 weeks ago         236.4 MB
centos              centos6             cd934e0010d5        2 weeks ago         206.9 MB
tianon/centos       5.10                0252ee3ea03b        5 months ago        127.7 MB
Khởi động Docker Container

 

Lấy ví dụ khởi động Centos6, câu lệnh khởi động như sau:

docker run -t -i --name centos6-up centos:centos6 /bin/bash

Khởi động với container có tên centos6-up và sau khi khởi động xong thì chạy luôn bash.

bash-4.1# cat /etc/redhat-release 
CentOS release 6.5 (Final)
bash-4.1# uname -a
Linux c65b77d29dbc 3.15.3-tinycore64 #1 SMP Thu Jul 24 03:10:37 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Ở terminal này mà exit thì Container sẽ dừng lại. Và sau đó muốn khởi động lại container đó thì dùng câu lệnh hơi khác: docker start. Như vậy chúng ta lại vào lại môi trường lúc này, tất cả file vẫn còn nguyên như lúc vừa rồi.

bash-4.1# exit
exit
bash-3.2$ docker start -i centos6-up
centos6-up
bash-4.1# 

Nếu muốn xoá Container thì dùng câu lệnh sau:

docker rm centos6-up

 

Tạo image cho riêng mình.

 

Các image mà Docker site cung cấp là gói OS tối thiểu nhất. Nên sẽ cần thiết phải cài Apache, Mysql, PHP v.v... Sau khi tái tạo môi trường mới xong thì chúng ta có thể save, commit môi trường đã update thành image riêng cho mình để sử dụng.

Trường hợp của tôi thì như thế này, dùng để chạy PHP Web system.

yum update
yum install httpd
yum install php php-gd php-mysql php-intl php-xml php-xmlrpc php-soap php-pecl-apc php-odbc php-mbstring
yum install mysql mysql-server
bash-4.1# vi /etc/php.ini 
Sửa timezone về location ở Nhật.
bash-4.1# chkconfig httpd on

Sau đó tạo image mới cho mình.

docker commit centos6-up chung/centos6-up

Nhìn kết quả thì chúng ta thấy có thêm 1 image mới mà tôi vừa tạo ra.

bash-3.2$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
chung/centos6-up    latest              f2b53c371d38        22 hours ago        402.3 MB
ubuntu              14.04               ba5877dc9bec        4 days ago          192.7 MB
ubuntu              12.04               b9e56c8f2cf5        4 days ago          103.9 MB
centos              centos7             1a7dc42f78ba        2 weeks ago         236.4 MB
centos              centos6             cd934e0010d5        2 weeks ago         206.9 MB
tianon/centos       5.10                0252ee3ea03b        5 months ago        127.7 MB

 

Thiết định Port Mapping cho Host OS và Docker Container

 

Cái đích là Muốn Web site chạy trên Docker Container với OS mình muốn, còn để confirm thì dùng chính Broswer của OS mình đang sử dụng.

Để làm cái này thì lúc tạo Container dùng thêm option -p, rất đơn giản. Ví dụ dưới đây là mapping port 80 với 80.

docker run -t -i -p 80:80 --name centos6-up chung/centos6-up /bin/bash

Sau đó chúng ta kiểm tra IP của Host OS để có thể connect đến VirtualBox.

bash-3.2$ boot2docker ip

The VM's Host only interface IP address is: 192.168.59.103

Như vậy chúng ta đã chuẩn bị xong và giờ kiểm tra công đoạn cuối. Trước hết ta khởi đông Docker Container và sau đó khởi động HTTPD và tạo file php info.

bash-3.2$ docker start -i centos6-up
centos6-up
bash-4.1# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.5 for ServerName
                                                           [  OK  ]
bash-4.1# vi /var/www/html/info.php
bash-4.1# cat /var/www/html/info.php 
<?php
phpinfo();
?>

Dùng broswer của Host PC để mở site tương ứng. 

 

Và chúng ta đã thành công!!! Vấn đề quá đơn giản, nhanh, gọn nhẹ!!!

 

TODO

 

Ngoài vấn đề Port mapping thì còn 1 cái muốn làm nữa là: Từ Docker container có thể mount file system của Host OS. 

http://docs.docker.com/userguide/dockervolumes/

Điều này tất nhiên là làm được, nhưng không hiểu sao phiên bản dùng cho Mac lại chưa làm được. Mount được nhưng chẳng thấy file đâu cả.

Lỗi này hình như được báo rồi mà chưa giải quyết được hay sao đó. Linux hay các OS khác chắc là không sao.

https://github.com/docker/docker/issues/4023

Cái này thì hơi đáng tiếc tí. Nhưng thôi đợi version mới vậy. 


One comment

#12
2014-07-27 14:08
参考となるサイト:
http://codezine.jp/article/detail/7894

Leave a Comment

Fields with * are required.