컨테이너 통신

wangjh789·2022년 8월 25일
0

docker

목록 보기
14/25

기본적으로 컨테이너는 월드 와이드 웹에 요청을 보낼 수 있다.

도커 <-> 외부 네트워크

일반적으로 도커화된 어플리케이션에서 웹API 과 통신할 수 있다.

도커 <-> 로컬 머신

그럼 로컬에 설치된 MongoDB와의 통신은 어떻게 할까?
몽고디비는 로컬머신에 있고, 앱은 컨테이너에 있다.
"mongodb://localhost:27017/swfavorites" url은 연결이 되지 않는다.
localhost를 도커가 이해할 수 있는 도메인으로 변경해야한다. -> mongodb://host.docker.internal:27017/swfavorites
host.docker.internal는 도커 컨테이너 내부에서 알 수 있는 로컬 호스트 IP로 변환된다.

컨테이너 <-> 컨테이너

이번엔 몽고디비를 container에 올려 컨테이너 끼리 통신을 한다고 가정한다.
docker run --name mongodb -d mongo
위 명령을 입력하면 도커허브에서 몽고디비 이미지를 찾아 빌드하고 컨테이너를 시작한다.

docker container inspect mongodb
이 명령어로 컨테이너의 NetworkSettings의 IpAddress를 찾는다.
mongodb://172.17.0.2:27017/swfavorites 로 바꾸면 컨테이너에서 실행중인 몽고db와 연결할 수 있다.

도커로 컨테이너 네트워크를 만들 수 있다.
컨테이너 끼리의 통신을 허용할 수 있다.
docker run 명령어에 --network 옵션을 추가하면 하나의 동일한 네트워크에 밀어넣을 수 있다. 따라서 서로 통신할 수있는 네트워크가 형성했다.
여기선 IP조회를 자동으로 해주기 때문에 격리된 환경에서 유용한 기능이다.

container network

볼륨과 달리 네트워크는 자동으로 생성되지 않는다.
docker network create <네트워크 이름> 으로 직접 생성해줘야 한다.

docker network ls 로 모든 네트워크를 출력할 수 있다.

docker run --rm -d --name mongodb --network favorites-net mongo
docker run --rm -d -p 3000:3000 --name favorites-app --network favorites-net favorites

위 명령어로 favorites-net 네트워크에 2개의 컨테이너가 참여했을 때
mongodb://mongodb:27017/swfavorites 처럼 통신하려는 컨테이너의 이름으로 통신이 가능하다.

다른 도커 컨테이너 이름 또한 그 컨테이너의 IP 주소로 자동 변환이 된다.

컨테이너 간의 통신은 수동IP를 직접 입력하던가, 컨테이너 네트워크로 묶든가 이렇게 2가지이다.

왜 몽고디비 컨테이너를 시작할 때 포트를 -p 옵션을 사용하지 않을까?
이번 예제는 같은 도커 네트워크 내에 있는 컨테이너에서 요청을 했다. 이 경우 포트를 지정할 필요가 없다.
만약 외부 네트워크나 로컬머신에서 컨테이너로 접근할 때 -p 옵션을 사용해야 한다.

도커는 소스코드를 대체하지 않는다.
도커가 앱이 실행되는 환경을 소유하고, 컨테이너에서 Http요청 등 요청을 보내는 경우 도커가 이를 안식해 주소, 컨테이너 이름 또는 host.docker.internal을 실제 IP주소 바꾼다.(도커는 주변의 컨테이너와 호스트머신을 알고 있어서)
즉 컨테이너에서 요청을 전송할 때만 자동 IP변환이 발생한다.

Docker 네트워크 드라이버

도커네트워크는 실제로 네트워크 동작에 영향을 미치는 다양한 종류의 드라이버를 지원한다.
디폴트인 brige 드라이버로 같은 네트워크의 컨테이너를 이름으로 찾을 수 있게 한다.

profile
기록

0개의 댓글