docker container에서 docker image 빌드 진행 과정 (jenkins) - host docker.sock을 연결 - 1

LeeKyoungChang·2023년 1월 21일
4
post-thumbnail
post-custom-banner

📚 1. jenkins에서 docker가 실행되지 않는다.

현재 jenkins에서 docker build -t 를 실행할 시 docker를 찾을 수 없다고 한다.
(여러 사람들에게 물어본 결과...) host docker.sock과 연결되어 있지 않은 상태다.
client가 요청한 후, /usr/bin/docker가 /var/run/docker.sock 유닉스 소켓을 사용해 docker daemon에게 명령어를 전달 하지 않은 상태다. (내 생각으로는 docker에서 jenkins image를 생성한 후, container 호스트 운영체제의 커널을 공유하면서 격리된 컴퓨팅 자원을 제공하는 가상화 기술에 docker가 적용되지 않은 상황이다. 적용되지 않은 곳을 호출하고 있다.)

Screenshot 2023-01-21 at 10 15 27 PM

 

 

📚 2. 해결 방안 docker.sock 연결

📖 A. 시작하기전 Docker Socket이란?

Docker socket 파일 위치 : /var/run/docker.sock 안에 있다.

스크린샷 2023-01-21 오후 4 42 38

 

docker 기본 개념에서 확인 가능 을 보면 docker socket이 무엇인지 알 수 있다.

 

 

📖 B. docker.sock 연결한 후, 해결

✔️ 현재 해결 방안
jenkins를 docker 이미지로 구동하면 jenkins 컨테이너에서 host의 docker를 사용하여 빌드를 해야한다.
host의 docker 소켓을 컨테이너와 공유한다. 이렇게 할시, 컨테이너가 host의 docker 데몬을 사용하여 이미지 빌드, 컨테이너 실행을 할 수 있다.

=>  jenkins 컨테이너에 접속하여 필요한 docker-ce 를 설치하거나 이 과정을 정의한 Dockerfile을 직접 만드는 방법들 있다. (Dockerfile : docker-ce를 설치하거나 과정을 정의한 것)

 

✔️ Jenkins 컨테이너에 직접 docker-ce 설치

🔍 시작하기 전
jenkins 이미지를 통해 컨테이너를 실행한다. (docker run -p)

이제 jenkins가 구동이되면 해당 jenkins 컨테이너의 shell에 접속한다.

docker exec -it -u root ubuntu_jenkins_1 bash

 

💡 참고
docker container 에(shell) 접속할 때, docker exec 명령어를 사용한다. (container 내부 접속)

 

jenkins shell에 접속한 상태, apt 명령어 실행을 위해 root에 접속했다.

스크린샷 2023-01-21 오후 10 47 17

공식 docker apt repository 구성 및 docker ce 바이너리 설치하는 명령어를 입력해주면 된다.

apt-get update && \
apt-get -y install apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     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

 

추가적으로 docker jenkins에서 host docker 접근권한을 부여해줘야 한다.

groupadd -f docker

usermod -aG docker jenkins

chown root:docker /var/run/docker.sock

그런데 만약, chown root:docker /var/run/docker.sock 을 실행했을 때, 해당 파일 및 디렉터리를 찾을 수 없다는 결과가 나왔을 때는 서비스를 실행하지 않아서 생기는 문제이다.
docker를 실행시킨 후, 해당 명령어를 입력하면 된다.

스크린샷 2023-01-21 오후 10 52 22 스크린샷 2023-01-21 오후 10 52 27 스크린샷 2023-01-21 오후 10 52 31

 

💡 참고
docker ubuntu에서 sudo 명령어를 찾지 못했을 때 apt-get update && \ apt-get -y install sudo를 통해 설치해주면 된다.

 

📖 C. docker.sock 연결한 후 발생한 문제점 - 1

jenkins에서 docker-ce를 설치 후,

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

의 오류를 만나게 되었다.

  • unix:///var/run/docker.sock에 있는 docker daemon에 연결할 수 없으므로 docker daemon이 돌고있는지 물어보고 있다.

참고 자료 에 의하면, 위 해석한 내용에 따르면 docker daemondocker.sock에서 돌고 있다는 뜻이다.

✔️ dockerd

  • 참고한 자료에 따르면 dockerd는 컨테이너들을 관리하는 백그라운드 프로세스라는 뜻이다.
  • 한마디로, dockerd는 docker daemon이라는 뜻이다.
  • dockerd를 실행하기 위해서는 터미널에서 dockerd를 입력하면 된다.
  • 실행하게 되면 로그 메세지가 계속 생성되면서 dockerd가 백그라운드에서 돌아가게 된다.
  • 이제 다른 터미널에서 docker ps와 같은 커멘드를 실행하면 잘 돌아간다.

unix:///var/run/docker.sock와 dockerd의 관계는 무엇일까?

 

✔️ dockerd와 socket의 관계

  • Docker daemon은 Docker Engine API의 요청을 unix, tcp, rd라는 3개의 타입으로 소켓을 받을 수 있다.
  • unix:///var/run/docker.sock : unix 컴퓨터와 통신을 하기 위한 소켓의 위치
  • 기본적으로 unix 도메인 소켓이 연결되어 있다.

 

✔️ 해결 방안

  • Docker daemon을 돌려주기만 하면 된다.
  • dockerd 를 매번 실행하기는 번거러우니 아래 두 line을 docker 설치 이후 입력하면 된다!
systemctl start docker : docker를 daemon으로 실행하라는 명령어, `dockerd`와 같지만 로그없이 실행
systemctl enable docker : 컴퓨터가 새로 시작하거나 부팅시 자동으로 docker daemon을 실행하라는 명령어

 

 

📖 D. docker.sock 연결한 후 발생한 문제점 - 2

위를 통해 docker.sock 연결한 후, 실행했더니 또 다른 오류가 발생했다.

스크린샷 2023-01-22 오전 12 59 50
  • 도커는 기본적으로 컨테이너에 systemctl을 사용하지 못하도록 되어 있다.
  • 권한을 제한하기 위해서이다.

 

스크린샷 2023-01-22 오전 1 17 05

sudo service docker start 를 통해 docker를 실행시켰지만, 곧 바로 상태를 보니 failed라는 결과를 받게 되었다.

왜 이와 같은 결과가 나온건지 알아봐야 한다.

다음 페이지에 해결방안 있어요!

 

✔️ 질문

  • jenkins를 docker 이미지로 구동하면, jenkins 컨테이너에서 host의 docker를 사용하여 빌드 해야한다. jenkins 컨테이너에서 host의 docker를 사용하여 빌드 해야한다. => 무슨 의미인지 이해가 안된다.
  • 컨테이너란 image를 실행시킨 환경을 말하는건지?

 

 


참고

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"
post-custom-banner

0개의 댓글