Edited at

MacでElastic Beanstalk + Multi Container Dockerの `eb local run` を動かす

More than 3 years have passed since last update.

追記: 2016-03-31 EB CLI 3.7.4で改善され、手元の環境(Docker 1.10.3)でも動作することが確認できました。

Release: EB CLI 3.7.4 on 2016-03-22 : Release Notes : Amazon Web Services


Elastic BeanstalkのEB CLIには、Multi Container Dockerのコンテナの場合、定義ファイル(Dockerrun.aws.json)を元にローカル環境でコンテナを実行できるeb local runという便利なコマンドがある。この使い方では、Docker Composeのようなもの、といった方がわかりやすいかもしれない。

追記: Docker Composeのようなもの、というかDocker Composeだった。eb local run 実行後、.elasticbeanstalk/docker-compose.ymlが生成されている。

ただし、現時点(2016/02/29)でbrewでインストールできる最新バージョンは1.10.2だが、EB CLIで必要としているバージョンは1.6.0なので、単純に動かそうと思っても動かない。

動かすためにちょっと苦労したので、手順をメモする。


環境


  • OS X EL Capitan Version 10.11.3

  • EB CLI 3.7.3 (Python 2.7.1)

  • docker-machine version 0.6.0, build e27fb87

  • VirtualBox 5.0.6 r103037


現象

Docker1.10.2で該当コマンドを実行するとエラーが発生する。

$ eb init

$ eb local run
ERROR: You must install Docker version 1.6.0 to continue. If you are using Mac OS X, ensure you have boot2docker version 1.6.0. Currently, "eb local" does not support Windows.


手順


Docker1.6.0をインストール

~/bin にパスが通って無ければ通す。

$ echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile

$ source ~/.bash_profile

brewでDockerをインストールしている場合はアンリンク。

$ brew unlink docker

Docker1.6.0をインストール。

$ mkdir -p ~/bin && cd ~/bin

$ curl -LO https://get.docker.com/builds/Darwin/x86_64/docker-1.6.0
$ chmod +x docker-1.6.0
$ ln -s docker-1.6.0 docker
$ docker --version
Docker version 1.6.0, build 4749651


Docker Machine上でDocker1.6.0をインストール

DockerとDocker Machine上のDockerは同じバージョンである必要があるので、対応するboot2dockerでイメージを作成。

$ docker-machine create -d virtualbox \

--virtualbox-boot2docker-url https://github.com/tianon/boot2docker-legacy/releases/download/v1.6.0-rc7/boot2docker.iso \
b2d-160
$ eval $(docker-machine env b2d-160)


動作確認

公式デモのNginx+PHP-FPMを使うのでGitHubからClone。

$ git clone git@github.com:awslabs/eb-docker-nginx-proxy.git

$ cd eb-docker-nginx-proxy

本記事の目的のコマンドを実行。

$ eb local run

...
Attaching to elasticbeanstalk_phpapp_1, elasticbeanstalk_nginxproxy_1
phpapp_1 | [29-Feb-2016 13:49:39] NOTICE: fpm is running, pid 1
phpapp_1 | [29-Feb-2016 13:49:39] NOTICE: ready to handle connections

Nginx+PHP-FPMが動作していることを確認。

$ curl -i http://$(docker-machine ip b2d-160)

HTTP/1.1 200 OK
Server: nginx/1.9.11
Date: Mon, 29 Feb 2016 13:50:28 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/7.0.3

<h1>Hello World!!!</h1>
<h3>PHP Version 7.0.3</h3>
<a href="/static.html">Static HTML Page</a>%


HomeBrewでインストールしたバージョンに戻したい場合

再度リンクを張ればOK。~/.binの方が優先度低いので、brewでインストールしたバージョンになる。

$ brew link docker

Linking /usr/local/Cellar/docker/1.10.2... 4 symlinks created
$ docker --version
Docker version 1.10.2, build c3959b1


苦労の軌跡


  • homebrew/versionsにhomebrew/versions/docker162があったが試す前にbrew installに失敗


  • dvmというDocker Version管理ツールを見つけたが1.6.0はインストールできない


最後に

ElasticBeanstalkのPrivate Registryの認証もDocker1.6なので、その辺りが関係していると思われる。eb local runはすごく便利なのでもう少し簡単に動くようになれば、と思う。