DockerHub + CircleCIを使ったCI環境を作ってみた〜導入編
CircleCIを使い出していろいろ課題を感じてきたので、いろいろ試してみました。
前提
課題
- 今勤めている先ではCircleCIを使ってCI環境を作っていますが、利用が増えて待ち行列が発生。chefのcookに時間が一番かかっているものの、EC2インスタンスの起動やchefクライアントのインストールに時間がかかってます。ここをどうにかしたい。
- ciにわざわざAWS使う必要ないのでは(お金も少しだけかかるし)
- (単純に)docker使いたい。
ということでCircleCI上でdockerコンテナを使えないか試してみました。
CircleCIでDockerを使うためにやったこと
- Dockerfileの作成。
# Dockerfile FROM centos:centos6 MAINTAINER test RUN yum update -y # install package RUN yum -y install vim git RUN yum -y install passwd openssh openssh-server openssh-clients sudo # Create user RUN useradd docker RUN passwd -f -u docker # Set up SSH RUN mkdir -p /home/docker/.ssh; chown docker /home/docker/.ssh; chmod 700 /home/docker/.ssh ADD authorized_keys /home/docker/.ssh/authorized_keys RUN chown docker /home/docker/.ssh/authorized_keys RUN chmod 600 /home/docker/.ssh/authorized_keys # setup sudoers RUN echo "docker ALL=(ALL) ALL" >> /etc/sudoers.d/docker # Set up SSHD config RUN sed -ri 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config RUN sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config # Init SSHD RUN /etc/init.d/sshd start RUN /etc/init.d/sshd stop # #EXPOSE 22 CMD ["/usr/sbin/sshd","-D"]
- circle.ymlでDockerfileのbuildをするように設定
machine: timezone: Asia/Tokyo ruby: version: 2.2.0 services: - docker checkout: post: - git submodule sync - git submodule update --init # use submodules dependencies: pre: - ssh-keygen -t rsa -b 2048 -N "" -C "docker" -f ~/.ssh/id_rsa.docker - cat ~/.ssh/id_rsa.docker.pub > authorized_keys - docker build -t docker/test . test: override: - cp ./ssh-config.circleci ~/.ssh/config - docker run -d -p 40000:22 --name test01 docker/test - docker ps - bundle exec knife solo prepare ci - bundle exec knife solo cook -o dstat ci - bundle exec rake spec:ci
- CircleIからコンテナへのアクセスにはまりましたが、ssh/configの使い方を知り、なんとかできました。
- AWSを使ったときと違い、AWS側の各種設定やCircleCIの環境変数の設定などが不要で導入のハードルが低いと思います。
より高みへ
DockerHubの利用
- 自分で作ったimageを保存できるサービス。公式のbaseイメージをもとにCircleCIで毎回buildすると遅いと思います。DockerHubを利用すれば自分のオリジナルのimageを登録しておくことができ効率的です。githubアカウントがあると登録は簡単にできました。publicの場合は無料で利用できるのがありがたいですね。privateリポジトリだと数に応じてお金が発生しますが、ここはgitと同じですかね。
Automated Buildとは
- githubなどと連携することで、Dockerfileの変更を検知し自動でbuildしたimageを作ってくれるサービスです。buildに時間が多少かかるが、事前に作っておくことで時間短縮になります。
やってみて
- dockerの起動が早い!私の感覚だとAWSの環境の準備に4分くらいかかりましたが、dockerだと3分くらい。ただ、起動は数秒なんですが、buildに時間がかかりますね。DockerHub使うとdocker pullの時間が1分くらいになるのでより早い。まだ必要なパッケージとかをほとんど入れていないので、まだなんとも言えないです。特にcacheや事前にインストールしておくパッケージ(chefクライアント)を精査すればさらに早くなるのではと思います。また、肝心のcookの時間ですがdockerの方が時間がかかりました。まだ一つしかレシピがないので数が多くなった際にどうなるのかも検証しないといけない部分かと思います。
- 既存の環境からの移行をどうするのか。AWSからdockerへの移行をどうするのかがまだ解消できていないので、そこを検証中です。後編としてそのうちアップしたいと思います。