Dockerであそぶ(9)AWS EC2でdocker-composeを使う


ここ1,2年で注目を集めている仮想化技術の1つ「Docker」について、今更感がありますが試していきたいと思います。
他の仮想化技術との違いや特徴、開発環境として使っていくにはどうすればいいかなどを紹介していきたいと考えています。

これまでの連載

はじめに

今回はこれまでローカル環境に構築していた環境をAWS上に移設してみたいと思います。簡易的な本番環境をイメージしています。
AWS上でDockerを使うには、今回紹介するEC2にdockerをインストールして使う方法の他に、ECS(Amazon EC2 Container Service)を使うという方法もありますが、またの別の機会にしたいと思います。
EC2でdockerを使う方法は非常に簡単です。これまで使用してきたツール類をインストールし、あとはこれまでローカルマシンで作ってきた設定ファイル群をEC2にアップロードすれば完了です。(設定ファイルにはホスト側固有の設定があるので、それは修正しておく必要があります。)

AWSのアカウント作成と、EC2インスタンスの作成方法は本ブログの中で紹介していますので、参考にしてみてください。
AWS無料クラウドサーバEC2にRuby,Rails環境を構築する手順まとめ
※手順3まででOKです。

インストールが必要なツールは以下になります。

  • docker
  • docker-machine
  • docker-compose

dockerとdocker-composeに関しては今まで登場してきましたので問題ないかと思いますが、docker-machineは初登場になります。docker-machineは複数のdockerホストを管理するためのツールで、docker-composeの中からdocker-machineコマンドを使用しているために必要となります。

dockerをインストール

dockerのインストールはyumコマンドで一発です。

$ sudo yum update -y
$ sudo yum install -y docker
$ sudo service docker start

つぎに、ec2-userからdockerコマンドが使えるようにグループの設定をします。設定を反映させるために再ログインもしておきます。

$ sudo usermod -a -G docker ec2-user
$ sudo su - ec2-user

うまくインストールが完了していれば、dockerコマンドが使えるようになっているはずです。

$ docker version
Client:
 Version:      1.9.1
 API version:  1.21
 Go version:   go1.4.2
 Git commit:   a34a1d5/1.9.1
 Built:
 OS/Arch:      linux/amd64

Server:
 Version:      1.9.1
 API version:  1.21
 Go version:   go1.4.2
 Git commit:   a34a1d5/1.9.1
 Built:
 OS/Arch:      linux/amd64

docker-machineをインストール

最終的にはEC2でdocker-composeが使いたいわけですが、現時点でyumでのインストールはできませんでした。

以下の公式サイトにインストール手順が載っているのですが。。。
Installation on Oracle Linux

version6の場合は以下のようなエラー

Error: Package: docker-engine-1.10.2-1.el6.x86_64 (dockerrepo)
           Requires: kernel-uek >= 4.1
Error: docker-engine conflicts with docker-1.9.1-1.2.amzn1.x86_64

version7の場合は以下のようなエラー

Error: Package: docker-engine-selinux-1.10.2-1.el7.noarch (dockerrepo)
           Requires: selinux-policy-base >= 3.13.1-23
           Available: selinux-policy-minimum-3.10.0-98.23.amzn1.noarch (amzn-main)
               selinux-policy-base = 3.10.0-98.23.amzn1
           Available: selinux-policy-mls-3.10.0-98.23.amzn1.noarch (amzn-main)
               selinux-policy-base = 3.10.0-98.23.amzn1
           Available: selinux-policy-targeted-3.10.0-98.23.amzn1.noarch (amzn-main)
               selinux-policy-base = 3.10.0-98.23.amzn1
Error: Package: docker-engine-1.10.2-1.el7.x86_64 (dockerrepo)
           Requires: selinux-policy >= 3.13.1-23
           Available: selinux-policy-3.10.0-98.23.amzn1.noarch (amzn-main)
               selinux-policy = 3.10.0-98.23.amzn1
Error: Package: docker-engine-1.10.2-1.el7.x86_64 (dockerrepo)
           Requires: kernel-uek >= 4.1
Error: Package: docker-engine-1.10.2-1.el7.x86_64 (dockerrepo)
           Requires: libsystemd.so.0()(64bit)
