Dockerコンテナ内で動くJenkinsから、ホスト側のDockerを使って他のDockerコンテナを動かす、いわゆる**Docker outside of Docker(DooD)**に必要な設定のメモです。
前提
- JenkinsもDockerコンテナで動く
- Jenkinsコンテナのユーザーはjenkins(root以外)とする
- 各Dockerコンテナは同一ホスト内で動く
- 複数のDockerコンテナが動くためdocker-composeを利用する
環境
- ホストOS:Oracle Linux 7.7(Red Hat 7.7)
- docker 18.09.1
- docker-compose 1.24.1
- Jenkins(Dockerイメージ)2.60.3
ホスト側のSELinuxはオフにしています。
ファイル構成
docker-composeを使うのでこのような構成になります。
docker
├─ .env
├─ docker-compose.yml
├─ jenkins
| ├─ Dockerfile
……
ファイル定義
JenkinsのDockerfile
JenkinsのDockerfileです。
FROM jenkins/jenkins:lts
USER root
# add jenkins user
RUN mkdir /home/jenkins && chown jenkins:jenkins /home/jenkins && usermod -d /home/jenkins jenkins
# add docker group
ARG DOCKER_GROUP_ID
RUN groupadd -g ${DOCKER_GROUP_ID} docker && usermod -aG ${DOCKER_GROUP_ID} jenkins
# install docker, docker-compose
ENV DOCKER_VERSION 18.09.1
RUN curl -fL -o docker.tgz "https://download.docker.com/linux/static/test/x86_64/docker-$DOCKER_VERSION.tgz" && \
tar --strip-component=1 -xvaf docker.tgz -C /usr/bin
RUN curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
USER jenkins
ポイントとしてはコンテナユーザーをjenkinsとしており、コンテナ内でsudoせずに済むようにホスト側のdockerグループID(DOCKER_GROUP_ID
)を追加しています。DOCKER_GROUP_ID
は後述する.env
→docker-compose.yml
という流れでJenkinsのDockerfileに渡されます。
docker-compose
docker-compose.yml
(Jenkins部分抜粋)です。
version: '2'
services:
jenkins:
build:
context: ./jenkins
args:
- DOCKER_GROUP_ID=${DOCKER_GROUP_ID}
ports:
- 8080:8080
volumes:
- /var/jenkins:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
build
の引数としてDOCKER_GROUP_ID
を渡します。これはホスト側のdockerグループIDで、後述の.env
ファイル内に定義します。
volumes
で/var/run/docker.socket:/var/run/docker.sock
を指定することにより、ホスト側のdockerソケットをJenkinsコンテナ内にマウントします。これでJenkinsコンテナ内のdockerコマンドで同じホストで動く他のコンテナを操作できます。
.env
docker-compose.yml
と同じ階層に.env
を置くことで外部パラメーターとして値を渡すことができます。
DOCKER_GROUP_ID=992
DOCKER_GROUP_ID
にホスト側のdockerグループIDを指定します。
確認
JenkinsのDockerコンテナに入ってdocker
コマンドが実行できれば完了です。
[docker@host]$ sudo docker exec -it docker_jenkins_1 /bin/bash
jenkins@6a642404e172:/$ docker version
Client: Docker Engine - Community
Version: 18.09.1
API version: 1.39
Go version: go1.10.6
Git commit: 4c52b90
Built: Wed Jan 9 19:33:22 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.1-ol
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: e32a1bd
Built: Thu Jun 6 14:47:41 2019
OS/Arch: linux/amd64
Experimental: false
今回はdocker-compose.ymlで構成しましたが単独コンテナで動かす場合でも、構成は大きく変わらないはずです。
参考
docker上のjenkinsでdockerを実行
dockerでvolumeをマウントしたときのファイルのowner問題
Dockerfile ARG入門
jenkinsのdockerイメージからホストのdockerが使えるようにするDockerfile(docker in docker)
DockerのVolumeのアクセス権限の問題について