도커 컨테이너 간의 통신을 하기 위해 여러 개의 컨테이너를 만들어 봅니다.
.dockerignore
node_modules
Dockerfile
.git
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 태그 사용)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를 연결하는 코드가 있다면 네트워크 오류로 연결이 되지 않고 컨테이너가 중지됩니다.
mongoose.connect('mongodb://localhost:27017/myapp')
아래와 같이 localhost
를 도커가 이해할 수 있는 host.docker.internal
도메인으로 변경하면 도커 컨테이너 내부에서 알 수 있는 IP주소로 변환되어 통신할 수 있습니다.
(localhost
-> host.docker.internal
)
mongoose.connect('mongodb://host.docker.internal:27017/myapp')
아래 명령어로 mongodb 컨테이너를 검사하여 NectworkSettings
객체의 IPAddress
(컨테이너 IP주소)를 알아내 컨테이너와 연결할 수 있습니다.
docker container inspect <몽고디비 컨테이너 이름>
예를 들어 IPAddress
가 172.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 <이미지>
Docker Hub에 등록된 공식 mongo 이미지를 기반으로 컨테이너를 실행합니다.
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 <이미지>
FROM node // node:<버전> 버전을 명시하지 않으면 최신 버전을 사용(노드 기본 이미지 사용)
WORKDIR /app // 작업 디렉토리를 명시
COPY package.json . // 작업 디렉토리에 package.json 복사
RUN npm install // 프로젝트 종속성을 설치
COPY . . // 프로젝트 폴더 모든 파일을 컨테이너 작업 디렉토리에 복사
EXPOSE 3000 // 애플리케이션에서 사용하는 포트
CMD ['npm', 'start']// 이미지 기반반으로 컨테이너가 실행될 때 실행되어야할 명령
docker build -t <이미지 이름>:<버전> .
(<버전>을 명시하지 않으면 자동으로 latest 태그 사용)-it
옵션을 추가하여 상호작용할 수 있도록 실행해야 합니다docker run --name <컨테이너 이름> -d --rm -p 3000:3000 -it <이미지>
fetch('https://localhost/api'
))한다면 API server(node) 컨테이너를 실행할 때 포트(ex 8000)를 개시해야 합니다.바인드 마운트 example
docker run -v <프로젝트 경로/src($(pwd))>:<매핑 경로/src> --name <컨테이너 이름> --rm -p 3000:3000 -it <이미지>