Error: docker-engine conflicts with docker-1.9.1-1.2.amzn1.x86_64
Error: Package: docker-engine-1.10.2-1.el7.x86_64 (dockerrepo)
           Requires: libdevmapper.so.1.02(DM_1_02_97)(64bit)
Error: Package: docker-engine-selinux-1.10.2-1.el7.noarch (dockerrepo)
           Requires: selinux-policy-targeted >= 3.13.1-23
           Available: selinux-policy-targeted-3.10.0-98.23.amzn1.noarch (amzn-main)
               selinux-policy-targeted = 3.10.0-98.23.amzn1
Error: Package: docker-engine-1.10.2-1.el7.x86_64 (dockerrepo)
           Requires: systemd-units
Error: Package: docker-engine-1.10.2-1.el7.x86_64 (dockerrepo)
           Requires: selinux-policy >= 3.13.1-23
           Installing: selinux-policy-3.10.0-98.23.amzn1.noarch (amzn-main)
               selinux-policy = 3.10.0-98.23.amzn1
Error: Package: docker-engine-1.10.2-1.el7.x86_64 (dockerrepo)
           Requires: libsystemd.so.0(LIBSYSTEMD_209)(64bit)

上記のように依存関係のエラーが発生してしまい、解決することができませんでした。
そこで、yumによるインストールは断念しスクリプトファイルの直接ダウンロードを行うことにしました。

まずは、docker-machineです。

$ sudo su -
# curl -L https://github.com/docker/machine/releases/download/v0.6.0/docker-machine-`uname -s`-`uname -m` > /usr/local/bin/docker-machine
# chmod +x /usr/local/bin/docker-machine
# exit

以下のコマンドが実行できればインストール完了です。

$ docker-machine version
docker-machine version 0.6.0, build e27fb87

docker-composeをインストール

最後にdocker-composeも同様にスクリプトファイルの直接ダウンロードを行います。

$ sudo su -
# curl -L https://github.com/docker/compose/releases/download/1.5.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# exit

以下のコマンドが実行できればインストール完了です。

$ docker-compose version
docker-compose version: 1.5.0
docker-py version: 1.5.0
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013

コンテナを起動

準備ができましたので、ローカル環境で作成した設定ファイル一式をEC2サーバーにアップロードしましょう。

前回作成したtechpjin-lampフォルダをec2-userのホームディレクトリに丸ごとアップロードします。
techpjin/docker-compose.ymlファイルはホストに依存する設定がありますので修正を行います。

my-mariadb:
  image: mariadb:latest
  environment:
    - MYSQL_ROOT_PASSWORD=root
    - MYSQL_DATABASE=docker
    - MYSQL_USER=docker
    - MYSQL_PASSWORD=docker
  ports:
    - "3306:3306"

my-php:
  # image: my-php # 変更前
  build: ./php # 変更後
  ports:
    - "80:80"
  volumes:
    # - /c/Users/sudoy/Documents/docker/techpjin-lamp/php/public-html:/var/www/html # 変更前
    - /home/ec2-user/techpjin-lamp/php/public-html:/var/www/html # 変更後
  links:
    - my-mariadb

my-phpmyadmin:
  image: phpmyadmin/phpmyadmin
  ports:
    - "8080:80"
  links:
    - "my-mariadb:db"

imageからbuildに変更したのは、本連載ではdocker-composeを使う前にdocker buildであらかじめmy-phpというイメージを作成していたためimageでよかったのですが、今回はいちいちbuildするのが面倒ですのでbuild作業自体もdocker-composeに任せてしまうbuildを使うことにしました。

volumesの設定はdockerホストのディレクトリとコンテナのディレクトリのマッピング設定ですので、ホスト側のディレクトリは適宜変更しておく必要があります。ec2-userのホームディレクトリにtechpjin-lampフォルダをアップロードした場合には上記のような設定となります。

では、docker-composeコマンドでコンテナを起動してみましょう。

$ docker-compose up -d
Pulling my-mariadb (mariadb:latest)...
latest: Pulling from library/mariadb
f32095d4ba8a: Pull complete
9b607719a62a: Pull complete
077420be376c: Pull complete
ae8696aff42c: Pull complete
42e7cd15a962: Pull complete
ed8e8212ad78: Pull complete
963562b7a94f: Pull complete
21ac6fb61204: Pull complete
4b0c5aeb4028: Pull complete
8bd7fc36e955: Pull complete

