毎度ながらblogの記事に何を書くか迷うのですが、今日はCIで使用するjenkinsとdockerについて書いてみようと思います。
jenkinsはjavaで作られたWebアプリなのでdockerとは直接関係ないのですが、インストールの手間を省くためdockerでインストールする手順が紹介されているサイトも多いようです。
Contents
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
東京都心在住のフルリモート勤務エンジニア。サーバサイドの開発担当で得意な言語はC#。