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