Removing intermediate container 8767d2680f6e
Step 3 : RUN yum -y install php-mysql
 ---> Running in 93d6be48ae18
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package php-mysql.x86_64 0:5.4.16-36.el7_1 will be installed
--> Processing Dependency: php-pdo(x86-64) = 5.4.16-36.el7_1 for package: php-mysql-5.4.16-36.el7_1.x86_64
--> Processing Dependency: libmysqlclient.so.18(libmysqlclient_18)(64bit) for package: php-mysql-5.4.16-36.el7_1.x86_64
--> Processing Dependency: libmysqlclient.so.18()(64bit) for package: php-mysql-5.4.16-36.el7_1.x86_64
--> Running transaction check
---> Package mariadb-libs.x86_64 1:5.5.44-2.el7.centos will be installed
---> Package php-pdo.x86_64 0:5.4.16-36.el7_1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package            Arch         Version                       Repository  Size
================================================================================
Installing:
 php-mysql          x86_64       5.4.16-36.el7_1               base        99 k
Installing for dependencies:
 mariadb-libs       x86_64       1:5.5.44-2.el7.centos         base       754 k
 php-pdo            x86_64       5.4.16-36.el7_1               base        97 k

Transaction Summary
================================================================================
Install  1 Package (+2 Dependent packages)

Total download size: 951 k
Installed size: 4.8 M
Downloading packages:
--------------------------------------------------------------------------------
Total                                              2.5 MB/s | 951 kB  00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 1:mariadb-libs-5.5.44-2.el7.centos.x86_64                    1/3
  Installing : php-pdo-5.4.16-36.el7_1.x86_64                               2/3
  Installing : php-mysql-5.4.16-36.el7_1.x86_64                             3/3
  Verifying  : php-pdo-5.4.16-36.el7_1.x86_64                               1/3
  Verifying  : php-mysql-5.4.16-36.el7_1.x86_64                             2/3
  Verifying  : 1:mariadb-libs-5.5.44-2.el7.centos.x86_64                    3/3

Installed:
  php-mysql.x86_64 0:5.4.16-36.el7_1

Dependency Installed:
  mariadb-libs.x86_64 1:5.5.44-2.el7.centos   php-pdo.x86_64 0:5.4.16-36.el7_1

Complete!
 ---> 5a822e2b4632
Removing intermediate container 93d6be48ae18
Step 4 : EXPOSE 80
 ---> Running in a90a2bce1007
 ---> 2a0b55310701
Removing intermediate container a90a2bce1007
Step 5 : CMD /usr/sbin/httpd -D FOREGROUND
 ---> Running in f46b15c4cb9e
 ---> df724cefa462
Removing intermediate container f46b15c4cb9e
Successfully built df724cefa462
Creating techpjinlamp_my-php_1

※実行結果は一部省略しています。

ものの数分で終わってしまったかと思います。dockerがインストールされた環境があれば、わずかこれだけの時間で環境のコピーができてしまうということになります。このお手軽さ(イメージが軽くまた仮想環境の動作も軽い)がdockerの一つの魅力となっています。
また、vagrantなど仮想開発環境構築ツールと同様ではありますが、設定ファイルがすべてテキストになっていますので、svnやgitなどを使用した「インフラのバージョン管理」も簡単にできてしまう点も魅力ではないでしょうか。

最後に以下のURLが正常に表示できることを確認しましょう。

  • http://ec2-xxxxx.compute.amazonaws.com/
  • http://ec2-xxxxx.compute.amazonaws.com/db.php
  • http://ec2-xxxxx.compute.amazonaws.com:8080/

ホスト名の部分は各自のEC2パブリックDNSに読み替えてください。

※db.phpへアクセスした際に、DB接続エラーが発生してしまうかもしれません。ローカルで作成したコンテナの環境変数と、EC2で作成したコンテナの環境変数が変わってしまっていることが原因です。おそらくローカル側でmy-phpコンテナを起動した際に、最初はdocker-composeを使わなかったために発生していますので、ローカル側のコンテナとイメージをすべて削除したあとに再度docker-compose up -dを実行してみてください。
EC2とローカルの環境変数が同じになるはずです。(EC2側の環境変数が正しい)

今回はここまでにしておきます。

  • このエントリーをはてなブックマークに追加

PAGE TOP