Jenkinsコンテナからdockerコマンドを実行する(Docker-outside-of-Docker)

  • 投稿者:
  • 投稿カテゴリー:docker

CIサーバをコンテナで起動してdockerコマンドを利用したいとき、Docker-outside-of-Docker(DooS)という手法がある。

Docker-outside-of-Docker

Dockerコンテナ内からDockerを使うことについてを参考にやってみた。

ホストのdocker.sockをコンテナへ共有することでdockerコマンドが実行可能になる。
ただしコンテナにホストへのアクセス権限を与える危険性を理解してから利用すること。

# docker run -v /var/run/docker.sock:/var/run/docker.sock -it docker /bin/sh
/ # docker run -itd alpine /bin/sh

ホストから確認すると、2つコンテナが起動していることが確認できる。

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS     NAMES
056d0304d800   alpine    "/bin/sh"                13 seconds ago       Up 11 seconds                 optimistic_wiles
6a8086171286   docker    "docker-entrypoint.s…"   About a minute ago   Up About a minute             crazy_buck

Jenkinsコンテナでdockerコマンドを利用してみる

Dockerで動くJenkinsから他のコンテナを操作するを参考にやってみた。
※docker.sockの所有グループを.envファイルに記載している。

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"

# ls -al /var/run/docker.sock
srw-rw---- 1 root docker 0  5月  5 02:39 /var/run/docker.sock

# cat /etc/group | grep docker
docker:x:999:

# tree -a
.
├── .env
├── docker-compose.yml
└── jenkins
    └── Dockerfile

# cat .env
DOCKER_GROUP_ID=999

# cat docker-compose.yml
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

# cat 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

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

# mkdir /var/jenkins

# chmod 777 /var/jenkins

# docker-compose up -d

# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
fd1044c12721   jenkins_jenkins   "/sbin/tini -- /usr/…"   16 minutes ago   Up 11 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 50000/tcp   jenkins_jenkins_1

# docker exec -it jenkins_jenkins_1 /bin/bash
jenkins@fd1044c12721:/$ 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:          20.10.6
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       8728dd2
  Built:            Fri Apr  9 22:44:13 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0