LoginSignup
3
1

More than 5 years have passed since last update.

Amazon EC2 Container Registry (ECR)を使ったデプロイフローの検証(未完)

Last updated at Posted at 2016-12-04

序文

PHPで作ったwebアプリケーションの本番環境をとある事情でDockerで運用しています。前々から個人用のDockerHubにImage置けたらpullしてrunするだけでデプロイ楽なのにと思っていましたが、Amazon EC2 Container Registry (ECR)なるものがあるらしく、こいつを使っていい感じのデプロイフローが出来ないか試してみました。

Google Cloud Platform派の方はこちらをどうぞ。

ちなみに前提として今回のデプロイ先はAmazon EC2 Container ServiceではなくCentOS6系の上に建てたDockerです。

今回試したいこと

  1. 開発環境でbuildしてからECRにpushしてみる
  2. ステージング環境でpullして、runしてみる
  3. Jenkinsを使ってDocker imageをbuildしてpush出来るようにする
  4. Jenkinsを使ってステージング環境でpullしてrun出来るようにする

開発環境でbuildしてからECRにpushしてみる

AWSのWebConsoleのpushコマンドの表示に書いてある通りにすれば出来ますが、作業ログの役割もあるのでここにも書いておきます。
(WebConsoleの方はrepository名が自分のものになっていてそのままコピペできるようになっているので、作業時はそちらを参考にした方がいいです。AWSさん本当に親切。)

0. 前準備

AWS コマンドラインインターフェイスが必要です。
そしてAWS コマンドラインインターフェイスを入れるためにはpipが必要です。
また、Python 2.6.5 以降が必要ですが、流石にこれは気にしなくてもだいたい入っているでしょう。

pip install

curl -kL https://bootstrap.pypa.io/get-pip.py | python

AWS コマンドラインインターフェイス install

pip install awscli

アカウント設定

aws configure
AWS Access Key ID [None]: 自分のを入力して下さい
AWS Secret Access Key [None]: 自分のを入力して下さい
Default region name [None]: ap-northeast-1(東京リージョンならこれ)
Default output format [None]: json(適当に好きな形式を)

1. docker loginコマンドを取得

aws ecr get-login --region ap-northeast-1

2. 前の手順で返されたdocker loginコマンドを実行する

3. Docker imageを作成する(すでに作成済みの場合はとばせます)

docker build -t my_image .

4. pushようにタグを付けなおす

docker tag my_image:latest hogehogehoge.dkr.ecr.ap-northeast-1.amazonaws.com/repository_name:latest

5. pushする

docker push hogehogehoge.dkr.ecr.ap-northeast-1.amazonaws.com/repository_name:latest

ステージング環境でpullして、runしてみる

push編とやることはだいたい同じです。

0. 前準備

AWS コマンドラインインターフェイスが以下ry
pipが以下ry

ここでもaws configureすることになるので、真面目にやるなら専用のIAM用意してECRのpull権限だけ振るべきだと思います。

1. docker loginコマンドを取得

aws ecr get-login --region ap-northeast-1

2. 前の手順で返されたdocker loginコマンドを実行する

3. pullする

docker pull hogehogehoge.dkr.ecr.ap-northeast-1.amazonaws.com/repository_name:latest

Jenkinsを使ってDocker imageをbuildしてpush出来るようにする

ごめんなさい。ここから先は実は試せていません。理由は後述します。
Amazon ECRを使えば簡単にできそう。

Jenkinsを使ってステージング環境でpullしてrun出来るようにする

SSH pluginでsshしてpullしてrunするつもりでした。

辛かったこと

Invalid repository name (namespace/repo), only [a-z0-9-_.] are allowedでpullできない

名前空間はオプションであり、スラッシュを使用してリポジトリ名に含めることができます(namespace/repo など)。

と書いてあったので、そうかそうかと「/」で区切って名前空間を切ったところ、CentOSでpullできない自体に遭遇しました。試しにMac上でpullしてみたら普通に出来たのでバージョン依存の何らかのバグっぽいです。docker versionしたらCentOSは1.7でMacは1.13。だいぶ古かったのでバージョンを上げてみることにしました。

Docker 1.8からCentOS6はサポート外

(´・ω・`)
詳しくは下記をどうぞ。
Docker v1.8 から RHEL/CentOS6 はサポート外になった

CentOS6系そろそろ辛いですね。

Docker pull途中でなぜかDockerがdownする

名前空間を使わずに_つなぎでrepositoryを作り直したところpullが開始されました。
しかし、しばらくするとなぜか必ずDockerのdemonが強制終了してしまいます。

logを辿ったところ下記のerrorを発見(ちなみにlogの場所は普通に/var/log/dockerでした。)

level=error msg="Error from V2 registry: unable to copy v2 image blob data: read tcp ip_address: i/o timeout"
panic: runtime error: invalid memory address or nil pointer dereference

原因はこのあたり?
https://github.com/docker/distribution/issues/785

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1