tjinjin's blog

自分用のメモです

DockerHub + CircleCIを使ったCI環境を作ってみた〜導入編

CircleCIを使い出していろいろ課題を感じてきたので、いろいろ試してみました。

前提

  • CircleCIでのテストでは、vagrant-awsを使いEC2インスタンスを立ててそこに対してserverのテストを行っていました。

課題

  • 今勤めている先では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への移行をどうするのかがまだ解消できていないので、そこを検証中です。後編としてそのうちアップしたいと思います。

参考