話題の記事

Docker for AWS を試してみた

2017.07.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

以前の記事で Docker for AWS について触れました。

せっかくなので、Docker for AWS を試してみたいなと思い検証してみました。

Docker for AWS とは

上記のページから引用すると下記のとおりです。

Docker for AWSは、AWS上でアプリケーションを構築、アセンブル、および出荷するための統合された、配置が容易な環境で、基盤となるAWS IaaSサービスを最適に活用するために最適化されたネイティブAWSアプリケーションです。ポータブルアプリを導入する Docker for AWSには、ソフトウェアをインストールする必要はありません。

ブラウザとAWSアカウントが必要なだけで、数回クリックするだけでDockerをプロビジョニングできます。Docker for AWSはデフォルトでTLSを使用してエンドツーエンドのDocker Enginesをインストールし、AWS Autoscaling、Elastic Load Balancer、Elastic Block Storeと統合されています。

環境構築した感触から個人の印象としては、moby linux AMI を利用し Cloudformation によって構築される Docker クラスター用のテンプレートというイメージです。

筆者の検証環境について

以下のバージョンを利用して、検証を行いました。

  • Docker for Mac 17.03.1-ce
  • macOS Sierra 10.12.5(16F73)
 ~ $ docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Tue Mar 28 00:40:02 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:00:50 2017
 OS/Arch:      linux/amd64
 Experimental: true
 ~ $ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.12.5
BuildVersion:   16F73
 ~ $

Docker for AWS 環境を構築

Docker for AWS の構築にあたり、目を通しておくドキュメントは以下かと思われます。

今回は、Docker Community Edition (CE) for AWS の Stable channel を利用します。 予め AWS アカウントでサインアップし、上記のリンク先ページへアクセスしておいてください。

Docker for AWS Setup1

スタックの作成

まずは、テンプレートの選択画面です。次へをクリックします。 Docker for AWS Setup2

次に詳細の指定画面となります。変更するパラメータがあれば、お好みで変更してから次へをクリックします。 本記事では、Swarm Manager 数を 1 へ、worker node 数を 2 へ変更しました。 Docker for AWS Setup3

オプション選択です。こちらもお好みで変更してから次へをクリックします。 Docker for AWS Setup4

最終確認画面です。本記事では、「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」のチェックボックスにチェックを入れて作成ボタンをクリックしました。 Docker for AWS Setup5

スタックの作成が開始します。 Docker for AWS Setup6

おおよそですが、10分程度で CREATE_COMPLETE に遷移しました。 Docker_for_AWS_Setup7

Docker for AWS 環境にアプリケーションをデプロイしてみる

まずは、マネージャーノードの Public IP を確認します。 EC2 インスタンスから、Docker-Manager で検索することで特定できます。 Docker_for_AWS_Setup8

Public IP が確認出来れば、SSH で接続します。

$ ssh -i <path-to-ssh-key> docker@<ssh-host>
Welcome to Docker!
~ $ uname -a 
Linux a8b81e8dfebc 4.9.31-moby #1 SMP Sat Jun 24 06:29:12 UTC 2017 x86_64 Linux
~ $ cat /etc/os-release 
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.5.2
PRETTY_NAME="Alpine Linux v3.5"
HOME_URL="http://alpinelinux.org"
BUG_REPORT_URL="http://bugs.alpinelinux.org"
~ $

moby linux が利用されていますね。 swarm manager node から、docker info や docker node ls を実行することにより環境構成を確認できます。

~ $ docker node ls
ID                            HOSTNAME                                          STATUS              AVAILABILITY        MANAGER STATUS
2p4dsfkwuu6li9beynep7i1wa     ip-172-31-17-51.region.compute.internal   Ready               Active              
590r1psq186nvgsm27zq52u11 *   ip-172-31-25-8.region.compute.internal    Ready               Active              Leader
mlwo9vwvq41abmxhqilb3rt2n     ip-172-31-10-91.region.compute.internal   Ready               Active

