Help us understand the problem. What is going on with this article?

docker-composeを使って開発環境でjenkinsを動かせるようにする

More than 1 year has passed since last update.

この本を読みながら手を動かしたときの備忘。

Docker-Kubernetes-実践コンテナ開発入門-山田-明憲

Docker Composeとは

Docker Compose | Docker Documentation
Docker Composeとは、今まで個別に設定していた複数のDockerコンテナを、
「一つのファイル」「一つのコマンド」で一度に実行、停止などの管理ができるようにした仕組みです。
これにより、複数のコンテナで構成されるアプリケーションを開発、運用する際、
コンテナを一つ一つ立ち上げたり壊したりする必要がなくなったり、
また細かなオプションを一つのファイルで一括管理できる、といったメリットがあります。

設定はdocker-compose.ymlという名称のyaml形式のファイルに対して行い、docker-composeコマンドでこれを操作していきます。

元々はFigという名前でDockerとは独立して開発されていたのですが、現在はDocker社がこれを買収し、Docker Composeという名前に改称しています。

cf : Fig | Fast, isolated development environments using Docker

Docker Composeの環境構築

Docker for Windows/Macをインストールすることで、docker-composeコマンドを利用することができるようになります。

Docker Desktop | Docker

docker-composeの基本的なコマンド

よく使いそうなコマンドの説明を記載します。

コマンド 説明
build Dockerfileの更新やディレクトリの構造に変化があった際に再構築。
down docker-compose upで起動したコンテナを停止し、コンテナ、ボリューム、イメージ、ネットワークなどを削除する。
kill コンテナの強制終了
log コンテナのログを出力する。
pause コンテナを一時的に停止する。unpauseで再起動。
ps コンテナの一覧を表示させる。
unpause pauseで停止したコンテナを再起動させる。
up コンテナの起動

詳しくは以下。
Docs » Docker Compose » コマンドライン・リファレンス

jenkinsを動かしてみよう

以下ではDocker Composeを利用して、自分の開発環境でJenkinsを立ち上げてみます。

Jenkinsにはマスター(master)とスレーブ(slave)と呼ばれる二種類のノードが存在します。
マスターはそれ自体がジョブの実行を行うのではなく、スレーブに対してジョブの実行を命令したり、その命令を受け付けるインターフェースを提供したり、Jenkins自体の設定、履歴などを保持します。
スレーブはマスターから命令を受けて、実際にビルドなどのジョブを実行します。

1.masterとなるコンテナを動かす

docker-compose.ymlを書く

以下のようなdocker-compose.ymlファイルを作成します。

version: "3"
services:
  master:
    container_name: master
    image: jenkins:latest
    ports:
      - 18080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
  • docker-compose.ymlファイルは<key>: <option>: <value>のフォーマットに従って記載されます。
  • versionでは、Composeファイルのフォーマットのバージョンを指定します。ここでは3を指定しています。
  • services以下に起動させるコンテナの情報を記載します。今回はmasterとなるイメージのみ起動させるので、 masterと名前をつけたコンテナの情報を記載しています。
  • imageは最新のjenkinsを、portsでは、ローカルの18080番ポートから、このDockerコンテナの8080番ポートに対してポートフォーワーディングするように記載しています。(なんとなくローカルの8080番を使いたくなかった)
  • volumesではホストとコンテナで共有する設定のディレクトリを記載します。ここではホストマシンの./jenkins_homeがコンテナの/var/jenkis_homeに相当します。

services以下がmasterとなるdockerコンテナの設定となるのですが、これは以下のコマンドとほぼ同義になります。

docker run --name master -p 18080:8080 jenkins

docker-composeコマンドで実行する

先ほどのdocker-compose.ymlファイルが置かれたディレクトリ上でdocker-compose upコマンドを実行し、docker-compose.ymlに記載されたイメージの起動を行います。

するとDockerリポジトリから最新のJenkinsのイメージが取得され、起動されます。
初回の起動であれば、以下のようなログが吐き出され、Jenkinsのセットアップ時に必要となるパスワードが表示されます。(XXXで表した部分です)

$ docker-compose up
Starting master ... done
Attaching to master
master    | Running from: /usr/share/jenkins/jenkins.war
(中略)
master    | *************************************************************
master    | *************************************************************
master    | *************************************************************
master    |
master    | Jenkins initial setup is required. An admin user has been created and a password generated.
master    | Please use the following password to proceed to installation:
master    |
master    | XXXXXXXXXXXXXXXXXXXXXXXXXX
master    |
master    | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
master    |
master    | *************************************************************
master    | *************************************************************
master    | *************************************************************

指示の通り、万が一パスワードを忘れてしまっても、
/var/jenkins_home/secrets/initialAdminPassword内にこのパスワードの記載があります。

jenkinsの画面上での操作

あとはJenkinsを画面上からセットアップしていくだけです。

