どうも、アイアンマン好き千葉です。
今日は、OSごとアプリを自動的にデプロイする構成を作って見たので記事として残しておきます。
備忘録的意味合いが強いので、結構省略するかもしれません。
またブルーブリーンデプロイができない、1コンテデプロイしかできないので、柔軟性はとっても低いです。(もっと良いやり方ある!とかあれば、コメント頂けると嬉しいです。)
ただしGitHub、Docker、Jenkinsを知らない人は勉強にはなるのではないかと思います。
Dockerの初心者の方は、こちらをみるとライフサイクルがわかるのでなんとなくイメージが出来るようになるかも知れません。
構成図
※今回は、Dockerコンテナ、JenkinsはAWS上で動作させてます
GitHub環境の構築
環境の準備はこちらを参考に。
GitHubとDockerHubの連携
GitHubとDockerHubを連携します。
※どちらも、アカウント作成している前提でお話します。
- Add RepositoryからAutomated Buildを選択します。
これで、GitHunにDocerfileをコミットすると、DockerHubで自動的にBuildが実行されます。
Jenkinsの設定
- EC2インスタンスを作成して、Jenkinsをインストールします。
- Jenkinsにアクセスしてジョブを作成します。
ジョブは、以下のシェルを登録します。
#!/bin/sh
sudo docker ps | grep [コンテナ名]
result=`echo $?`
if [ ${result} -eq 0 ] ; then
sudo docker stop [コンテナ名]
sudo docker rm [コンテナ名]
fi
sudo docker images | grep '[イメージ名]'
result=`echo $?`
if [ ${result} -eq 0 ] ; then
sudo docker rmi [イメージ名]
fi
sudo docker pull [イメージ名]:latest
sudo docker run -d -p 80:80 --name [コンテナ名] [イメージ名]
-
Jenkinsでsudoが実行できるようににてsudoers実行を許可します。
-
Jenkinsでリモート実行できるように設定
jobのconfigureから、ビルドトリガの項目で、リモートからビルドを選択します。
そして、認証トークン名を入れます。
※確か、Jenkins上でユーザ作成やクレデンシャルの発行をしないとリモートからビルドの選択肢が表示されません
DockerHubとJenkinsの連携
DockerHubにwebhook設定
DockerHubでのBuildが成功したら、Jenkinsに設定しているJobを実行できるようにします。
やりかたは、DockerHunの先ほど作成したレポジトリを選択して、JenkinsのURLを設定します。
URLはこんな感じで設定しました。
http://[JenkinsIPアドレス]:8080/job/[ジョブ名]/build?token=[認証トークン]
で、DockerfileをGitHubへプッシュ
因みに、今回私が作成したDockerfile
FROM centos:centos6
MAINTAINER XXXXX <xxxx@gmail.com>
RUN yum update -y
RUN rpm --import http://nginx.org/keys/nginx_signing.key
RUN yum install -y http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
RUN yum install -y nginx
RUN yum install -y tar
ADD app.tar.gz /usr/share/nginx/html/
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
※app.tar.gzにhtml等を入れて、Dockerfileと同じ階層に配置しておきます
これで、アプリも含まれた形でイメージが作成されます。
プッシュします。
# git add .
# git commit -m "comment"
# git push origin master
すると、
- DockerHubでBuildが始まり
- Build完了後にWebhookのURLをリクエスト
- Jenkinsでジョブが実行される
- DockerHubから、イメージをダウンロードしてコンテナ起動
という流れで実行されます。
まとめ
Dockerのポータビリティ性を使って、インフラをアプリ感覚でデプロイ出来ました。
今までの、ハード調達して、データセンター借りて.......
という時代は終わり、使いたいときに使って、使った分だけ料金を払う。
そして、インフラはアプリ感覚でデプロイ運用していく時代になっていく感じがしました。
アプリリリースの時間短縮、開発工数の削減、運用工数の削減になると感じました。