728x90
💡
도커에서는 컨테이너 간의 통신을 크게 세 가지로 나눌 수 있다.
이 세 가지 방법에 대해 간단히 알아보자.
기본적인 웹 통신
- 컨테이너는 기본적으로 외부에 포트를 노출시키는 것만으로 웹에 요청을 보낼 수 있다.
- 도커화된 애플리케이션 내부에서 웹 API 및 웹 페이지와 통신하는 데에 특별한 설정이나 코드변경이 필요하지 않다.
로컬 호스트 머신과의 통신

- 로컬 호스트 머신과의 통신에는 두 가지 방법이 있다.
- 위 코드는 로컬 호스트 머신의 mongoDB와 연결하기 위한 Node.js(도커 컨테이너) 코드의 일부이다.
- 'mongodb://localhost:27017/swfavorites'라고 적혀있는 것을 보니 로컬 호스트 머신의 mongoDB와 연결하게 되는데 이때 컨테이너의 3000번 포트를 통한다.

- 이때 도커화된 애플리케이션이 로컬 호스트 머신과 통신하기 위해서는 'localhost' 대신 'host.docker.internal'을 입력해야 한다.
- 'host.docker.internal'는 도커가 로컬 호스트 머신의 ip주소와 연결할 수 있도록 도와주는 명령어이다.
컨테이너 간 통신
직접 연결

- 현재 예제 코드는 위에서 언급했듯이 Node.js 기반의 코드이며, api 요청으로 get과 post를 수행할 수 있다.
- Node 서버를 통해 사용자가 좋아하는 스타워즈 시리즈를 mongDB에 등록하고 조회("/favorites")하는 기능을 가지고 있다.
- Node 서버를 통해 사용자가 좋아하는 스타워즈 시리즈를 mongDB에 등록하고 조회("/favorites")하는 기능을 가지고 있다.

- mongodb의 공식 이미지를 다운로드하고 컨테이너를 실행시켰다.
docker container inspect mongodb
- 위 명령어로 mongodb 컨테이너의 구성 정보를 확인해 보았다.

- 구성 정보 중에 IPAddress를 확인하여

- app.js에 mongoDB 컨테이너 ip를 적어주었다.
- 이렇게 하면 Node.js 코드 안에 mongoDB와 연결하는 정보를 적게 되어 직접 연결할 수 있게 된다.
docker build -t favorites-node .

- 수정한 코드를 반영하기 위해 node.js 프로젝트를 빌드해 주고

- 수정 사항을 반영한 컨테이너를 생성했다.

- localhost:3000으로 get 요청을 날리니 빈 배열과 함께 200 OK가 나옴으로써 두 컨테이너 간의 통신이 원활하게 이뤄지고 있음을 확인할 수 있다.
- 빈 배열이 나온 것은 당연하게도 아무것도 데이터를 입력하지 않았기 때문이다.
--network 옵션 이용
- 위의 직접 연결 방식은 컨테이너의 ip를 조회하여 수동으로 연결하는 방식이다.
- 이는 매우 비효율적인데 사실 도커에는 모든 컨테이너를 하나의 동일한 컨테이너로 묶을 수 있는 network 옵션이 존재한다.
docker network create favorites-net
docker network ls

- 우선 네트워크를 생성한다.
- 네트워크는 볼륨과는 달리 생성과 동시에 사용할 수 없어 우선 네트워크를 만들어줘야 한다.
- ls 명령어로 현재 존재하는 네트워크를 확인할 수 있다.
- favorites-net 이외의 네트워크는 디폴트로 설정되어 있는 네트워크이다.

- mongoDB 컨테이너를 facorites-net이라는 네트워크 안에 넣어 실행했다.
- mongoDB의 컨테이너명은 mongodb이다.

- mongoDB와 동일한 네트워크로 node.js 컨테이너를 생성할 것이기 때문에 mongodb(컨테이너명)라고 적어주었다.
- 같은 컨테이너 상에서는 컨테이너 명만으로 도커가 해당 컨테이너의 ip를 찾을 수 있다.
- 따라서 favorite-net 네트워크의 mongodb 컨테이너 명을 입력하여 같은 네트워크 상의 mongoDB와 연결되도록 했다.

- node 이미지를 재빌드하고 컨테이너를 생성할 때 --network 옵션을 추가하여 node.js 컨테이너를 mongoDB 컨테이너와 동일한 네트워크에 두었다.

- --network 옵션으로 하나의 네트워크에 두 컨테이너를 두어 서로 통신할 수 있음을 확인할 수 있다.
참고
Udemy - Docker & Kubernetes : 실전가이드
728x90
'[DevOps] > Docker' 카테고리의 다른 글
| Docker로 다중 컨테이너 애플리케이션 구축하기 - 2 (네트워크로 묶기, 데이터 지속성 추가) (0) | 2023.07.07 |
|---|---|
| Docker로 다중 컨테이너 애플리케이션 구축하기 - 1 (여러 개의 컨테이너 만들기) (0) | 2023.07.07 |
| Docker - Volumn & Bind Mount 이해하기 (1) | 2023.06.30 |
| 도커 이미지에 대해 자세히 살펴보기(dangling image, image inspect) (1) | 2023.06.21 |
| 도커 이미지 & 컨테이너 삭제 명령어 정리 (0) | 2023.06.21 |