jadehan

Docker 내부에서 Docker를 사용하여 이중 볼륨 연결 시 발생하는 문제점 해결 본문

IT/Back-end

Docker 내부에서 Docker를 사용하여 이중 볼륨 연결 시 발생하는 문제점 해결

PaPhoPu 2017. 12. 1. 00:55

Docker 내부에서 Docker를 사용하여 이중 볼륨 연결 시 발생하는 문제점 해결


Docker를 이용하여 jenkins를 이용할 때, CI 빌드를 할 프로젝트 역시 docker로 만들어 테스트 하는 경우가 있습니다. 이런 경우 Jenkins 컨테이너 내부에 프로젝트 컨테이너를 만드는 상황이 생깁니다.


그리고 대부분의 사용자들은 컨테이너가 종료될 때, 내부의 데이터가 초기화되는 것을 원하지 않으므로 볼륨을 이용하여 로컬과 컨테이너를 연결하곤 합니다.


Docker in Docker

일반적으로 이런 상황을 docker in docker라고 부릅니다. 특정 컨테이너 내부에 또 다른 컨테이너를 다시 빌드하는 것으로써, jenkins 같은 CI툴을 docker에서 사용할 때 많이 쓰이는 것을 볼 수 있습니다.


이렇게 되면 jenkins container 내부에 프로젝트 전용 Dockerfile이 존재하게 되고, 컨테이너 생성에 사용하는 docker-compose 파일 역시 존재하게 되는데 이 부분에서 약간의 문제가 생길 수 있습니다.


볼륨을 연결할 때, 로컬과 jenkins를 잇는 볼륨과 jenkins와 프로젝트 컨테이너를 잇는 볼륨이 서로가 서로를 공유 하는 것처럼 보이는 현상이 발생합니다.


(마치 jenkins 컨테이너가 빌드 컨테이너의 로컬 저장소 역할을 해주는 것처럼 보인다)



대부분 처음 Docker를 사용하면 볼륨 구조를 이런식으로 생각하게 되고 빌드 컨테이너용 docker-compose파일을 작성할 때, jenkins 컨테이너 내부에 볼륨 저장소를 만들어 빌드하려고 합니다.


# local -v -> jenkins -v
docker run -v $PWD:var/jenkins_home/build
# jenkins -v -> build project -v
docker run -v $PWD:var/build

하지만 예상과 달리 빌드 컨테이너는 jenkins 컨테이너를 볼륨 저장소로 취급히지 않고 local 을 볼륨 저장소로 바라봅니다.
다시 말해서 Docker 컨테이너 내부에 속해있는 컨테이너라 할지라도 불륨 저장소는 무조건 HOST를 바라본다는 뜻입니다. 그렇기 때문에 볼륨의 경로를 저렇게 설정할 경우에 빌드 컨테이너는 어떠한 데이터도 가져가지 못 합니다.


도커가 local에 있는 var/jenkins_home/build 폴더에서 데이터를 긁어가려 하기 때문에 존재하지도 않는 디렉토리를 찾아가려 하기 때문입니다.


이러한 문제를 해결하기 위해서는 local에 jenkins 컨테이너 볼륨과 같은 위치의 디렉토리와 심볼릭 링크를 걸어주는 것이 가장 좋습니다.


# In local
ln -s local_user/jenkins_home/build var/jenkins_home/build 




이렇게 되면 local에 jenkins와 build 각각의 컨테이너에 개별 볼륨이 생기는 격이 되므로 빌드 컨테이너가 올바르게 데이터를 긁어가는 것을 보실 수 있습니다.




0 Comments
댓글쓰기 폼