DockerとDockerHubを半年使って得たこと


現在仕事でWebアプリを開発しております。アーキテクトを任せて頂けたので色々好きな技術を使って構築しています。

アプリをデプロイするためにDockerとDockerHubを使っているので、今日はこれらについて触れて行きます。

前提

  1. 業務アプリ
  2. 合計利用者300名
  3. 同時利用者10名

アーキテクチャ

  1. 自社のDC上でWebアプリ用仮想マシンが動いている
  2. 上記のマシン上でDockerが動いている
  3. 開発したアプリは自社のGitHub Enterpriseへcommit, push
  4. JenkinsのJobを走らせてGitHub Enterpriseからコードをclone, compile
  5. compileが成功したらJenkinsがdocker build, docker pushでDockerHubにバイナリをupload
  6. 好きなタイミングで別のJenkins Jobを動かしてdocker pull, docker runで、アプリケーションスタート

感想

dockerを使っているおかげでDC上の仮想マシンが死んでも、別の仮想マシン上に即座に安定してデプロイできます。

・・・ですが正直デメリットの方が大きいです。

  1. docker buildが遅い
  2. docker pushが遅い
  3. docker pullも少しだけ遅い
  4. docker用にDockerfileが必要
  5. GitHub EnterpriseだとDockerHubのGitHubフックが使えない

全体的に遅い!コンパイルが遅いことで有名なscalaを使っていることも相まって壊滅的に遅い!

docker buildは差分ビルドをしてくれますが、それを加味しても遅いです。docker pushもヤバい感じです。そもそもイメージが大体500MB〜1000MBあるのに、これの転送が早い訳が無いです。ローカルネットならまだしもDockerHubにあげるのでなかなか厳しいです。

ちなみに自分の場合ですが、scalaコードコンパイル+docker build+docker pushで大体15分かかっています。docker pullとrunは2分ほどかかっています。

Dockerfileを書くのも少しだけ骨が折れます。dockerから見たホストOS側をChefでセッティングしているのですが、それに加えてDockerfileとなると、これはどうなんだろう?と感じています。

正直スケールアウトなどをばんばんする予定、あるいはそこを負荷によって自動化する予定でも無い限りdockerの意味はあまり無い気がしています。

結論、どうするのが良いの?

結局は環境だとかアプリの特性だとかそういう色々なものに左右されるかと思いますが・・・

少なくとも小規模アプリであればdocker使わずに普通に対象OS上にJenkinsなり何なりでデプロイする方法が良いと思います。

DockerHubを使わずに社内にDockerリポジトリを用意するのもありかもしれません。