Docker Out of Docker (DooD)

By | 2021년 9월 16일
Table of Contents

Docker Out of Docker (DooD)

참조

참조

젠킨스 도커 이미지에서 Dockerize 를 실행시키려 보니 docker 가 없다고 합니다.

docker: not found

그래서 젠킨스 도커 이미지 내에,
docker 를 설치 및 실행(Docker in Docker)할까 했지만,
권장되는 방식이 아니랍니다.

Docker Out of Docker

젠킨스 도커 이미지 내에 docker 를 설치하지만,
호스트 서버에 이미 설치되어 있는,
docker 를 이용해 docker 를 실행하는 방법입니다.

jenkins-docker 이미지 생성

mkdir jenkins-docker
cd jenkins-docker
vi install_docker.sh
------------------------------------
#!/bin/sh

apt-get update

apt-get -y install apt-transport-https \
     apt-utils \
     ca-certificates \
     curl \
     gnupg2 \
     zip \
     unzip \
     software-properties-common

curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey

add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable" && \

apt-get update

apt-get -y install docker-ce
------------------------------------
vi Dockerfile
------------------------------------
FROM jenkins/jenkins:lts

USER root

COPY install_docker.sh /install_docker.sh
RUN chmod +x /install_docker.sh
RUN /install_docker.sh

RUN usermod -aG docker jenkins
USER jenkins
------------------------------------

docker hub 에 이미지를 업로드 합니다.
계정이 없다면 먼저 계정을 생성해 줍니다.

docker build -t skyer9/jenkins-docker:0.0.1 .
docker login
docker push skyer9/jenkins-docker:0.0.1

호스트 서버에서 작업

우선 젠킨스 도커 이미지 실행시 아래의 명령으로,
호스트 서버의 docker.sock 를 공유합니다.

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

docker.sock 파일을 확인해 봅니다.

ls -al /var/run/docker.sock
srw-rw---- 1 root docker 0  9월 14 21:35 /var/run/docker.sock

좋은 방법은 아니지만… 일단은 아래처럼 하니 작동합니다.

sudo chmod 666 /var/run/docker.sock

chmod 의 문제점

보안 이슈

서버에 로그인 가능한 모든 계정이,
docker image 를 실행/삭제/정지 시킬 수 있습니다.

재부팅

서버 reboot 마다 chmod 를 다시 실행해야 합니다.

setfacl

참조

chmod 는 없어 보이므로 원상복구 합니다.

sudo chmod 660 /var/run/docker.sock

acl 을 이용해 추가권한을 파일에 부과할 수 있습니다.

vi install_docker.sh
------------------------------------
#!/bin/sh

apt-get update

apt-get -y install apt-transport-https \
     apt-utils \
     ca-certificates \
     curl \
     gnupg2 \
     zip \
     unzip \
     acl \
     software-properties-common

curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey

add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable" && \

apt-get update

apt-get -y install docker-ce
------------------------------------

setfacl 을 이용해 젠킨스 이미지 docker 계정에
docker.sock 의 접속 권한을 부여합니다.

젠킨스 이미지 실행 전에는 docker.sock 이 존재하지 않으므로,
/var/run/ 디렉토리에 액세스 권한을 부여하고,
R 로 하위 파일들에 권한을 부여(Recursive)받게 하고,
d 로 신규로 생성되는 파일들에 권한을 부여(default)합니다.

vi Dockerfile
------------------------------------
FROM jenkins/jenkins:lts

USER root

COPY install_docker.sh /install_docker.sh
RUN chmod +x /install_docker.sh
RUN /install_docker.sh

RUN usermod -aG docker jenkins
RUN setfacl -Rm d:g:docker:rwx,g:docker:rwx /var/run/

USER jenkins
------------------------------------
docker build -t skyer9/jenkins-docker:0.0.2 .
docker build -t skyer9/jenkins-docker:latest .
docker login
docker push skyer9/jenkins-docker:0.0.2
docker push skyer9/jenkins-docker:latest

getfacl 로 젠킨스 이미지 내의 docker 그룹에,
docker.sock 액세스 권한이 부여된 것을 확인할 수 있습니다.

u 0 은 uid 0 번 계정으로 로그인하는 것을 의미하고,
uid 0 번 계정은 root 를 의미합니다.

docker exec -itu 0 <컨테이너 ID> /bin/bash

getfacl /var/run/docker.sock
getfacl: Removing leading '/' from absolute path names
# file: var/run/docker.sock
# owner: root
# group: 130
user::rw-
group::rw-
group:docker:rwx
mask::rwx
other::---

권한 부여가 실패하면 아래 명령을 별도로 실행시켜 줍니다.

docker exec -itu 0 <컨테이너 ID> sh -c 'setfacl -Rm d:g:docker:rwx,g:docker:rwx /var/run/'

nomad 바이너리 추가

이 부분은 nomad 쓰시는 분만 따라하시길 바랍니다.

vi install_docker.sh
------------------------------------
#!/bin/sh

apt-get update

apt-get -y install apt-transport-https \
     apt-utils \
     ca-certificates \
     curl \
     gnupg2 \
     zip \
     unzip \
     acl \
     wget \
     software-properties-common

curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey

add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
   $(lsb_release -cs) \
   stable" && \

apt-get update

apt-get -y install docker-ce

# nomad
wget -q https://releases.hashicorp.com/nomad/1.1.4/nomad_1.1.4_linux_amd64.zip
unzip nomad_1.1.4_linux_amd64.zip
chown root:root nomad
chmod 777 nomad
mv nomad /usr/local/bin/
------------------------------------
docker build -t skyer9/jenkins-docker:0.0.3 .
docker build -t skyer9/jenkins-docker:latest .
docker login
docker push skyer9/jenkins-docker:0.0.3
docker push skyer9/jenkins-docker:latest

latest 버전으로 변경

vi Dockerfile
------------------------------------
FROM jenkins/jenkins:latest

USER root

COPY install_docker.sh /install_docker.sh
RUN chmod +x /install_docker.sh
RUN /install_docker.sh

RUN usermod -aG docker jenkins
RUN setfacl -Rm d:g:docker:rwx,g:docker:rwx /var/run/

USER jenkins
------------------------------------
docker build -t skyer9/jenkins-docker:0.0.5 .
docker build -t skyer9/jenkins-docker:latest .
docker login
docker push skyer9/jenkins-docker:0.0.5
docker push skyer9/jenkins-docker:latest

3 thoughts on “Docker Out of Docker (DooD)

답글 남기기