도커 컨테이너 간 통신

김래영·2023년 3월 3일
0

Docker Study

목록 보기
4/9
post-thumbnail

도커 컨테이너 간의 통신을 하기 위해 여러 개의 컨테이너를 만들어 봅니다.

  • 기본적으로 웹 API 및 웨 피이지와 통신할 수 있습니다.(WWW)
  • 불필요한 것을 복사하지 않도록 .dockerignore을 작성합니다.

.dockerignore

node_modules
Dockerfile
.git

API server(node) 도커화

FROM node // node:<버전> 버전을 명시하지 않으면 최신 버전을 사용(노드 기본 이미지 사용)

WORKDIR /app // 작업 디렉토리를 명시

COPY package.json . // 작업 디렉토리에 package.json 복사

RUN npm install // 프로젝트 종속성을 설치

COPY . . // 프로젝트 폴더 모든 파일을 컨테이너 작업 디렉토리에 복사

EXPOSE 8000 // 애플리케이션에서 사용하는 포트 

ENV MONGODB_USERNAME=root // 환경변수 추가

ENV MONGODB_PASSWORD=secret // 환경변수 추가

CMD ['npm', 'start'] // 이미지 기반반으로 컨테이너가 실행될 때 실행되어야할 명령
  • 위와 같이 도커 파일을 작성해 줍니다.
  • 이미지 생성
    • docker build -t <이미지 이름>:<버전> . (<버전>을 명시하지 않으면 자동으로 latest 태그 사용)
  • detached모드로 실행하고(-d) 종료되면 자동으로 컨테이너가 제거(--rm) 되도록 하고 애플리케이션에서 사용하는 포트를 개시(-p 8000:8000)하여 컨테이너를 실행합니다.
    • docker run --name <컨테이너 이름> -d --rm -p 8000:8000 <이미지>
  • -e옵션으로 환경변수를 추가할 수 있습니다.

ex)

docker run --name <컨테이너 이름> -v <프로젝트 경로$(pwd)>:<매핑 경로> -v <매핑경로>/node_modules --rm -d --network <네트워크 이름> -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret <이미지>

호스트 통신(mongodb)

아래와 같이 mongoDB가 로컬에 설치되어 실행중일 때 mongodb를 연결하는 코드가 있다면 네트워크 오류로 연결이 되지 않고 컨테이너가 중지됩니다.

mongoose.connect('mongodb://localhost:27017/myapp')

아래와 같이 localhost를 도커가 이해할 수 있는 host.docker.internal도메인으로 변경하면 도커 컨테이너 내부에서 알 수 있는 IP주소로 변환되어 통신할 수 있습니다.
(localhost -> host.docker.internal)

mongoose.connect('mongodb://host.docker.internal:27017/myapp')

컨테이너 통신(mongodb)

컨테이너 IP 주소 사용하기

아래 명령어로 mongodb 컨테이너를 검사하여 NectworkSettings객체의 IPAddress(컨테이너 IP주소)를 알아내 컨테이너와 연결할 수 있습니다.

docker container inspect <몽고디비 컨테이너 이름>

예를 들어 IPAddress172.14.03라고 한다면 해당 IP 주소를 입력하여 컨테이너와 통신할 수 있습니다.
하지만 컨테이너의 IP 주소가 변경될 때마다 컨테이너 IP주소를 찾아야 하고 소스를 변경하면 이미지를 다시 빌드해야 하는 번거로움이 있습니다.

mongoose.connect('mongodb://172.14.03:27017/myapp')

네트워크 사용하기

도커 네트워크 목록
아래 명령어로 네트워크 목록을 확일할 수 있습니다.

docker network ls

도커 네트워크 만들기
아래 명령어로 네트워크를 생성합니다.

docker network create <네트워크 이름 설정>

사용할 네트워크에서 컨테이너 실행하기
--network <사용할 네트워크 이름>플래그로 네트워크를 사용할 수 있습니다.

docker run --name <컨테이너 이름 설정> --rm -d --network <사용할 네트워크 이름>

example
예를 들어 아래와 같이 네트워크를 만들고 컨테이너에서 해당 네트워크를 사용할 때

docker network create mongo-network
docker run --name mongodb --rm -d --network mongo-network

통신할 컨테이너도 같은 네트워크를 사용합니다.

docker run --name <컨테이너 이름> --network mongo-network -d --rm -p 8000:8000 <이미지> 

아래와 같이 네트워크를 사용하는 컨테이너 이름을 사용하면 컨테이너 IP주소로 변환됩니다.

mongoose.connect('mongodb://<컨테이너 이름>:27017/myapp')

바인드 마운트 example 

docker run --name <컨테이너 이름> -v <프로젝트 경로($(pwd))>:<매핑 경로> -v <매핑 경로>/node_modules --rm -d --network <네트워크 이름> -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret <이미지>

Database(mongoDB) 도커화

Docker Hub에 등록된 공식 mongo 이미지를 기반으로 컨테이너를 실행합니다.

  • mongoDB의 디폴트 포트 27017을 개시합니다.
    • (ex: mongoose.connect('mongodb://localhost:27017/myapp'))
    • docker run --name <컨테이러 이름> --rm -d -p 27017:27017 mongo

네트워크 통신

docker run --name <컨테이러 이름> --rm -d --network <네트워크 이름> -p 27017:27017 mongo

명명된 볼륨으로 데이터 지속하기

docker run --name <컨테이너 이름> -v <볼륨 이름>:<매핑 경로> --rm -d --network <네트워크 이름> <이미지>

-e옵션으로 아래와 같이 환경 변수를 추가할 수도 있습니다.

docker run --name <컨테이너 이름> -v <볼륨 이름>:<매핑 경로> --rm -d --network <네트워크 이름> -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret <이미지>

web front(react) 도커화

FROM node // node:<버전> 버전을 명시하지 않으면 최신 버전을 사용(노드 기본 이미지 사용)

WORKDIR /app // 작업 디렉토리를 명시

COPY package.json . // 작업 디렉토리에 package.json 복사

RUN npm install // 프로젝트 종속성을 설치

COPY . . // 프로젝트 폴더 모든 파일을 컨테이너 작업 디렉토리에 복사

EXPOSE 3000 // 애플리케이션에서 사용하는 포트 

CMD ['npm', 'start']// 이미지 기반반으로 컨테이너가 실행될 때 실행되어야할 명령
  • 위와 같이 도커 파일을 작성해 줍니다.
  • 이미지 생성
    • docker build -t <이미지 이름>:<버전> . (<버전>을 명시하지 않으면 자동으로 latest 태그 사용)
  • react 프로젝트는 -it옵션을 추가하여 상호작용할 수 있도록 실행해야 합니다
    • detached모드로 실행하고(-d) 종료되면 자동으로 컨테이너가 제거(--rm) 되도록 하고 애플리케이션에서 사용하는 포트를 개시(-p 8000:8000)하여 컨테이너를 실행합니다.
    • docker run --name <컨테이너 이름> -d --rm -p 3000:3000 -it <이미지>
  • 리액트와 같은 경우 브라우저에서 실행되기 때문에 개발 환경에서 API server(node)를 사용(ex: fetch('https://localhost/api'))한다면 API server(node) 컨테이너를 실행할 때 포트(ex 8000)를 개시해야 합니다.

바인드 마운트 example

docker run -v <프로젝트 경로/src($(pwd))>:<매핑 경로/src> --name <컨테이너 이름> --rm -p 3000:3000 -it <이미지>
profile
개발 노트

0개의 댓글