LoginSignup
35
37

More than 5 years have passed since last update.

Dockerコンテナを利用して、OS環境ごとアプリケーションを自動デプロイしてみた

Last updated at Posted at 2015-01-15

どうも、アイアンマン好き千葉です。

今日は、OSごとアプリを自動的にデプロイする構成を作って見たので記事として残しておきます。
備忘録的意味合いが強いので、結構省略するかもしれません。

またブルーブリーンデプロイができない、1コンテデプロイしかできないので、柔軟性はとっても低いです。(もっと良いやり方ある!とかあれば、コメント頂けると嬉しいです。)

ただしGitHub、Docker、Jenkinsを知らない人は勉強にはなるのではないかと思います。

Dockerの初心者の方は、こちらをみるとライフサイクルがわかるのでなんとなくイメージが出来るようになるかも知れません。

構成図

名称未設定.png

※今回は、Dockerコンテナ、JenkinsはAWS上で動作させてます

GitHub環境の構築

環境の準備はこちらを参考に。

GitHubとDockerHubの連携

GitHubとDockerHubを連携します。
※どちらも、アカウント作成している前提でお話します。

  1. Add RepositoryからAutomated Buildを選択します。

スクリーンショット 2015-01-16 0.38.37.png

  1. GitHubを選択
    スクリーンショット 2015-01-16 0.42.16.png

  2. あとは、登録したいGitHubを設定

これで、GitHunにDocerfileをコミットすると、DockerHubで自動的にBuildが実行されます。

Jenkinsの設定

  1. EC2インスタンスを作成して、Jenkinsをインストールします。
  2. Jenkinsにアクセスしてジョブを作成します。

ジョブは、以下のシェルを登録します。

bash
#!/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 [コンテナ名] [イメージ名]
  1. Jenkinsでsudoが実行できるようににてsudoers実行を許可します。

  2. Jenkinsでリモート実行できるように設定
    jobのconfigureから、ビルドトリガの項目で、リモートからビルドを選択します。
    そして、認証トークン名を入れます。
    ※確か、Jenkins上でユーザ作成やクレデンシャルの発行をしないとリモートからビルドの選択肢が表示されません

DockerHubとJenkinsの連携

DockerHubにwebhook設定

DockerHubでのBuildが成功したら、Jenkinsに設定しているJobを実行できるようにします。
やりかたは、DockerHunの先ほど作成したレポジトリを選択して、JenkinsのURLを設定します。

スクリーンショット 2015-01-16 0.46.41.png

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のポータビリティ性を使って、インフラをアプリ感覚でデプロイ出来ました。
今までの、ハード調達して、データセンター借りて.......

という時代は終わり、使いたいときに使って、使った分だけ料金を払う。
そして、インフラはアプリ感覚でデプロイ運用していく時代になっていく感じがしました。

アプリリリースの時間短縮、開発工数の削減、運用工数の削減になると感じました。

35
37
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
35
37