作業PC(macOS)側で swarm mangaer node の Docker socket 宛へ SSH トンネルを掘れば、クラスタノード上の docker コマンドも PC からリモートで実行が可能です。

$ ssh -i <path-to-ssh-key> -NL localhost:2374:/var/run/docker.sock docker@<ssh-host> &
$ docker -H localhost:2374 info

DOCKER_HOST 環境変数を設定すれば、さらに -H オプションの指定も不要です。

$ export DOCKER_HOST='localhost:2374'
$ docker info

ここまで来れば、コンテナとサービスの作成を開始できます。

以下のコマンドを実行することにより、サービスが作成され nginx コンテナが起動します。

 ~ $ docker service create --name nginx -p 80:80 nginx
ygooeewderty55b2qpxsn0o3m
 ~ $ docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS                        NAMES
de2a6848dcd8        nginx:latest                                "nginx -g 'daemon ..."   31 seconds ago      Up 30 seconds       80/tcp                       nginx.1.l869nrxxp1yge3egkrmvq4ndb
a8b81e8dfebc        docker4x/shell-aws:17.06.0-ce-aws1          "/entry.sh /usr/sb..."   29 minutes ago      Up 29 minutes       0.0.0.0:22->22/tcp           shell-aws
3518c620be43        docker4x/l4controller-aws:17.06.0-ce-aws1   "loadbalancer run ..."   29 minutes ago      Up 29 minutes                                    l4controller-aws
d63efac9c67f        docker4x/meta-aws:17.06.0-ce-aws1           "metaserver -iaas_..."   29 minutes ago      Up 29 minutes       172.31.25.8:9024->8080/tcp   meta-aws
02395b5e8fc8        docker4x/guide-aws:17.06.0-ce-aws1          "/entry.sh"              29 minutes ago      Up 29 minutes                                    guide-aws

公開されたポート -p 80:80 は、ELB(Classic)を通じて自動的に公開されます。 Docker_for_AWS_Setup9

ELB の DNSName を確認し、ブラウザからアクセスしてみます。

 ~ $ aws elb describe-load-balancers | jq .LoadBalancerDescriptions[].DNSName
"Docker-ExternalLoa-1AWAAMPKSJ20G-nnnnnnnnnn.region.elb.amazonaws.com"

nginx の Welcome ページが表示されることを確認できました。

worker node に接続するには

worker node への SSH 接続は、public Internet を介したアクセスが許可されていません。 一旦、manager node へ接続し SSH agent forwarding を有効化した状態で private network を介して接続する必要があります。

まず始めに、SSH agent forwarding を有効化します。 なお、macOS を利用している場合は、以下のコマンドを利用することにより、パスフレーズもキーチェーンに格納されるため、PC 再起動後も有効になります。

$ ssh-add -K ~/.ssh/your_key
$ ssh-add -L #エージェント内のキーを表示する

次に、swarm manager node 経由で worker node へ SSH (private network を介して)接続を行います。

 ~ $ ssh -A docker@<ssh-host>
Welcome to Docker!
~ $ ssh docker@ip-172-31-17-51.region.compute.internal
Welcome to Docker!
~ $ docker ps
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS              PORTS                NAMES
acd20d64a32d        docker4x/shell-aws:17.06.0-ce-aws1   "/entry.sh /usr/sb..."   About an hour ago   Up About an hour    0.0.0.0:22->22/tcp   shell-aws
f5c61a26d17a        docker4x/guide-aws:17.06.0-ce-aws1   "/entry.sh"              About an hour ago   Up About an hour                         guide-aws
~ $

さいごに

今回は、Docker for AWS 環境を構築し nginx コンテナを起動するところまでを試してみました。 手元の環境から、SSH トンネルを介した Docker HOST へのリモートアクセスを行うことにより AWS 環境へシームレスにコンテナを起動することが出来そうです。

他にも色々と試してみたいことがありますが、本記事は以上となります。 ではでは