본문 바로가기
개발공부 개발새발/Docker

Docker ) Network

by 휴일이 2024. 3. 29.

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