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