Webブラウザ上でhttp://localhost:18080/にアクセスしてみましょう。
以下のような画面が表示されるので、先ほどターミナル上に表示されたキーの情報を入力してください。
スクリーンショット 2018-10-31 18.26.52.png

そのあと、「プラグインのインストール(これはInstall suggested Pluginsで十分)」「ユーザーの認証情報の登録」が済めば、以下のようなJenkinsのホーム画面が起動します。

スクリーンショット 2018-10-31 18.57.07.png

2.Master JenkinsのSSH keyを作成する

ここまででMasterが起動したのですが、実際の運用ではジョブの実行に専念するslaveを用意し、masterと明確に役割を分けることが常です。
そこで今回も、slaveとなるコンテナを起動し、masterからジョブの実行を命令できるようにします。

その前準備として、MasterがSlaveに対してSSH接続できるように、MasterとなるコンテナのSSH Keyを作成します。

$ docker container exec -it master ssh-keygen -t rsa -C ""
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa):
Created directory '/var/jenkins_home/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/jenkins_home/.ssh/id_rsa.
Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub.
...

3.slaveとなるコンテナを立てる

次にslaveとなるコンテナを起動させる準備を行います。
先ほど作成したdocker-compose.ymlに対して、slaveとなるコンテナの記述を追加します。

version: "3"
services:
  master:
    container_name: master
    image: jenkins:latest
    ports:
      - 18080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
    links:
     - slave01

  slave01:
    container_name: slave01
    image: jenkinsci/ssh-slave
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa ... 

先ほどと異なる点は以下。

  • linksslave01を記載する。これによって、servicesの中に記載した他のコンテナから、masterコンテナがslave01という名前でコンテナをみつけだし、通信を行うことができるようになります。
  • slave01を新しくservices以下に記載する。これによって、slaveとなるコンテナが一つ立ち上がります。またenvironmentによって、環境変数としてMasterコンテナに先ほど作成したSSH鍵を記載してやります。これによって、MasterからSlaveに対してSSH通信が許可された状態になります。

なおこの JENKINS_SLAVE_SSH_PUBKEYの内容は、ホストの以下に記載された内容をそのままコピペしてください。
./jenkins_home/.ssh/id_rsa.pub

編集が終わったら、再びdocker-compose upで実行しましょう。

$ docker-compose up -d
Pulling slave01 (jenkinsci/ssh-slave:)...
latest: Pulling from jenkinsci/ssh-slave
c73ab1c6897b: Pull complete
1ab373b3deae: Pull complete
b542772b4177: Pull complete
57c8de432dbe: Pull complete
da44f64ae999: Pull complete
0bbc7b377a91: Pull complete
1b6c70b3786f: Pull complete
d9bbcf733166: Pull complete
b1d3e8de8ec6: Pull complete
51e661bdb72d: Pull complete
319ec62ab9b5: Pull complete
c29654bfa99a: Pull complete
2a28407f227b: Pull complete
Digest: sha256:b1abbfcca08b752b0f87f529a0ff55511b0fce8abe1933558d5e264566770bc4
Status: Downloaded newer image for jenkinsci/ssh-slave:latest
Creating slave01 ... done
Recreating master ... done
$ docker-compose ps
 Name                Command               State                 Ports
-------------------------------------------------------------------------------------
master    /bin/tini -- /usr/local/bi ...   Up      50000/tcp, 0.0.0.0:18080->8080/tcp
slave01   setup-sshd                       Up      22/tcp

slave01という名称のスレーブが起動しているのがわかるかと思います。

4.jenkins上でMasterにslaveを認識させる

ここまできたら、あとはMasterに対してslaveを認識させればOKです。
Jenkinsの画面上から、[Jenkinsの管理]->[ノードの管理]を選択してノードの管理画面を開きます。スクリーンショット 2018-10-31 20.17.21.png

ここから[新規ノード作成]を選択し、ノード名にslave01を入力し追加してあげます。
[リモートFSルート]には任意のディレクトリ(/home/jenkins)を選択し、[起動方法]には[SSH経由でUnixマシンのスレーブエージェントを起動]を選択します。
以下下記のように設定してやります。

  • ホスト ... slave01
  • 認証情報 ... [追加]のプルダウンからJenkinsを選択して作成
  • Host Key Verification Strategy ... Non verifying Verification Strategy

認証情報の追加では、新たな画面が開くので、以下のように設定します。
- 種類 ... SSHユーザー名と秘密鍵
- ユーザー名 ... jenkins
- 秘密鍵 ... Jenkinsのマスター上の~/.sshから

上記の内容で保存してやることで、slave01がMasterに認識され、ジョブを実行する準備ができました。

雑感

意外と簡単にできましたね。

現在個人で開発しているプロジェクトのEnd-to-endテストの実行ができるようになったらまた記事書きます。

参考文献

Docker-Kubernetes-実践コンテナ開発入門-山田-明憲

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away