今回は、複数のコンテナを docker-compose を利用して起動してみます。
を参考に、Jenkins のMaster、Slave で複数のコンテナを構築します。
まず、Jenkins(Master)を以下の設定で作成します。
ポートフォワーディング、共有ボリュームは、左がホスト(Mac)、右がDockerの設定となります。
version: "3"
services:
master:
container_name: master
image: jenkinsci/jenkins:2.142-slim
ports:
- 8080:8080
volumes:
- ./jenkins_home:/var/jenkins_home
このように、volumes を設定することで、Dockerのデータをホスト側と共有させて、永続化することができます。
docker-compose.yml を作成したら、 --build でイメージ構築と同時に起動をします。
$ docker-compose up --build
途中で、Jenkins の管理者パスワードが表示されるため、控えておきましょう。
忘れた場合は、Docker内の「/var/jenkins_home/secrets/initialAdminPassword」に記載されています。
...
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 | パスワード
master |
master | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
...
この時点で、ホスト側のルートにも「jenkins_home」ディレクトリが作成されます。
Jenkins(Master)コンテナ内で、SSH認証キーを作成します。
dockerコンテナに対して、シェルコマンドを実行します。
$ docker container exec -it コンテナ名 シェルコマンド
今回は、ssh-keygen を利用するので、
$ 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:
...
SHA256:SSHキー
すると、jenkins_home/.ssh/ に id_rsa、id_rsa.pub が作成されます。
Jenkins(Slave)を設定するため、一旦、コンテナを停止します。
$ docker-compose down
Jenkins(Slave)を設定を行います。
version: "3"
services:
master:
container_name: master
image: jenkinsci/jenkins:2.142-slim
ports:
- 8080:8080
volumes:
- ./jenkins_home:/var/jenkins_home
links:
- slave01
slave01:
container_name: slave01
image: jenkinsci/ssh-slave
enviloment:
- JENKINS_SLAVE_SSH_PUBKEY=id_rsa.pub のキー
enviloment は環境変数の設定で、「JENKINS_SLAVE_SSH_PUBKEY」に「jenkins_home/.ssh/id_rsa.pub」のキーを設定します。
また、Jenkins(Master)で、links を設定して master から slave01 を名前解決できるようにします。
コンテナをバックグランドで起動します。
$ docker-compose up -d
設定したポートで、http://localhost:8080/ にアクセスすると、Jenkins の画面が表示されます。
パスワードは、Jenkins(Master)の起動で表示されたものを利用します。
手っ取り早く、Install suggested plugins を選択してインストールします。
Jenkins のユーザを作成してログインします。
本の通りにノードの管理で、slave01 の認証情報(id_rsa、パスフレーズ)などを設定していきますが、slave01 の起動がエラーになってしまいました。
(Jenkins の Jenkinsの管理 > ノードの管理 で slave01 の設定の箇所)
...
java.io.IOException: Java not found on hudson.slaves.SlaveComputer
...
調べたところ、slave01 で java のパスを通す必要があるようです。
$ docker exec -it slave01 bash
# which java
/usr/local/openjdk-8/bin/java
このパスを、slave01 の「高度な設定 > Javaのパス」に設定します。
これで、ノード再起動すると同期が完了します。
ちなみに、Docker For Mac で利用してみましたが、結構CPU負荷が高いです。
$ docker-compose stats