Jenkins から Docker を操作する環境構築の記録

docker, Jenkins

いきなり結論

記事が長くなってしまったので、最初にこの記事で言いたいことを書いておきます。
さいあく、ここだけ読んで貰えれば大丈夫です。

  • Amazon Linux で Docker をインストールする際は amzn-updates リポジトリを用いる
    • Docker 公式のリポジトリは Amazon Linux では使用不可
    • 公式リポジトリを用いる際は /etc/yum.conf ファイルの releasever オプションが古いバージョンになっていないか気をつける
  • Docker Compose は Amazon Linux のリポジトリになりので、Github からバイナリを持ってくる
  • Jenkins から docker コマンドの実行に失敗した場合、調べるべき点は2つ
    • jenkins ユーザ(もしくはJenkinsを実行するユーザ )が docker グループに入っているかどうか(詳しくはこちら)
    • Docker サービスの起動オプションとして、TCP をリッスンするようになっているか(詳しくはこちら )

本編

はじめに

WIZY では Docker を使って画面テストを行うという計画が、私がチームに入るより前からあったそうです。
WIZY を構成する以下のような要素を全て Docker で構築して、開発チームが git に push する度に Jenkins で自動テストを行うという計画だそうです。

  • Web フロント
  • API
  • 管理用画面
  • DB
  • Key-Valueストア(キャッシュ)

Docker でビルドの度に環境を作ることで、テスト環境に変なファイルが残っていて正常にテストが出来ない、ということはなくなりそうです。
それ以外にも、Mac や Linux、Windows での環境に依存したテストの失敗も起こらなくなります(特に Python と Windows の組合せは酷い)

このためには、jenkins から docker build したり、 docker-compose up する必要があります。
簡単に設定できるか、と思っていたのですが思いのほか面倒だったので、構築記録をここで共有します。

環境

  • Amazon Linux 2016.09
    • Jenkins 2.44
  • Docker などはこれからインストールする

Docker をインストール

これがないと始まりません。Docker を Amazon Linux にインストールします。

とりあえず最新の安定版が欲しかったので、amzn-main リポジトリではなく
Docker 公式のリポジトリ からインストールを試みました。

ページに書いてある通りにリポジトリを追加して、(コマンドは割愛)

インストールコマンドを実行すると…

いまだかつてない勢いでエラーが出ました。
CentOS 用のものをそのまま流用しようと考えた私が甘かったみたいです。
(調べましたが、このエラーを解消してインストールするのは無理ゲーみたいです)

ということで、amzn-* のリポジトリからインストールしましょう。

Amazon Linux のリポジトリ(の最新版)ならば 1.12 がインストールされるみたいです。
後々使う Docker Compose

Note that Compose 1.10.0-rc2 requires Docker Engine 1.10.0 or later for version 2 of the Compose File format, and Docker Engine 1.9.1 or later for version 1.

と書かれており、今回の要件のためには 1.10 以上でないといけないらしいですが、今回は 1.12 なのでセーフです。

Docker Compose をインストール

先ほどと同じように公式リポジトリからインストールしましょう

ないらしいです。

Github からバイナリを持ってきましょう

jenkins ユーザに docker の実行権限を付ける

デフォルトの状態だと、docker コマンドを叩くことが出来るのは root だけです。
jenkins ユーザも docker コマンドを実行する権限を与えましょう。

公式ドキュメント によると、docker というグループにユーザを追加してあげればいいそうです。

Jenkins でビルド(Docker のイメージを作成)してみる

新規ジョブ作成し、以下のようにしました。
Github から Clone してきて、Dockerfile に従ってイメージを作るだけのジョブです

  • プロジェクト名 => peach-web
  • 種類 => フリースタイル・プロジェクトのビルド
  • ソースコード管理 => Git (Wizy の Webリポジトリを設定)
  • ビルド => シェルの実行 (下記内容)

これを実行すれば問題なく docker のイメージが作成される…はずでしたが失敗しました。
エラーを見ると、次のように書かれていました。

このエラー、Docker を操作する権限がない状態で Docker に接続しようとすると出てくるエラーです。
しかし、私はさっきちゃんと Jenkins ユーザに実行権限を与えています。
実際、以下のコマンドを叩けば Docker のイメージを作成できました。

Jenkins から Docker に繋がらない問題

困ったときの StackOverflow で調べてみました。

2375 ポートとは、調べてみると Docker を外部から操作するためのポートらしいです。
しかし、Jenkins って思いっきりローカルホストなので、なぜこれが必要なのか分かりません。

しかし、他に方法も思いつかないので従ってみます。
Amazon Linux だと設定ファイルは下記の場所にあるので編集します。

以下の一行を追加

そして、Docker と Jenkins を再起動

すると、先ほどのビルドが動きました!

なぜ、2375 ポートをリッスンする必要があるのか

調べてみたのですが、分かりませんでした(泣)
現在もこの設定で Jenkins はビルドをしてくれているのですが、理由が分からず動いているのがとても嫌です。
どなたか、ご存知の方がいらっしゃいましたら教えてください。

docker, Jenkins