상황에 따라 도커 컨테이너 내부에서 도커를 실행해야 할 때가 있다.
예를 들면 젠킨스 컨테이너 내부에서 도커 이미지를 빌드하고 싶은 때 도커를 실행해야 한다.
도커 컨테이너 내부에서 도커를 실행하기 위한 방법으로는 2가지가 있다.
- 도커 컨테이너 내부에 도커엔진을 설치하기 (Docker in Docker)
- 도커 컨테이너 내부에서 호스트의 도커 데몬을 사용하기 (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
을 입력한다.
이러면 호스트 도커 데몬에서 실행 중인 컨테이너 목록이 출력되는데 이 목록에 나 자신이 있는 것을 확인할 수 있다.
'Docker' 카테고리의 다른 글
[Docker] 🦮월월월월의 컨테이너와 네트워크 (0) | 2024.08.25 |
---|---|
Docker Compose 한 줄로 빌드부터 컨테이너 구동까지 해결하기 (0) | 2024.08.25 |
[Docker] 🦮월월월월의 도커 볼륨이란 (0) | 2024.07.28 |
[Docker] 🦮월월월월의 도커 이미지란 (1) | 2024.07.21 |
[Docker] 🐳도커 1편 (0) | 2024.07.14 |