目次

目次

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

アバター画像
江藤 光
アバター画像
江藤 光
最終更新日2017/04/03 投稿日2017/04/03

いきなり結論

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

  • 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 公式のリポジトリ からインストールを試みました。

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

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

$ sudo yum install docker-engine
読み込んだプラグイン:priorities, update-motd, upgrade-helper
318 packages excluded due to repository priority protections
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ docker-engine.x86_64 0:1.13.0-1.el7.centos を インストール
--> 依存性の処理をしています: selinux-policy >= 3.13.1-23 のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: docker-engine-selinux >= 1.13.0-1.el7.centos のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libdevmapper.so.1.02(DM_1_02_97)(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libsystemd.so.0(LIBSYSTEMD_209)(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: systemd-units のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libseccomp.so.2()(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libsystemd.so.0()(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libltdl.so.7()(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ docker-engine.x86_64 0:1.13.0-1.el7.centos を インストール
--> 依存性の処理をしています: selinux-policy >= 3.13.1-23 のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libdevmapper.so.1.02(DM_1_02_97)(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libsystemd.so.0(LIBSYSTEMD_209)(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: systemd-units のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libsystemd.so.0()(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
---> パッケージ docker-engine-selinux.noarch 0:1.13.0-1.el7.centos を インストール
--> 依存性の処理をしています: selinux-policy-base >= 3.13.1-102 のパッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch
--> 依存性の処理をしています: selinux-policy-targeted >= 3.13.1-102 のパッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch
--> 依存性の処理をしています: policycoreutils-python のパッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch
---> パッケージ libseccomp.x86_64 0:2.3.1-2.3.amzn1 を インストール
---> パッケージ libtool-ltdl.x86_64 0:2.4.2-20.4.8.3.31.amzn1 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ docker-engine.x86_64 0:1.13.0-1.el7.centos を インストール
--> 依存性の処理をしています: selinux-policy >= 3.13.1-23 のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libdevmapper.so.1.02(DM_1_02_97)(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libsystemd.so.0(LIBSYSTEMD_209)(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: systemd-units のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libsystemd.so.0()(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
---> パッケージ docker-engine-selinux.noarch 0:1.13.0-1.el7.centos を インストール
--> 依存性の処理をしています: selinux-policy-base >= 3.13.1-102 のパッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch
--> 依存性の処理をしています: selinux-policy-targeted >= 3.13.1-102 のパッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch
---> パッケージ policycoreutils-python.x86_64 0:2.1.12-5.25.amzn1 を インストール
--> 依存性の処理をしています: setools-libs-python(python27) >= 3.3.7-14 のパッケージ: policycoreutils-python-2.1.12-5.25.amzn1.x86_64
--> 依存性の処理をしています: audit-libs-python(python27) >= 2.1.3-4 のパッケージ: policycoreutils-python-2.1.12-5.25.amzn1.x86_64
--> 依存性の処理をしています: libsemanage-python(python27) >= 2.1.6-3 のパッケージ: policycoreutils-python-2.1.12-5.25.amzn1.x86_64
--> 依存性の処理をしています: selinux-policy-devel のパッケージ: policycoreutils-python-2.1.12-5.25.amzn1.x86_64
--> 依存性の処理をしています: python27-IPy のパッケージ: policycoreutils-python-2.1.12-5.25.amzn1.x86_64
--> 依存性の処理をしています: libselinux-python(python27) のパッケージ: policycoreutils-python-2.1.12-5.25.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ audit-libs-python.x86_64 0:2.4.1-5.27.amzn1 を インストール
---> パッケージ docker-engine.x86_64 0:1.13.0-1.el7.centos を インストール
--> 依存性の処理をしています: selinux-policy >= 3.13.1-23 のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libdevmapper.so.1.02(DM_1_02_97)(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libsystemd.so.0(LIBSYSTEMD_209)(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: systemd-units のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libsystemd.so.0()(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
---> パッケージ docker-engine-selinux.noarch 0:1.13.0-1.el7.centos を インストール
--> 依存性の処理をしています: selinux-policy-base >= 3.13.1-102 のパッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch
--> 依存性の処理をしています: selinux-policy-targeted >= 3.13.1-102 のパッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch
---> パッケージ libselinux-python.x86_64 0:2.1.10-3.22.amzn1 を インストール
---> パッケージ libsemanage-python.x86_64 0:2.1.6-3.13.amzn1 を インストール
---> パッケージ python27-IPy.noarch 0:0.75-1.6.6.amzn1 を インストール
---> パッケージ selinux-policy.noarch 0:3.10.0-98.26.amzn1 を インストール
---> パッケージ setools-libs-python.x86_64 0:3.3.7-34.23.amzn1 を インストール
--> 依存性の処理をしています: setools-libs(x86-64) = 3.3.7-34.23.amzn1 のパッケージ: setools-libs-python-3.3.7-34.23.amzn1.x86_64
--> 依存性の処理をしています: libqpol.so.1(VERS_1.4)(64bit) のパッケージ: setools-libs-python-3.3.7-34.23.amzn1.x86_64
--> 依存性の処理をしています: libqpol.so.1(VERS_1.5)(64bit) のパッケージ: setools-libs-python-3.3.7-34.23.amzn1.x86_64
--> 依存性の処理をしています: libqpol.so.1(VERS_1.2)(64bit) のパッケージ: setools-libs-python-3.3.7-34.23.amzn1.x86_64
--> 依存性の処理をしています: libqpol.so.1()(64bit) のパッケージ: setools-libs-python-3.3.7-34.23.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ docker-engine.x86_64 0:1.13.0-1.el7.centos を インストール
--> 依存性の処理をしています: selinux-policy >= 3.13.1-23 のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libdevmapper.so.1.02(DM_1_02_97)(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libsystemd.so.0(LIBSYSTEMD_209)(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: systemd-units のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
--> 依存性の処理をしています: libsystemd.so.0()(64bit) のパッケージ: docker-engine-1.13.0-1.el7.centos.x86_64
---> パッケージ docker-engine-selinux.noarch 0:1.13.0-1.el7.centos を インストール
--> 依存性の処理をしています: selinux-policy-base >= 3.13.1-102 のパッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch
--> 依存性の処理をしています: selinux-policy-targeted >= 3.13.1-102 のパッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch
---> パッケージ setools-libs.x86_64 0:3.3.7-34.23.amzn1 を インストール
--> 衝突を処理しています: docker-engine-1.13.0-1.el7.centos.x86_64 は docker-io と衝突しています
--> 衝突を処理しています: docker-engine-1.13.0-1.el7.centos.x86_64 は docker と衝突しています
--> 依存性解決を終了しました。
エラー: パッケージ: docker-engine-1.13.0-1.el7.centos.x86_64 (docker-main)
             要求: libsystemd.so.0()(64bit)
エラー: パッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch (docker-main)
             要求: selinux-policy-base >= 3.13.1-102
            利用可能: selinux-policy-minimum-3.10.0-98.26.amzn1.noarch (amzn-main)
                selinux-policy-base = 3.10.0-98.26.amzn1
            利用可能: selinux-policy-mls-3.10.0-98.26.amzn1.noarch (amzn-main)
                selinux-policy-base = 3.10.0-98.26.amzn1
            利用可能: selinux-policy-targeted-3.10.0-98.26.amzn1.noarch (amzn-main)
                selinux-policy-base = 3.10.0-98.26.amzn1
エラー: パッケージ: docker-engine-1.13.0-1.el7.centos.x86_64 (docker-main)
             要求: systemd-units
エラー: パッケージ: docker-engine-1.13.0-1.el7.centos.x86_64 (docker-main)
             要求: libsystemd.so.0(LIBSYSTEMD_209)(64bit)
エラー: パッケージ: docker-engine-selinux-1.13.0-1.el7.centos.noarch (docker-main)
             要求: selinux-policy-targeted >= 3.13.1-102
            利用可能: selinux-policy-targeted-3.10.0-98.26.amzn1.noarch (amzn-main)
                selinux-policy-targeted = 3.10.0-98.26.amzn1
エラー: docker-engine conflicts with docker-1.12.6-1.17.amzn1.x86_64
エラー: パッケージ: docker-engine-1.13.0-1.el7.centos.x86_64 (docker-main)
             要求: libdevmapper.so.1.02(DM_1_02_97)(64bit)
エラー: パッケージ: docker-engine-1.13.0-1.el7.centos.x86_64 (docker-main)
             要求: selinux-policy >= 3.13.1-23
            利用可能: selinux-policy-3.10.0-98.26.amzn1.noarch (amzn-main)
                selinux-policy = 3.10.0-98.26.amzn1
エラー: パッケージ: docker-engine-1.13.0-1.el7.centos.x86_64 (docker-main)
             要求: selinux-policy >= 3.13.1-23
            インストール中: selinux-policy-3.10.0-98.26.amzn1.noarch (amzn-main)
                selinux-policy = 3.10.0-98.26.amzn1
 問題を回避するために --skip-broken を用いることができます。
 これらを試行できます: rpm -Va --nofiles --nodigest

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

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

$ sudo yum install docker
読み込んだプラグイン:priorities, update-motd, upgrade-helper
Repository docker-main is listed more than once in the configuration
Repository docker-testing is listed more than once in the configuration
Repository docker-beta is listed more than once in the configuration
Repository docker-nightly is listed more than once in the configuration
amzn-main/2016.09                                                                                                                                                                           | 2.1 kB     00:00
amzn-updates/2016.09                                                                                                                                                                        | 2.3 kB     00:00
318 packages excluded due to repository priority protections
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ docker.x86_64 0:1.12.6-1.17.amzn1 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

=================================================================================================================================================================================================================== Package                                       アーキテクチャー                              バージョン                                                  リポジトリー                                         容量
===================================================================================================================================================================================================================インストール中:
 docker                                        x86_64                                        1.12.6-1.17.amzn1                                           amzn-updates                                         24 M

トランザクションの要約
===================================================================================================================================================================================================================インストール  1 パッケージ

総ダウンロード容量: 24 M
インストール容量: 81 M
Is this ok [y/d/N]: y

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 をインストール

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

$ sudo yum install docker-compose
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main/2016.09                                                                                                                                                                           | 2.1 kB     00:00
amzn-updates/2016.09                                                                                                                                                                        | 2.3 kB     00:00
318 packages excluded due to repository priority protections
パッケージ docker-compose は利用できません。
エラー: 何もしません

ないらしいです。

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

# curl -L https://github.com/docker/compose/releases/download/1.10.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

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

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

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

$ sudo gpasswd -a jenkins docker

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

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

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

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

Cannot connect to the Docker daemon. Is the docker daemon running on this host?

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

$ sudo -u jenkins docker build -t web ./Dockerfile .

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

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

2375 ポートとは、調べてみると Docker を外部から操作するためのポートらしいです。 しかし、Jenkins って思いっきりローカルホストなので、なぜこれが必要なのか分かりません。 しかし、他に方法も思いつかないので従ってみます。 Amazon Linux だと設定ファイルは下記の場所にあるので編集します。

アバター画像

江藤 光

まだまだ気持ちは新人です。

目次