このために利用できる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/