Docker Compose 사이의 Networking
서론
최근 SSO 서버 개발을 진행하였는데, 테스트를 진행함에 있어 서로 다른 두 도커 컴포즈로 구성된 프로젝트간에 API 요청이 필요한 상황이 발생하였다. 이 과정에서 네트워크 설정에 관해 학습한 내용 및 트러블슈팅을 기록으로 남기고자 한다
본론
In Docker Compose
도커 컴포즈(Docker Compose)란 다수의 도커 컨테이너(Docker Container)들로 이루어진 애플리케이션을 보다 간편하게 관리하기 위한 도구이다. 이러한 도커 컴포즈로 구성된 프로젝트를 빌드할 경우 기본적으로 내부 컨테이너들간의 통신을 위한 default
네트워크를 생성한다. 일반적으로 프로젝트명_default
형식으로 생성된다.
아래와 같은 도커 컴포즈 파일(docker-compose.yml)이 있을 때 구성된 네트워크를 살펴보면 다음과 같다.
1 | # docker-compose.yml |
1 | # 활성화된 도커 네트워크 확인 |
1 | # 활성화된 도커 네트워크 상세 정보 |
도커 네트워크를 확인해보면 연결된 각 컨테이너별로 임의의 IP가 부여되었음을 확인할 수 있다. 해당 네트워크에 연결된 컨테이너간에는 부여된 IP 혹은 Alias(서비스 이름, 컨테이너 이름 or ID)를 통해서 접근할 수 있다.
1 | # my_project_django docker |
해당 도커의 Alias를 비롯한 상세 정보는 아래 명령어를 통해 확인할 수 있다.
1 | > docker inspect my_project-django-1 |
단 이 과정에서 주의해야할 점은 컴포즈 내 도커 컨테이너가 특정 포트를 외부에 개방하고 있을 경우, 해당 컨테이너로 진입하기 위해선 외부로 노출된 포트가 아닌 내부 포트를 지정해야 한다. 일례로 위 컴포즈 내 Nginx 컨테이너의 경우 8412:80
을 통해 알 수 있듯이 8412
포트를 개방하여 80
번 포트로 포워딩을 진행하는데, 도커 컴포즈 내부 다른 컨테이너에서 해당 Nginx 컨테이너로 진입하고자 할 경우 80
번 포트를 사용해야 한다.
1 | > tcpping 192.168.128.3 8412 |
Between Docker Compose
본 프로젝트를 개발하는 도중에 발생한 문제는 서로 다른 도커 컴포즈로 구성된 프로젝트를 로컬에서 실행하였는데, 기본적으로 default 네트워크는 외부에 공개가 되어있지 않아 컴포즈간의 통신이 불가능하였기 때문이다. 이를 해결할 수 있는 다양한 방법들이 존재하겠지만 테스트 단계이니만큼 간단한 방법으로 수정하였다.
우선 두 컴포즈가 공통으로 사용할 네트워크를 생성해준다
1 | $ docker network create my_project |
이후 각 도커 컴포즈 파일에서 해당 네트워크를 참조하도록 명시해준다. 연결할 다른 프로젝트의 도커 컴포즈 파일에도 아래와 동일한 방식으로 네트워크를 명시해주었다.
1 | # docker-compose.yml |
이후 프로젝트를 빌드하면 다음과 같은 네트워크가 생성 되었음을 확인할 수 있다.
1 | > docker network ls |
1 | > docker network inspcet my_project |
상기 네트워크 정보와 같이 두 컴포즈의 각 컨테이너들이 한 네트워크를 공유하고 있음을 확인할 수 있다. 이전과 동일하게 IP 주소나 Alias를 통해서 각 컨테이너에 접근할 수 있다.
다만 이 과정에서 또다른 문제가 발생하였는데, 같은 템플릿에서 파생된 두 프로젝트이다보니 동일한 서비스 명을 공유하고 있었다. 이러할 경우 컨테이너 이름을 통해 다른 컨테이너에 연결을 시도할 경우 중복된 두 컨테이너 사이에서 갈팡질팡하는 상황이 발생하였다.
1 | > tcpping nginx 80 |
이를 방지하기 위해 서비스명을 중복되지 않도록 바꿔주거나 컨테이너 이름 혹은 ID를 통해 접근함으로써 해결할 수 있다.
1 | > tcpping my_project-nginx-1 |