본문 바로가기
Linux

Docker - Docker Network, 컨테이너 간 통신하기

by 올엠 2024. 2. 19.
반응형

요즘 마이크로 서비스를 만들면서, 하나의 서버에서 멀티 Docker 컨테이너로 구성하는 경우가 많다.

필자 역시 DB, API, WEB등 기능으로 구분해서 컨테이너간에 통신하도록 구성하게 된다.

이때 가장 문제가 되는 부분이, 바로 컨테이너간 통신에, locahost를 사용할 수 없다는 것이다.

이유는 컨테이너는 개별 호스트처럼 이식되어 개별 컨테이너마다 localhost를 본인으로 지정하게 된다.

 

이를 쉽게 회피하는 방법은

1. 서버의 IP로 통신을 하면 되지만, 실제로 이렇게 통신을 구성하게 되면,

Docker 컨테이너는 실제 Docker 내부의 네트워크를 가지고 있어서 호스트하는 서버로 패킷이 이동한후 다시 컨테이너내 네트워크로 이동하는 패킷 비용 손실과 서버 IP가 고정이 아닌경우 컨테이너를 실행할 때마다 체크해서 변경해줘야 하는 단점이 존재한다.

2. 컨테이너 IP로 통신은 Docker 내부의 네트워크 내 IP로 통신하기 때문에 패킷 비용 손실은 발생하지 않지만...  고정이 아닌경우 컨테이너를 실행할 때마다 체크해서 변경해줘야 하는 단점이 존재한다. 컨테이너 IP는 inspect 명령으로 확인이 가능하다.

docker inspect <container name>

그렇다면 어떻게 컨테이너간 통신을 쉽게 할 수 있을까?

방법은 도커에 네트워크를 생성해서 해당 네트워크 끼리 통신하도록 구성할 수 있다.

docker network ls 명령을 실행하면 현재 docker 네트워크 정보를 볼 수 있고, nat 구성이 있다면 해당 네트워크로 지정할 경우 container name으로 도커간 통신이 가능하게 된다.

 

도커 네트워크 생성 및 연결하기

docker network create <network name> 을 이용해서 네트워크 생성이 가능하다.

그리고 생성된 네트워크를 컨테이너 실행할 때 지정하면 해당 네트워크에 할당되어 컨테이너 이름으로 서로 사용할 수 있게 된다.

docker run -d --name <container name> --network <network name> <image name>

 

실행로그

\>docker network create docker-net
1c9d02f1731394b570487151041262fda5a75b71da2125abd62527b6af5b1d84

\>docker run -d --name rabbitmq-a --network docker-net rabbitmq
7c349f86eb101f126cdf609d664a49f05357611d99a725b8ae7e2687efa29b11
\>docker run -d --name mariadb-a --network docker-net --env MARIADB_USER=example-user --env MARIADB_PASSWORD=my_cool_secret --env MARIADB_ROOT_PASSWORD=my-secret-pw mariadb
6610f412a63bf58a1c5a4b38e8715c5dc4436c03f0eb92c1a99f6f0ad13fb8b5

\>docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED              STATUS              PORTS                                                 NAMES
6610f412a63b   mariadb    "docker-entrypoint.s…"   3 seconds ago        Up 2 seconds        3306/tcp                                              mariadb-a
7c349f86eb10   rabbitmq   "docker-entrypoint.s…"   About a minute ago   Up About a minute   4369/tcp, 5671-5672/tcp, 15691-15692/tcp, 25672/tcp   rabbitmq-a

이후 실제 컨테이너에 들어가 ping을 해보면 정상적으로 호출이 가능한 것을 알 수 있다.

docker exec -it <container name> bash

ping 설치하기

apt update

apt-get install iputils-ping

개발중에 컨테이너 이름 활용

만약 도커를 실행하지 않는 개발중에 위와 같이 호스트 이름으로 호출하고 싶다면. hosts 파일을 이용하자.

운영체제별로 제공하는 hosts 파일을 열어서 컨테이너 이름과 동일하게 지정할 경우 개발코드에서도 별도의 수정없이 사용할 수 있다.

  • 윈도우
C:\Windows\System32\drivers\etc\hosts
  • Mac,Linux
/etc/hosts



 

 

 

 

반응형