DevOps/Docker

[Docker] Docker Network를 이용하여 네트워크 공유하기

ooeunz 2020. 1. 31. 17:20
반응형

Docker Network란 실행된 각각의 컨테이너끼리 연결하기 위한 논리적인 네트워크입니다. 같은 네트워크 안에서는 각각의 컨테이너의 IP를 지정해주거나 할 필요 없이 name만으로 손쉽게 네트워크를 연결할 수 있다는 장점이 있습니다. 또한 아웃바운드 포트를 오픈하지 않는 이상 내부적으로만 통신하게 됩니다.

 

예시

예를 들어 Node서버와 Redis서버가 통신을 하게 되는 아키텍처가 있다고 가정해보겠습니다. Node서버는 외부의 클라이언트로부터 api요청을 받게 되지만 redis는 node 서버와만 통신이 필요합니다. 이러한 경우 하나의 네트워크 안에 두개의 컨테이너를 배포하고 노드 서버만 포트포워딩을 해줌으로서 문제를 해결할 수 있습니다.

 

 

※ 예전에는 Docker Link를 사용해서 private IP끼리 통신을 하도록 하였지만, 최근에는 Docker Link 방식을 권장하지 않고 있습니다. (곧 사라질 가능성이 있다.) 따라서 이번 포스팅에서는 Docker Network를 사용하도록 하겠습니다.

 


실습

Docker Network는 Docker 컨테이너 끼리의 네트워크를 만들고, 그 네트워크 안에 속한 컨테이너끼리는 Private 통신을 할 수 있도록 자동으로 연결해줍니다. 아래의 명령어를 이용해서 Network를 생성해보도록 하겠습니다.

docker network create <네트워크 이름>

create 이후 docker network ls 명령어를 통해 fluff라는 이름의 network가 생성된 것을 알 수 있습니다.

 

이제 fluff 네트워크 안에 docker image를 이용해서 private망으로 배포를 해보도록 하겠다. 명령어는 이전 포스팅에서 나왔던 포스팅과 크게 다르지 않습니다.

 

※ 해당 실습은 Redis Image와 Node.js Image가 만들어져 있는 상태에서 시작됩니다. 만약 Image가 없다면 이전 포스팅을 참고해 주세요.

docker run -d --name <컨테이너 이름> -p <Port 번호> --network <네트워크 이름> <이미지 이름>

위의 예시에선 redis와 fluff_server 두개의 컨테이너를 배포하였습니다.

(예시에선 -p로 포트번호를 열어주었지만, 만약 Network내에서만 통신을 할 경우 --name으로 선언한 컨테이너 이름으로 ip나 포트번호를 대신해서 사용할 수 있습니다.)

 

정리하자면 redis는 가상 네트워크 안에서 접근이 가능하고, public에서는 접근이 불가능하다. 반면에 fluff_server는 3000번 포트를 바인딩 하였기 때문에 3000번 포트로 접근이 가능하게 됩니다.

반응형