【社内勉強会】Docker入門してみました

社内勉強会でDockerについてスピーカーしたのでここにもPostします。

Dockerは去年から話題にはあがっていましたが、6月にversion 1.0がリリースされたということをきかっけに入門してみました。これより以前にLXCというコンテナ技術を知ってはいましたが、難易度が高そうで、Dockerもそうなのかなと覚悟しましたが、Dockerはかなり簡単に扱うことができました。普段Linuxを操作している方からすると、コマンドレベルは土日程度の学習コストでお釣りがきそうです。(Dockerを扱うこと自体よりも結局、どう使うか、構成をどうするか、ということが大事だと思います。)

実際に使ってみる

上記スライドにはコマンドを記載していませんので、下記に、手元のMac上からdockerコンテナ(以下コンテナ)を作成し、AWSのEC2へPHPで書いたサイトをデプロイする一連の流れを書いて見ます。

1. Docker hubよりイメージの取得

$ boot2docker start # docker起動
$ docker search centos  # centosのイメージを検索
$ docker pull centos  # 公式のcentosイメージを取得
$ docker images  # 取得したイメージ一覧
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              centos6             0c752394b855        3 weeks ago         124.1 MB
centos              latest              0c752394b855        3 weeks ago         124.1 MB
centos              6.4                 539c0211cd76        15 months ago       300.6 MB

2. Dockerfile作成とbuild

$ vi Dockerfile
FROM centos 
MAINTAINER k.murahama
 
RUN yum update -y
RUN yum install -y httpd php php-mbstring # phpとapacheをinstall
RUN yum clean all
ADD ./site/ /var/www/html/ # ソースコードをコンテナ内へコピー
 
EXPOSE 80 # 80番ポートを紐付け
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] # httpdプロセス起動
$ docker build -t mura/httpd .

3. ローカルで起動

$ docker run -p 8080:80 -d -t mura/httpd # 8080とコンテナの80番ポートを紐付け、コンテナ起動

この時点で、localhost:8080へアクセスすることができるようになります。

4. コンテナをimageへ出力

Docker hubなどにpushでもよいのですが、ここではコンテナのイメージをexportしてみます。

$ docker ps # 立ち上がったコンテナのハッシュを調べます
CONTAINER ID        IMAGE                COMMAND                CREATED             STATUS              PORTS                  NAMES
48f0d7ec1b02        mura/httpd2:latest   /usr/sbin/httpd -D F   7 seconds ago       Up 3 seconds        0.0.0.0:8080->80/tcp   nostalgic_wozniak
$ docker export 48f0d7ec1b02 > httpdContainer.tar # docker exportコマンドでIDを指定しリダイレクト

これだけでコンテナのイメージをファイルへ出力できます。

5. EC2へアップロード

$ scp httpdContainer.tar ec2-user@xxx.xxx.xxx.xxx:/home/ec2-user/.

6. EC2でdockerをinstall

下記はubuntuの例です。

$ sudo apt-get update  # パッケージのリストを取得            
$ sudo apt-get install docker.io  # dockerインストール
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker  # リンクを張る(ubuntuは都合上 "docker.io"となっている)

7. EC2でimageを取り込み、起動

$ cat httpdContainer.tar | sudo docker import - mura/httpd # import
$ sudo docker run -p 80:80 -d -t mura/httpd # ローカルで実行するのと同じようにrun

これでEC2にアクセスすると、サイトが表示されるようになります。

オンプレでもVPSでもクラウドでもDockerが動けばなんでもいい。マルチクラウドの加速。

上記コマンド例のように既にEC2上にdockerさえはいれば(入っているAMIももちろんある)、アプリケーションをすぐにデプロイできます。コンテナさえあればデプロイしたいサーバーに、httpdやphpをいれなきゃ、なんて考えなくてもよいのです。しかも、インフラを選ばない。気軽に社内のオンプレ環境、個人で契約しているVPS、今回のように気軽にEC2のmicroインスタンス、という風にその場で適切なものを決めることができますね。

このようにDockerが動けばなんでもよいので、お客様の要望に合わせてクラウドプラットフォームを変更することのハードルがすごく下がったと思います。

開発者目線でいうと、まるでlinuxのプロセスのように、startし、stopあるいはkillするのと同じ感覚で手軽に仮想環境を操作できるのはすごく楽ですしどんどん色んな環境を構築できます。DevOps推進の大きな武器になりますね!