LoginSignup
12
9

More than 5 years have passed since last update.

DockerでJenkinsを動かしつつ、JenkinsでDockerコンテナを動かす

Last updated at Posted at 2017-09-17

このために利用できるDockerfileを作りました。
https://github.com/toto1310/Simple-Jenkins-DooD

起動方法

Dockerイメージを取得するor作る

  • Pull
$ docker pull toto1310/simple-jenkins-dood

↑↑追記 2017/9/20
DockerHubにリポジトリ作りました。ビルドしなくてもpullでイメージとれます。

  • Build
$ git clone https://github.com/toto1310/Simple-Jenkins-DooD
$ cd Simple-Jenkins-DooD
$ docker build -t toto1310/simple-jenkins-dood .

DockerホストのdockerグループIDを確認する

  • Linux
$ grep docker /etc/group
  • Mac
$ docker run -it --rm -v /etc/group:/host-etc-group busybox grep docker host-etc-group

docker:x: *DOCKER_GID* :docker

$ DOCKER_GID= *DOCKER_GID*

  • Windows
T.B.D.

Dockerコンテナを動かし、Jenkinsを起動する

$ docker run -d --name jenkins \
 -u jenkins:${DOCKER_GID} \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v ${PWD}:/var/jenkins_home \
 -p 8080:8080 \
 -p 50000:50000 \
 toto1310/simple-jenkins-dood

しばらく待てば、アクセスできるようになります。 http://localhost:8080

仕組み

DooD(Docker outside of Docker)といわれる類のことができるよう作りました。
DooDは、Dockerコンテナの中から別のDockerコンテナを動かしたり、Dockerイメージを作ったりする方法の1つです。
冒頭のリポジトリでは、Dockerコンテナの中にはDocker用のクライアントを使えるようにしてあり、Dockerホストにアクセスして実現します。

似たようなことをDinD(Docker in Docker)でもできます。
違いは、Dockerサーバを持つのか、Dockerクライアントを持つのか、だと理解しています。
具体的には、DinDでは、DockerコンテナがDockerコンテナの中(=孫コンテナ)で動かすのに対し、DooDでは、DockerコンテナがDockerコンテナの外(=兄弟コンテナ)で動かします。

今回JenkinsからDockerを使うにあたり、DockerサーバとしてDockerイメージを保持する必要がなく、むしろDockerコンテナ内で複数プロセスが動く気持ち悪さを感じ、DooDの構造にしました。

それぞれのいいトコ/わるいトコは、こちらを参考にすればよいかと思います。
https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9