Docker

[Docker] 🦮월월월월의 Docker in Docker

월월월월2 2024. 9. 22. 16:47

상황에 따라 도커 컨테이너 내부에서 도커를 실행해야 할 때가 있다.

예를 들면 젠킨스 컨테이너 내부에서 도커 이미지를 빌드하고 싶은 때 도커를 실행해야 한다.

도커 컨테이너 내부에서 도커를 실행하기 위한 방법으로는 2가지가 있다.

  1. 도커 컨테이너 내부에 도커엔진을 설치하기 (Docker in Docker)
  2. 도커 컨테이너 내부에서 호스트의 도커 데몬을 사용하기 (Docker out of Docker)

1번 방법은 두 계층의 데몬이 서로 간섭하게 될 수 있고, 중복 자원할당 및 오버헤드가 발생하여 성능이 저하될 수 있어 추천되지 않는 방식이라고 한다.

따라서 2번 방식을 구현하는 법을 설명하겠다.

Docker out of Docker

우리가 처음 도커를 설치할 때

 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

의 명령어를 입력해서 도커를 설치한다.

docker-ce는 도커 엔진이고 실행시 데몬 형태로 실행된다.

docker-ce-cli, 즉 클라이언트는 우리가 도커 엔진의 기능을 사용하기 위해 CLI를 제공한다.

도커 클라이언트는 docker.sock파일을 통해 도커 엔진으로 명령어를 전달한다.

따라서 컨테이너 내부에 외부와 동일한 docker.sock파일이 있으면 호스트의 도커 데몬에 명령어를 전달할 수 있다.

Bind mount로 docker.sock 마운트 하기

이를 위해 컨테이너 실행 시 bind mount를 사용하여 외부의 docker.sock파일 경로를 컨테이너 내부에 복사한다.

이때 docker.sock/var/run/docker.sock경로에 있다.

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

다만 이렇게만 하면 컨테이너 내부에는 docker-ce-cli, 즉 클라이언트가 설치가 안되어있기 때문에 docker 명령어를 입력해도 해당 명령어가 없다고 뜬다.

docker cli 설치

도커 명령어를 실행하기 위해 도커 클라이언트를 설치해 주자.

먼저 cat /etc/os-release명령어를 입력해서 컨테이너의 리눅스 버전을 검색한다.

내 컨테이너는 Debian을 사용하고 있으니 도커 공식문서의 데비안에 들어간다.

docker-ce-cli를 설치하기 위해 우선 apt저장소를 설정해 준다.

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

위 명령어를 복사하면 sudo명령어가 없다는 오류가 뜬다.

sudo 명령어를 설치하자.

apt-get update
apt-get install sudo

다시 위의 명령어를 실행하면 정상적으로 실행된다.

저장소를 설정했으면 docker-ce-cli를 설치한다.

sudo apt-get docker-ce-cli

이제 docker 명령어를 실행하면 정상적으로 도커 명령어 목록이 출력된다.

도커 데몬 확인

내가 호스트의 도커 데몬을 사용하는지 확인을 하려면 docker ps을 입력한다.
이러면 호스트 도커 데몬에서 실행 중인 컨테이너 목록이 출력되는데 이 목록에 나 자신이 있는 것을 확인할 수 있다.