도커 두개 설치
도커 컨테이너 안에서 몽고DB를 설치해서 작업이 가능하다.
그러기 위해선 도커를 두캐 실행해야 한다.
- 하나는 express 도커 컨테이너
(경로 backend/Dockerfile)
FROM node:14 COPY ./package.json /myfolder/ COPY ./yarn.lock /myfolder/ # 커서 위치 /myfolder 뒤로 변경 WORKDIR /myfolder/ RUN yarn install COPY . /myfolder/ CMD yarn dev
- 또 하나는 mongo를 실행시켜주는 도커 컨테이너
(경로 backend/Dockerfile.mongo)
# 몽고디비 5버전 다운, 자동으로 실행 명령어가있어서 자동으로 실행됌 FROM mongo:5
두개의 도커 컨테이너를 한번에 실행하기
터미널 하나당 다음 명령어를 입력해주면 도커 컨테이너 두개를 실행 할 수 있다.
docker build . docker run 이미지ID
한번의 명령어로 도커 컨테이너 두개 이상 실행하는 방법을 알아보자.
도커 그륩화 (compose)
docker-compose.yaml 파일에 다음을 적어주자
version: "3.7" # 컴퓨터들 services: # 컴퓨터 이름 my-backend: build: context: . dockerfile: Dockerfile ports: - 4000:4000 # 컴퓨터 이름 my-database: build: context: . dockerfile: Dockerfile.mongo ports: - 27017:27017
참고사항
- 버전은 보통 3.7 혹은 3.9를 많이 사용한다.
context
는 경로를 의미함-
.
이라고 작성해줬으니 현재docker-compose.yaml
이 작성된 현재 경로에서 Dockerfile이라는 파일명을 찾는다는 뜻임
- ports는 포트포워딩
중요포인트: 들여쓰기를 잘할 것
들여쓰기로 부모/자식 관계를 나타내기 때문에 들여쓰기를 잘해야됌
들여쓰기를 잘해야하는 이유
들여쓰기에 따라서 에러가 발생 할 수 있다.
- ❌ 들여쓰기를 잘못한 올바르지 못한 예시
build: context: . dockerfile: Dockerfile ports: - 4000:4000
- ⭕ 들여쓰기를 잘한 올바른 예시 /
version: "3.7" # 컴퓨터들 services: # 컴퓨터 이름 my-backend: build: context: . dockerfile: Dockerfile ports: - 4000:4000 # 컴퓨터 이름 my-database: build: context: . dockerfile: Dockerfile.mongo ports: - 27017:27017
도커 컨테이너에 mongoose 연결하기
에러
- index.js 경로에 다음과 같이 몽구 연결 코드를 작성하고,
mongoose .connect("mongodb://localhost:27017/mydocker") .then(() => { console.log("DB 연결 성공"); }) .catch((err) => console.log("DB 연결 실패", err)); app.listen(4000);
- 다음 명령어를 통해서 도커 최신화 후 도커 컨테이너들을 실행 시키면
docker-compose build docker-compose up
도커 컨테이너가
localhost:27017
로 연결을 못해서 에러가 나게 된다.이것은, 첫번째 도커인 express 도커 컨테이너안의 index.js에서 mongoose가 localhost:27017로 연결하려고 찾지만,
두번째 도커 컨테이너의 pc 포트번호는 27017이 아니라서 첫번째 도커가 두번째 도커 포트에 연결을 못해서 발생하는 에러다.
이것은 네임리졸루션으로 해결이 가능하다.
네임리졸루션
네임리졸루션이란? 도커 컴포즈로 실행시킨 도커 컨테이너들끼리의 포트번호를 연결해주는것
앞전에 설정한
mongo도커 컨테이너
의 이름을 적어주면 된다.mongoose // .connect("mongodb://localhost:27017/mydocker") .connect("mongodb://my-database:27017/mydocker") .then(() => { console.log("DB 연결 성공"); }) .catch((err) => console.log("DB 연결 실패", err));
테스트
- 작성한 docker-compose.yaml 파일을 빌드시켜주고 (이미지를 저장해준다고 표현함)
docker-compose build
- 저장된 이미지를 실행 시킨다.
docker-compose up
- 다음 명령어를 입력하면
docker ps
사진처럼 나오는데, 포트포워딩도 잘 되어있는것을 확인 할 수 있다.
컨테이너 몽고 db접속 확인법
- 해당 명령어를 통해, 도커 컨테이너에 들어갈 수 있다.
docker exec -it ‘db컨테이너ID’ /bin/bash
- 이후
mongo
를 입력하면 몽고 db가 접속되어있는걸 확인 할 수 있다.
- 해당 도커에서 나오는 방법은
exit
를 입력하면 된다.
종료
실행되어있는 터미널에서 컨트롤 + c 를 누르면 종료됨
꺼져있는지 확인하려면? → docker ps
만약 실행은 한 상태지만, 실행되어있는 터미널이 사라져있고, docker ps를 통해 확인한 결과 도커가 실행중인 상태에서 종료하는 방법 → docker-compose stop
리팩토링
(Dockerfile.mongo)
# 몽고디비 5버전 다운, 자동으로 실행 명령어가있어서 자동으로 실행됌 FROM mongo:5
- 위의 Dockerfile.mongo 파일처럼 한줄만 적혀있을 때 할 수 있는 리팩토링 방법
- Dockerfile.mongo 이 파일을 삭제하고
(docker-compose.yaml)
version: "3.7" # 컴퓨터들 services: # 컴퓨터이름 my-backend: build: context: . dockerfile: Dockerfile ports: - 4000:4000 # 컴퓨터이름 my-database: image: mongo:5 ports: - 27017:27017
- docker-compose.yaml 파일에
image: mongo:5
을 추가해주면 됨
결론
도커 컨테이너가 하나일때도 docker-compose up을 통해 실행하는게 끄고 켜고 하는게 간편하다.
docker-compose.yaml 파일만 수정해줬을 경우 docker-compose build 를 다시 할 필요없고,
docker-compose up 명령어만 쳐줘도 된다.
댓글