Search
🌍

bc6_1_2. title: 하나의 머신에서 여러 개의 docker-compose 로 분리되어 실행되는 컨테이너들끼리 서로 API 통신이 가능하도록 하려면, 도커 네트워크를 별도로 생성하고 해당 네트워크에 컨테이너들을 부착하라.

생성
🚀 prev note
🚀 next note
14 more properties
하나의 호스트에서 구동되는 도커 컨테이너끼리 다음과 같이 상호작용하는 상황을 생각해 보자.
컨테이너 이름
하는 일
frontend
backend1 과 backend2 로 요청을 보낸다.
backend1
frontend 로부터 받은 요청에 대한 응답을 frontend 로 전송한다.
backend2
frontend 로부터 받은 요청에 대한 응답을 frontend 로 전송한다.
통상적으로 이러한 경우에는 세 개의 컨테이너를 실행하는 명령이 하나의 docker-compose 파일에 모두 들어 있게 된다. 이런 경우는 큰 문제가 되지 않는다. 하지만 설계상 세 개의 컨테이너가 모두 다른 docker-compose 파일로부터 실행되는 경우, 어떻게 코드의 변경을 최소화하고 이를 실행할 수 있을까?
컨테이너 이름
경로
docker-compose 파일
frontend
frotend_ws/
docker-compose.yml
backend1
swimming_ws/
docker-compose.yml
backend2
jogging_ws/
docker-compose.yml
하나의 머신에서 여러 개의 docker-compose 로 분리되어 실행되는 컨테이너들끼리 서로 API 통신이 가능하도록 하려면, 도커 네트워크를 별도로 생성하고 해당 네트워크에 컨테이너들을 부착하라.
1.
도커 네트워크를 생성한다.
docker network create health-service
Bash
복사
2.
각각의 docker-compose 파일에서 컨테이너 각각을 동일한 네트워크에 포함시킨다.
version: '3.3' services: ... fe: ... ports: - '80:8501' networks: - health-service networks: health-service: external: true
YAML
복사
frontend_ws/docker-compose.yml
version: '3.3' services: ... be: ... networks: - health-service networks: health-service: external: true
YAML
복사
swimming_ws/docker-compose.yml
version: '3.3' services: ... be: ... networks: - health-service networks: health-service: external: true
YAML
복사
jogging_ws/docker-compose.yml
앞서 우리는 health-service 라는 이름의 네트워크를 직접 생성했다. 모든 파일에서 external: true 로 설정하는 것은, docker-compose up 으로 호출될 때 자체적으로 새로운 네트워크를 만들지 말고 외부의 것이 있으면 사용하라는 이야기이다. frontend 컨테이너의 8501번 포트는 호스트 머신의 80번 포트에 연결되어 있다. backend1, backend2 컨테이너에서 실행되는 서비스는 모두 5001번 포트를 사용하지만, 도커 시스템 외부에서 접속할 필요가 없으므로 docker-compose 파일에는 명시되지 않았다.
3.
API 호출 시 컨테이너 이름을 사용하도록 변경한다.
backend1_base_url = f'http://backend1:5001' response = requests.get(backend1_base_url+'/swimming') backend2_base_url = f'http://backend2:5001' response = requests.get(backend2_base_url+'/jogging')
Python
복사
4.
netstat, ping, telnet 등 도구들을 이용해 컨테이너들이 정상적으로 네트워크에 연결되었는지 등을 확인한다(from2).
5.
정상적으로 동작한다면, API 호출 시 사용되는 컨테이너 이름과 포트 이름을 환경변수로부터 가져오도록 만들고, 환경변수는 docker-compose 파일에서 등록되도록 리팩터링한다.
version: '3.3' services: ... fe: ... ports: - '80:8501' networks: - health-service environment: SWIMMING_CONTAINER_NAME: backend1 SWIMMING_SERVICE_PORTNUM: 5001 JOGGING_CONTAINER_NAME: backend2 JOGGING_SERVICE_PORTNUM: 5001 networks: health-service: external: true
YAML
복사
frontend_ws/docker-compose.yml
url = None def use_swimming_api( domain_name: str = os.getenv("SWIMMING_CONTAINER_NAME"), port: int = os.getenv("SWIMMING_SERVICE_PORTNUM")) -> None: global url url = f'http://{domain_name}:{port}' def use_jogging_api( domain_name: str = os.getenv("JOGGING_CONTAINER_NAME"), port: int = os.getenv("JOGGING_SERVICE_PORTNUM")) -> None: global url url = f'http://{domain_name}:{port}'
Python
복사
frontend_ws/api.py
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료들.
from : 과거의 어떤 생각이 이 생각을 만들었는가?
1.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는가?
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는가?
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되고 이어지는가?
1.
None
참고 : 레퍼런스
1.
None