개요
Docker를 사용하다 보면 여러 컨테이너 간의 통신이 필요한 상황이 발생합니다. 도커는 이런 상황에서 컨테이너 간 안전하고 효율적인 통신이 가능하게 하는 network기능을 제공합니다.
본 글에서는 Docker Network에 대해서 정리하고자 합니다.
Docker Network란❓
Docker Network는 컨테이너 간의 통신을 가능하게 하는 가상의 네트워크 인프라입니다. 여러 컨테이너가 서로 통신해야 하는 상황에 필수적인 요소입니다.
Docker Network가 필요한 이유
- 컨테이너 간 안전한 통신 환경 구축
- 마이크로서비스 아키텍처(MSA) 구현
- 애플리케이션 컴포넌트 간의 격리
- IP 주소 대신 컨테이너 이름으로 통신 가능
Docker Network 사용 방법
1. 네트워크 생성
볼륨과 달리 Docker는 네트워크를 자동으로 생성하지 않습니다. 따라서 네트워크를 사용하기 전에 먼저 생성해야 합니다.
docker network create [네트워크_이름]
2. 네트워크에 컨테이너 연결
네트워크를 생성한 후에는 컨테이너를 실행할 때 --network 옵션을 사용하여 해당 네트워크에 연결할 수 있습니다.
생성된 네트워크에 컨테이너를 연결하는 방법은 다음과 같습니다.
docker run -d --name mongodb --network [네트워크_이름] mongo
Docker Network 특징 : 컨테이너 이름을 통한 통신
Docker Network의 가장 큰 장점 중 하나는 IP 주소 대신 컨테이너 이름을 사용할 수 있다는 점입니다.
1. 컨테이너 이름을 통한 통신
1.1 기존의 IP기반 통신
mongoose.connect(
'mongodb://172.17.0.2:27017/swfavorites',
{ useNewUrlParser: true }
);
1.2 Docker Network를 사용한 통신
mongoose.connect(
'mongodb://mongodb:27017/swfavorites',
{ useNewUrlParser: true }
);
Docker는 자동으로 컨테이너 이름을 해당 IP 주소로 변환해주므로, 하드코딩된 IP 주소를 사용할 필요가 없습니다.
2. 포트 게시 없는 자유로운 통신
docker run -d --name mongodb --network facorites-net mongo
위 코드를 보면 컨테이너에 연결하기 위해 실행할 때 포트를 게시하지 않은 것을 확인할 수 있습니다.
이는 의도된 것으로, 같은 네트워크 내의 컨테이너들은 포트 게시 없이도 자유롭게 통신할 수 있기 때문입니다. 포트 게시는 로컬 호스트나 외부에서 컨테이너에 접근해야 할 때만 필요합니다.
Docker Network 활용 예시
위 포스팅에서의 간단한 시나리오에 Docker Network를 활용하는 방법을 살펴보겠습니다.
1) 네트워크 연결 시도
먼저 MongoDB 컨테이너를 실행하면서 네트워크에 연결해보겠습니다.
docker run -d --name mongodb --network favorites-net mongo
예상대로 "네트워크를 찾을 수 없다" 는 에러가 발생합니다. Docker는 볼륨과 달리 네트워크를 자동으로 생성하지 않기 때문입니다.
2) 네트워크 생성
docker network create favorites-net
docker network --help 명령어로 확인해보면 네트워크 생성을 위한 create 옵션을 확인할 수 있습니다. 이를 사용하여 네트워크를 생성해보겠습니다.
이렇게 생성된 네트워크는 Docker 내부 네트워크로, 컨테이너 간 통신에 사용됩니다.
3) MongoDB 컨테이너 실행
이제 생성된 네트워크를 사용하여 다시 MongoDB 컨테이너를 실행합니다.
docker run -d --name mongodb --network favorites-net mongo
4) 컨테이너 간 통신 설정
기존에는 다음과 같이 MongoDB의 IP 주소를 직접 지정했습니다.
mongoose.connect(
'mongodb://container-ip:27017/swfavorites', // 127.17.0.2
{ useNewUrlParser: true },
(err) => {
if (err) {
console.log(err);
} else {
app.listen(3000);
}
}
);
하지만 이런 IP 하드코딩 방식은 좋지 않습니다. Docker Network를 사용하면 IP 대신 컨테이너 이름을 사용할 수 있습니다.
mongoose.connect(
'mongodb://mongodb:27017/swfavorites',
{ useNewUrlParser: true },
(err) => {
if (err) {
console.log(err);
} else {
app.listen(3000);
}
}
);
Docker가 자동으로 컨테이너 이름을 해당 IP 주소로 변환해주기 때문에, 더 안정적이고 관리하기 쉬운 방식입니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker 컨테이너에서 호스트 머신에 접근하기: host.docker.internal (0) | 2025.02.02 |
---|---|
[Docker] 도커 컨테이너 환경변수 설정 : ENV & ARG (0) | 2025.01.27 |
[Docker] 도커 바인드 마운트란 무엇일까❓: 데이터 저장과 실시간 공유 (0) | 2025.01.07 |
[Docker] Docker 컨테이너 데이터 관리: 익명 볼륨 vs 명명된 볼륨 (0) | 2025.01.06 |
[Docker] 컨테이너의 파일시스템 이해하기: 데이터는 어디에 저장될까❓ (0) | 2025.01.05 |