JenkinsからDockerを起動する場合の設定

毎度ながらblogの記事に何を書くか迷うのですが、今日はCIで使用するjenkinsとdockerについて書いてみようと思います。

jenkinsはjavaで作られたWebアプリなのでdockerとは直接関係ないのですが、インストールの手間を省くためdockerでインストールする手順が紹介されているサイトも多いようです。

jenkinsの起動

とりあえず起動するなら割と簡単で、ubuntuだと以下のコマンドで起動できます。

sudo mkdir /var/jenkins_home
sudo chown 1000:1000 /var/jenkins_home
sudo docker run -p 8080:8080 -v /var/jenkins_home:/var/jenkins_home jenkins/jenkins:lts

成功するとブラウザから http://localhost:8080 でアクセスできます。

いくつかオプションの指定が必要で、-pは公開するポート番号、-vは保存先のディレクトリを指定します。
公式には-vを指定してない例がありますが、これだと再起動するたびにjenkinsの設定が消えてしまいます。
また、保存先のディレクトリに書き込み権限が必要なのでjenkins内部で使用しているユーザーをオーナにしています。

jenkinsからdockerを起動

上の手順で作成した状態ではdocker内部のコンテナでjenkinsが動作しています。
さて、この環境でjenkinsからdockerを起動しようしてもうまくいきません。
なぜなら、docker内部のコンテナからさらにdockerを起動するには権限を与える必要があるためです。
また、dockerデーモンも起動しておく必要があります。

これに対する解決策はいくつかあるようで、docker内部でさらにdockerを起動するDocker in Dockerという方法やネットワーク経由でdockerデーモンにアクセスするといった方法があるようです。
ここでは単純にホストのdockerデーモンを共有する方法を試してみます。

いくつか初期化や設定が必要なので、docker-composeを使用します。
設定ファイルとしてDockerファイルとdocker-compose.ymlファイルが必要です。

まずは、Dockerファイルを作成します。

FROM jenkins/jenkins:lts

USER root

## install docker
RUN wget -O /tmp/docker.tgz https://download.docker.com/linux/static/stable/x86_64/docker-19.03.8.tgz
RUN tar -xzf /tmp/docker.tgz -C /tmp
RUN mv /tmp/docker/* /usr/bin/

## grant docker
ENV DOCKER_GROUP_GID 999
RUN groupadd -o -g $DOCKER_GROUP_GID docker
RUN usermod -g docker jenkins

USER jenkins

最初に、jenkinsのイメージにdockerをインストールします。
次に、jenkinsユーザーをdockerグループに追加してdockerデーモンにアクセスできるようにします。
ここで、dockerグループのIDは環境によって変わるため、以下のコマンドで調べてDOCKER_GROUP_GIDに設定します。

cat /etc/group | grep docker

次に、docker-compose.ymlファイルを作成します。

version: "3"
services:
  jenkins:
    build: .
    ports:
      - 8080:8080
    volumes:
      - /var/jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock

ホストのdockerデーモンが使用しているソケット(/var/run/docker.sock)をマウントしてjenkinsからアクセスできるようにします。

これでイメージをビルドしてコンテナを起動します。

docker-compose build
docker-compose up

jenkinsのプロジェクトの設定に以下の手順を追加して、dockerが起動できるか試してみます。

docker run hello-world

Hello from Docker!とコンソールに出力されていれば成功です。

このようにホスト側のdockerデーモンを使用することにより余計なオーバーヘッドがなくなりますし、ネットワークの設定などもホスト側で行うことができます。

環境

  • Ubuntu Server 18(AWS上のEC2)
  • Docker version 19
  • docker-compose version 1.25
  • Jenkins ver. 2.222

関連記事

最近の記事 おすすめ記事
  1. 新人さん向けの品質についての読書会

  1. デファクトスタンダードとなったReactのアーキテクチャはどうすべき?MMJの答え

  2. Effective DevOpsの読書会をやっています

  3. 沖縄、セブでリモートワークしてます!

カテゴリー

アーカイブ

検索


TOP
TOP