[troubleshooting] docker in docker

jordy·2023년 10월 10일
1
post-thumbnail

배경

Jenkins 를 Docker Container 로 사용 중
Docker build 와 같은 Docker Command 사용을 해야 함

문제 직면

bash: docker: command not found

도커 명령어가 안된다..


Docker in Docker

Docker 구성 삼대장

  • docker daemon
  • docker client
  • registry

1. DinD (Docker in Docker) 권장 x

Container 내부 격리된 공간에 Docker daemon 을 설치하여 사용 하는 방법

Docker 에서는 해당 방법을 권장하지 않는다.

이유는 해당 방법을 사용하려면 Container 가 privilieged mode로 실행되어야 하기 때문

$ docker run --privileged --name jenkins-slave

privileged 옵션을 사용하면 해당 Container 는 Host 의 리눅스 커널 자원을 모두 사용 할 수 있게 되어 보안적으로 좋지 않으며 docker command 를 위해 모든 권한을 주는 것도 알맞은 조치가 아님


2. DooD (Docker out of Docker) 권장 o

그래서 권장하는 방법은 Docker 소켓을 Mount 하는 방법

해당 방법을 구현하기 위해서는 3가지의 작업이 필요

  1. 이미지에 docker-ce 설치하기
$ sudo apt update
$ sudo apt-get install -y ca-certificates \ 
    curl \
    software-properties-common \
    apt-transport-https \
    gnupg \
    lsb-release
  1. /var/run/docker.sock 마운트 하기

해당 작업은 볼륨 설정을 통해 적용 가능

docker run -d --name jenkins-slve -v /var/run/docker.sock:/var/run/docker.sock

  1. 컨테이너 내부에 docker 그룹 생성하고 호스트 서버의 docker 그룹과 gid 동일하게 세팅하기

굳이 docker group을 삭제 하는 이유?

업로드중..

docker 그룹이 이미 존재할 수 있기 때문에 삭제

groupdel docker
groupadd -g {호스트 서버 도커그룹의 GID} -f docker

리눅스의 uid와 gid
컨테이너 내부에서 권한 관리를 할 때 uid, gid 를 사용
컨테이너로 분리된 프로세스들은 하나의 OS 커널을 공유하여 사용하는데 서버 전체의 uid, gid 를 커널이 관리하고 있음

그렇지만 username 이나 group name 과 같은 식별값은 커널이 아니라 외부 툴에 의해 관리되고 있기 때문에 ( ex. /etc/passwd, LDAP 등 ) 같은 이름의 docker group 이 호스트와 컨테이너 내부에 존재하더라도 gid 값이 다르면 동일한 권한이 들어가지 않기 때문에 이를 방지 하기 위해 기존 docker 그룹을 삭제하고 gid 값을 부여하여 docker 그룹을 새로 생성함

  1. 사용할 Container 계정을 docker 그룹에 추가하기

사용할 컨테이너 내부 계정을 docker secondary 에 추가

usermod -aG docker jenkins

profile
Hello Worlds!

0개의 댓글

관련 채용 정보