Dockerであそぶ(9)AWS EC2でdocker-composeを使う
ここ1,2年で注目を集めている仮想化技術の1つ「Docker」について、今更感がありますが試していきたいと思います。
他の仮想化技術との違いや特徴、開発環境として使っていくにはどうすればいいかなどを紹介していきたいと考えています。
これまでの連載
- Dockerであそぶ(1)DockerToolboxのインストール
- Dockerであそぶ(2)Centos7を実行する
- Dockerであそぶ(3)Apacheを使う
- Dockerであそぶ(4)Apacheの設定を変える
- Dockerであそぶ(5)Apache-PHP連携
- Dockerであそぶ(6)Apache-PHP-Mariadb連携
- Dockerであそぶ(7)PhpMyAdminのインストール
- Dockerであそぶ(8)docker-composeでコンテナをまとめて管理
- Dockerであそぶ(9)AWS EC2でdocker-composeを使う ← 本記事!
- Dockerであそぶ(10)docker-machineを使ってAWS(EC2)に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側の環境変数が正しい)
今回はここまでにしておきます。