Network
컨테이너 내부에서 네트워크를 사용해보자.
- 다수의 컨테이너를 연결.
- 중간 컨테이너 애플리케이션이 다른 컨테이너에 있는 애플리케이션과 통신(DB 컨테이너와)
- 도커 컨테이너를 사용하면, 각각 컨테이너가 한 가지 주요 작업을 하는 것이 권장됨.
- 컨테이너가 서로 통신.
- 컨테이너에서 실행 중인 애플리케이션을 로컬 호스트 머신에 연결.
- 컴퓨터에서 실행 중인 다른 서비스에 HTTP 보내기 !
- 컨테이너 내부에서 www 연결
- 데이터 베이스와 통신
- 컨테이너에서 www 와 통신하는 것은 별다른 설정 없이도 가능하다.
- 하지만 로컬 호스트나 다른 컨테이너와의 통신이 필요할 땐, 설정해주어야 한다.
로컬 호스트와 통신
mongoose.connect(
// 'mongodb://localhost:27017/swfavorites',
'mongodb://host.docker.internal:27017/swfavorites',
{ useNewUrlParser: true },
(err) => {
if (err) {
console.log(err);
} else {
app.listen(3000);
}
}
);
- mongodb://localhost:27017/swfavorites → 로컬 호스트 연결
- host.docker.internal → 도커에서 로컬호스트 IP를 지칭하는 표시
- http 에서도 사용 가능 :)
- mongodb://host.docker.internal:27017/swfavorites 로 바꿔준다. → 도커가 알아서 처리하게 함
컨테이너 간의 통신
컨테이너 내부에 몽고 DB 설정
# mongodb 컨테이너 만들기
docker run -d --name mongodb mongo
# mongodb 컨테이너 정보 보기
docker container inspect mongodb
컨테이너 정보에서 Network Setting → IPAddress
- 이것이 바로 mongodb 컨테이너의 IP !
mongoose.connect(
// 'mongodb://localhost:27017/swfavorites', // -> 로컬에서 동작할 때
// 'mongodb://host.docker.internal:27017/swfavorites', // -> docker 가 로컬에서 동작하는 앱과 통신한다고 말해줄 때
'mongodb://172.17.0.2:27017/swfavorites', // -> 컨테이너간의 통신할 때 (컨테이너의 IP 이용)
{ useNewUrlParser: true },
(err) => {
if (err) {
console.log(err);
} else {
app.listen(3000);
}
}
);
아쉬운 점
- 통신할 컨테이너를 찾기 위해 컨테이너 IP 를 알아내야 한다.
- IP 가 바뀔 때마다 매번 새 이미지를 빌드해야 한다. ㅠ
→ 멋지게도 도커에서 다중 컨테이너끼리 통신하는 더 쉬운 방법이 있음 !
다중 컨테이너 통신
docker run --network
- 이 명령어를 이용하면 컨테이너들을 하나의 동일한 네트워크에 포함시킬 수 있다. !?
- 모든 컨테이너가 서로 통신할 수 있는 네트워크가 생성 됨.
- IP 조회 및 해결 작업을 자동으로 수행함. 서로 통신 가능 😊
// 네트워크 만들기
// 네트워크는 볼륨처럼 run 명령어로 자동 생성 안 됨 ㅋ 직접 만드는 과정 필요
docker network create NETWORK_NAME
// mongodb 컨테이너 생성, 네트워크에 소속(?) 시킨다.
docker run -d --name mongodb --network NETWORK_NAME mongo
// 애플리케이션 코드 수정
// 컨테이너 이름을 알려주면 도커가 같은 네트워크에 있는 동일한 이름의 컨테이너를 찾고 그쪽이랑 통신함
// 컨테이너 이름으로 IP 주소 자동 변환 ㅋ
mongoose.connect(
// 'mongodb://localhost:27017/swfavorites', // -> 로컬에서 동작할 때
// 'mongodb://host.docker.internal:27017/swfavorites', // -> docker 가 로컬에서 동작하는 앱과 통신한다고 말해줄 때
// 'mongodb://172.17.0.2:27017/swfavorites', // -> 컨테이너간의 통신할 때 (컨테이너의 IP 이용)
'mongodb://mongodb:27017/swfavorites', // 같은 네트워크의 컨테이너와 통신 (컨테이너 이름을 붙여준다.)
{ useNewUrlParser: true },
(err) => {
if (err) {
console.log(err);
} else {
app.listen(3000);
}
}
);
// 애플리케이션 컨테이너를 만듬. 동일 네트워크를 사용하도록
docker run --name favorites --network favorites-net -d -p 3000:3000 favorites-node
몽고db 컨테이너와 정상 통신 완료 😃
교훈 (?)
- 컨테이너는 일방적으로 통신을 불가하다.
- 네트워크를 만들거나
- 컨테이너 IP 를 수동으로 조회해야 한다.
- 다수의 컨테이너가 서로 통신하는 것을 보장하기 위해서는 같은 네트워크로 묶는 건 어떨까 ? ‘_’
mongoDB 컨테이너를 생설할 땐 왜 -p 옵션이 없었을까?
그럼에도 왜 정상 통신이 가능할까?
- -p 옵션은 로컬 호스트나 컨테이너 네트워크 외부에서 그 컨테이너에 연결할 계획일 경우에만 !
- mongodb 컨테이너에는 favorites 애플리케이션밖에 없음.
- favorites 은 도커 네트워크를 이용
- mongodb 도 같은 네트워크 소속
- 굳이 포트 연결 필요 ㄴㄴ
mongodb 컨테이너가 로컬 호스트나 타 네트워크에 소속되어 있다면 포트를 열어 다른 네트워크와의 통신을 허용해줘야겠지만, 같은 네트워크에서는 통신이 자유롭기 때문에 포트 설정 필요 없음 ^ㅅ^
도커가 IP 주소를 어떻게 알아낼까용?
host.docker.internal , continer-name 으로 어떻게 IP 주소를 알아낼 수 있을까.
- 도커가 애플리케이션이 실행되는 환경을 관리함.
- 도커는 소스 코드를 내부적으로 교체하지 않음. (like ENV or ARG)
- 컨테이너 이름을 보고 코드에 플러그인 된 컨테이너의 IP 주소를 연결.
- 소스코드가 IP 주소로 바뀌는 게 아님, 요청 할 때만 도커가 이름에 맞춰 변환해줌.
Docker Network Driver
네트워크 동작에 영향을 미치는 드라이버. 디폴트는 bridge
// 사실 bridge 는 디폴트라 생략 가능!
docker network create --driver bridge NAME
- host
- 컨테이너와 호스트 시스템을 격리 X, 로컬호스트를 네트워크로 공유함.
- overlay
- 여러 도커 데몬(서로 다른 머신에서 실행되는 도커)가 연결 가능. 구식 모드 ㅋ
- macvlan
- 컨테이너에 커스텀 mac 주소 설정 가능, 이 주소를 해당 컨테이너와 통신하는데에 사용 가능
- none
- 네트워킹 비활성화
- 써드파티 플러그인
- 모든 종류의 동작과 기능 추가가 가능한 타사 플러그인 설치 가능
→ bridge 드라이버는 대부분의 시나리오에 좋다!~ 걍 별 일 없으면 bridge ㄱㄱㄱ
728x90
'개발공부 개발새발 > Docker' 카테고리의 다른 글
Docker ) Docker-Compose (0) | 2024.04.03 |
---|---|
Docker ) 다중 컨테이너 (0) | 2024.04.02 |
Docker ) ARG 와 ENV (0) | 2024.03.18 |
Docker ) 도커 볼륨과 바인드 마운트 (0) | 2024.03.18 |
Docker ) 이미지, 컨테이너 관리. (0) | 2024.03.03 |