読者です 読者をやめる 読者になる 読者になる

tjinjin's blog

いつかすごいエンジニアになることを目指して、日々学んだことを書いていきます。

DockerHub + CircleCIを使ったCI環境を作ってみた〜実践編

前日の導入編に続いてです。

DockerHubを使いAutomated buildを使うことで事前にbuildをさせるところまでやりました。今日は昨日の情報を元にCIの高速化や実際に使うとなった際の課題を考えたいと思います。

CIの高速化

serverの構築にchefを使っているので、clientのインストールが必要です。そこは事前に行ってしまって問題ないので、Dockerfileの中でインストールさせます。

RUN curl -L https://www.opscode.com/chef/install.sh | bash

これを書いただけです。ローカルでimageを起動させ、knifeコマンドが使えるか確認します。

$ docker run -i -t krossblack777/dockerhub-test /bin/bash
[root@2586bda21c0d /]# which knife
/usr/bin/knife

CircleCIサーバへpushしてみます。

git commit --allow-empty -m "test"
git push origin master
  • 結論から言うとあまり早くなりませんでした。prepareの時間がそもそもそれほどかかっていないというのとdocker pullのイメージがサイズが大きくなった分すこし時間がかかるようになりました。DockerHubを使うよりローカルにいかにキャッシュさせるかを考えたほうが良いみたいです。

細かすぎて伝わらないかもしれない、CircleCIでDockerをごにょごにょするときのスピードアップテク - パラボラアンテナと星の日記

現環境からの移行について

  • すでになんらかの形でCIをしている場合、vagrant-awsやローカルでvagrantを使っていたり、そもそもCIしてなかったり。。そこの移行をどうするかを考えてみました。

AMIからimageを作る

  • AMIを利用している場合はそのAMIを利用して、docker imageを作成できます。

    1. image化したいAMIを選択しEC2インスタンスを立てる。
    2. そのインスタンスを停止させ、EBSをdettachする
    3. dockerがインストール済みの別のインスタンスを用意し、先ほど外したEBSをattachする
    4. 任意のディレクトリにdiskをmountさせ、まとめてtar化する。
    5. tar化したものをdocker importで取り組めばimageとして利用できる。
cat amazon.tar.gz| sudo docker import - exampleimagelocal:new
REPOSITORY                     TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
exampleimagelocal              new                 4f7118194129        18 hours ago        1.008 GB

base imageがある場合

  • 今利用しているディストリビューションのバージョンのbase imageがある場合はそれを元にDockerfileで必要な設定を入れていけばいいと思います。

欲しいbase imageがない場合

  • 公式のbase imageがない場合、知らない人のimageはセキュリティの観点から利用ができない場面があるかと思います。その場合は、一から作成することができます。rhel系のimageを作りたい場合はfebootstrapというツールを使います。debian系はdebootstrapというものがあるみたいです。

所感

既存環境からの移行は、最初にしっかりやってしまえばうまくできそうな気がしています。CI環境の改善がメインと思ってますが、各マシン内の環境もdockerをうまく使えるようにすればより開発に集中できるのではと思ってます。Packerを使えばより簡単にimageを作れるかもという情報を聞いたので、今度はそこを試してみたいと思います。あとはもっと公式ドキュメント読もう。。。

参考

  • AMIからimageを作る

Docker Meetup Tokyo #2でLTしてきた:「Docker+serverspecで作るconfigspec CI」 #dockerjp | Developers.IO

  • カスタムimageを作成する

docker向けRHLE系のbase imageを作る - Qiita

  • docker 公式

Docker - Build, Ship, and Run Any App, Anywhere