いきなり結論
記事が長くなってしまったので、最初にこの記事で言いたいことを書いておきます。
さいあく、ここだけ読んで貰えれば大丈夫です。
- Amazon Linux で Docker をインストールする際は amzn-updates リポジトリを用いる
- Docker 公式のリポジトリは Amazon Linux では使用不可
- 公式リポジトリを用いる際は /etc/yum.conf ファイルの releasever オプションが古いバージョンになっていないか気をつける
- Docker Compose は Amazon Linux のリポジトリになりので、Github からバイナリを持ってくる
- Jenkins から docker コマンドの実行に失敗した場合、調べるべき点は2つ
本編
はじめに
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 で調べてみました。
- Docker can’t connect to docker daemon
Docker グループにユーザを追加しろ、としか書かれていませんでした。使えません。 -
Jenkins: Can’t connect to Docker daemon
こちらには、上記内容に加えて tcp://localhost:2375 を開けておけ、と書かれていました。
2375 ポートとは、調べてみると Docker を外部から操作するためのポートらしいです。
しかし、Jenkins って思いっきりローカルホストなので、なぜこれが必要なのか分かりません。
しかし、他に方法も思いつかないので従ってみます。
Amazon Linux だと設定ファイルは下記の場所にあるので編集します。
$ sudoedit /etc/sysconfig/docker |
以下の一行を追加
OPTIONS='-H unix:///var/run/docker.sock -H tcp://localhost:2375' |
そして、Docker と Jenkins を再起動
sudo /etc/init.d/docker start sudo /etc/init.d/jenkins restart |
すると、先ほどのビルドが動きました!
なぜ、2375 ポートをリッスンする必要があるのか
調べてみたのですが、分かりませんでした(泣)
現在もこの設定で Jenkins はビルドをしてくれているのですが、理由が分からず動いているのがとても嫌です。
どなたか、ご存知の方がいらっしゃいましたら教えてください。
この記事を書いた人
- まだまだ気持ちは新人です。
最近書いた記事
- 2018.03.23Windows のコンソールを使いやすくしよう
- 2018.02.23GitHubでPullRequestが出ると、Jenkinsでテストした後でEC2に自動デプロイする設定を行った
- 2018.02.21Jenkins にパラメータを渡して、Packer で引数付きビルドを行う
- 2018.01.10それ、キーボードマクロで出来ますよ(Emacs)