ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컨테이너에서 Docker 명령어 사용하기
    인프라/도커 2024. 1. 13. 03:36

     

     

    도커 컨테이너에서 젠킨스를 실행하고, build를 진행하는 과정에서 발생한 이슈를 해결해봅니다.

    도커 컨테이너에서 docker 명령어를 실행하려면 어떻게 해야할까요

     

     


     

     

     

    도커를 사용해서 띄운 컨테이너지만, 격리된 공간이기 때문에 컨테이너 내부에는 별도로 도커를 설치하지 않는 이상 도커의 존재를 모르는 상태입니다.

     

     

    그렇다면 그냥 도커를 설치하면 되는 것 일까요?

    gpt에게 물어보니 몇 가지 방법이 있다고 합니다.

     

    • Docker-in-Docker
    • Docker 외부실행
    • Docker 소켓마운트

     

    저는 소켓마운트 방법을 사용해서 문제를  해결해보도록 하겠습니다. 제가 사용하고 있는 젠킨스에 호스트의 Docker 소켓을 연결하고 컨테이너 속에서 도커 클라이언트를 설치해서 사용하겠습니다.

     

     

     

    1. Docker 소켓 마운트

     

    도커 컨테이너를 생성할 때 소켓을 마운트해서 생성해줍니다.

    먼저 docker.sock 파일이 위치에 잘 있는지 살펴보겠습니다.

    $ cd /var/run
    $ cd ls

     

     

     

    docker.sock은 무슨 파일일까요?
    docker.sock은 도커 엔진이 실행되고 있는 데몬 프로세스에게 명령을 전달하기 위해 노출한 api 라고 이해하였습니다.
    docker.sock을 사용해서 Docker CLI 같은 클라이언트가 명령을 내릴 수 있게 되는 것 입니다.

     

     

    그러면 이제 docker.sock 을 마운트해서 컨테이너를 실행시켜보겠습니다.

    $ docker run -d -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts

     

    -v 옵션을 사용해서 필요한 데이터를 볼륨 이라는 공간에 저장하고 사용할 수 있습니다.

    저는 볼륨을 도커 컨테이너에서 접근할 수 있는 지속성을 갖는 공간이라고 이해하고 있습니다.

    첫번째 -v는 :의 왼쪽 패쓰에 있는 정보를 볼륨에 매핑을 하고, 두번째 -v는 볼륨 내에 jenkins_home이라는 공간을 생성합니다.

     

    볼륨을 사용하는 이유는 지속성 때문입니다. 컨테이너는 기본적으로 상태를 가지고 있지 않기 때문에 종료시에 사용된 데이터를 저장하지 않습니다. 따라서 저장이 필요한 데이터는 볼륨을 사용해서 호스트 공간 저장하면 컨테이너와 공유가 가능합니다.

     

     

    2. 권한 부여 ( 보안상 권장되는 방법은 아닙니다.)

    빌드를 위에 명령어를 입력하니 아래와 같은 에러가 발생합니다.

    $ docker buildx build --platform linux/amd64 --push -t <도커유저ID>/<Repo 이름> .

     

     

    권한이 없어서 실행하지 못하는 상황입니다.

    우선 루트 사용자로 컨테이너에 접근해서 jenkins 유저에게 권한을 부여해보겠습니다.

    # root 유저로 접속
    $ docker exec -u root -it jenkins bash  
    
    # docker.sock 파일 소유자와 그룹 id (990)
    $ ls -l /var/run/docker.sock  // srw-rw----. 1 root 990 0 Jan  8 07:01 /var/run/docker.sock
    
    # jenkins 사용자가 속한 그룹 
    # 도커에 속해 있는지 확인
    $ groups jenkins  // jenkins sudo docker
    
    # 속해 있지 않다면
    $ usermod -aG docker jenkins
    
    # 그룹 GID 일치시키기
    $ groupmod -g 990 docker

     

    jenkins 유저로 다시 컨테이너에 접속해서 docker 명령어가 sudo 없이 실행가능한지 확인해봅니다.

    $ docker exec -it jenkins bash
    $ docker ps

     

     

    3. 이미지 생성

    도커 파일이 있는 경로에가서 build를 실행하면 잘 작동하는 것을 확인할 수 있습니다.

    $ docker build -t test .

     

     

     

     

     

Designed by Tistory.