자율 학습/스터디

[Docker, Redis] 애플리케이션 도커 이미지 만들기 (host.docker.internal)

60cod 2024. 6. 23. 18:58

1. Dockerfile 작성

1-1. package.json과 같은 경로에 파일 생성

FROM node:18

RUN npm install
RUN npm run build

CMD ["npm", "start"]
  • CMD에서 띄어쓰기는 콤마로 작성한다.
  • 단계별로 나눈 이유는 빌드가 오래 걸리기 때문에 캐싱을 활용하기 위해서다.

 

1-2. 소스코드 복사

이 컨테이너는 호스트 머신과 파일 시스템이 다 분리될 것이다.

그래서 FROM, RUN, CMD만 해서는 소스코드가 하나도 넘어오지 않아서 실행시킬 수 없다.

 

➡️ RUN 전에 COPY 추가해서 애플리케이션 소스 코드를 컨테이너로 복사한다.

FROM node:18

COPY . .

RUN npm install
RUN npm run build

CMD ["npm", "start"]
  • COPY . . : 호스트 머신에서 Dockerfile 경로에 있는 모든 파일들을 이 컨테이너 상의 루트 경로로 전부 카피

 

 

 

2. 도커 이미지 생성

2-1. 빌드

docker build -t {이름} .
  • . : 도커 파일의 경로

 

2-2. 확인

도커 이미지 잘 생성됐는지 목록 확인

docker images

 

 

 

3. 앱 컨테이너 실행 (오류)

docker run -it {이름}

 

지금 redis 서버가 꺼져 있으므로 연결 실패 떨어진다.

근데 redis 올려도 에러날 것임..

 

지금 하는 방식으로는 하나의 컨테이너 안에 애플리케이션도 띄우고 redis도 띄워야 하지만,

컨테이너는 VM과 달리 매우 Lightweight 하고 데이터 일관성 문제도 있기 때문에 가급적이면 한 컨테이너 안에 한 프로세스를 두고 쓰는 게 좋다.

그렇게 하면 쉽게 버리거나 늘릴 수 있는 것도 장점이다.

 

 

위와 같은 흐름으로 앱에서 호스트 머신에 접근하고 호스트 머신에서 포트 맵핑으로 레디스를 연결할 것이다.

 

 

 

4. redis 컨테이너 실행

포트맵핑 설정

docker run -d -p 6379:6379 redis

 

 

 

5. 앱 컨테이너에서 redis 컨테이너 접근하는 방법

5-1. host.docker.internal

💡 윈도우, 맥의 경우 host.docker.internal 명령어를 이용해서 컨테이너 내부에서 호스트로 접근이 가능하다.

 

➡️ .env 파일 REDIS_URL 수정

PORT=4000
REDIS_URL=redis://host.docker.internal:6379

 

참고

 

5-2. 다시 빌드, 실행

docker build -t {이름}
docker run -it {이름}

 

 

 

6. .env 파일 제외하고 도커 이미지 생성하는 방법

6-1. .dockerignore 작성

모든 소스코드를 복사해서 도커 이미지를 생성했기 때문에 개선이 필요하다.

특히 .env 파일은 반드시 제외되어야 한다.

 

.dockerignore 파일 생성

.env
.github
build
node_modules
다른폴더

 

6-2. 다시 빌드

.dockerignore 파일 로드하는 거 확인 가능..

 

 

 

7. 제외한 .env 파일 적용해서 실행하는 방법

--env-file .env 옵션 사용

docker run -it --env-file .env {이름}