[Jenkins, Docker] docker.sock: connect: permission denied

2025. 3. 18. 20:57Trouble Shootings/Infrastructure

 

1. 문제가 발생한 상황

DooD(Docker Out of the Docker) 방식으로 인프라를 구성하고 싶어, Jenkins 컨테이너를 실행할 때 도커 소켓과 도커에 대한 경로를 마운트하여 실행했습니다.

docker run -d --name jenkins \
  --network pwandora_network \
  -v /home/ubuntu/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/bin/docker:/usr/bin/docker \
  -e JENKINS_OPTS="--prefix=/jenkins" \
  -e TZ=Asia/Seoul \
  --restart unless-stopped \
  jenkins/jenkins:latest

 

이렇게 실행하면, Jenkins 컨테이너 내부에서도 /usr/bin/docker 경로에 도커 엔진이 존재하여 도커 명령어를 쓸 수 있게 됩니다. (EC2 호스트에 설치된 도커 엔진 경로와 마운트했기 때문이죠.)

 

하지만 도커 명령어를 알아들을 수 있을 뿐이지, 실행할 수 있는 권한은 없습니다. Jenkins는 Docker Daemon Socket에 대한 권한이 없기 때문입니다. 

Jenkins 컨테이너 내부에서 도커 명령어를 친 모습

 

2. 해결 방법: Docker 그룹에 Jenkins 사용자 추가

우선, EC2 호스트에 설치된 Docker 그룹을 확인해보겠습니다.

getent group docker

# 실행 결과: docker:x:[번호]:ubuntu

 

위 실행 결과에서 얻어낸 번호를 토대로, 다음 명령어를 통해 Jenkins를 EC2 도커 그룹으로 추가해보겠습니다.

# EC2 호스트에서 Jenkins 도커 컨테이너로 루트 권한으로 접속
docker exec -it --user root jenkins bash

# Jenkins 컨테이너 내부에는 도커 그룹이 없을 테니, EC2 도커 그룹 번호로 도커 그룹 추가
groupadd -g [번호] docker

# Jenkins를 해당 도커 그룹에 추가
usermod -aG docker jenkins

# 그룹에 잘 추가됐는지 확인 -> [번호](Docker) 부분이 존재하면 잘 적용된 것
id jenkins

# jenkins 도커 컨테이너 나가기
exit

 

그리고 Jenkins 컨테이너를 재실행 해주세요. (중요!!)

docker restart jenkins

 

이후, 다시 Jenkins 컨테이너에 접속해서 도커 명령어를 쳐보면, Docker socket에 대한 권한을 가지고 있어 잘 수행되는 것을 볼 수 있을 겁니다.

 

 

728x90
반응형