본문 바로가기
웹/Docker

[Docker]COPY, Volume, Compose

by stubborngastropod 2023. 7. 23.
728x90

FROM node:10

COPY ./ ./

RUN npm install

CMD ["node", "server.js"]

node.js 어플리케이션을 담은 컨테이너를 실행하기 위해 docker 이미지 파일을 생성한다.

COPY ./ ./ 는 현재 디렉토리 내에 있는 모든 파일들을 스냅샷으로 해당 컨테이너에 추가한다.

이런 식으로 스냅샷을 추가해주지 않으면 컨테이너 run에 필요한 파일들이 없어 오류가 뜬다.

빌드 후 컨테이너를 실행했을 때 server.js에 명시된 포트번호(8080)로 접속해보면 접속이 되지 않는다.

이는 로컬 환경에서의 포트번호와 컨테이너의 포트번호가 다른 개념이기 때문이다. 따라서 로컬 환경에서의 포트를 컨테이너의 포트에 연결해서 run 명령어를 실행해줘야 한다.

docker run -p <로컬포트번호>:<컨테이너포트번호> <도커이미지>

어플리케이션이 정상 작동한다.

Working Directory 설정

스냅샷을 추가할 때 파일명 중복 등의 문제를 피하기 위해 WORKDIR 을 통해 working directory를 설정해줘야 한다.

FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

CMD ["node", "server.js"]

소스코드 변경시 효율적인 빌드

기존 소스코드를 수정하면 다시 도커 파일을 빌드할 때 변경점을 감지해서 종속성, 모듈 설치 등의 모든 과정을 다시 시작한다.

이를 방지하기 위해 종속성 및 모듈에 대한 내용인 package.json을 COPY하고 npm install 을 실행한 후 변경된 소스코드를 COPY해오면 기존의 캐시를 그대로 이용하므로 더욱 빠르게 빌드가 가능하다

Volume

도커 컨테이너에서 로컬의 파일을 복사하지 않고 volume을 이용하면 로컬 환경의 파일을 매핑할 수 있다.

docker run -p <로컬포트번호>:<컨테이너포트번호> -v <맵핑하지않는디렉터리> -v %cd%<맵핑할디렉터리>

  • 이유는 모르겠으나 현재 위 명령어로 맵핑이 정상적으로 되지 않는 것 같음(2023.7.23 기준, Windows)

Docker Compose

웹 서버에서 DB 서버에 연결하는 등 컨테이너 간 통신이 필요할 때 별도의 설정이 필요하다

node와 redis 두 개의 컨테이너 간 연동을 위해 다음과 같이 docker-compose.yaml 파일을 작성할 수 있다.

version: "3"
services:
  redis-server:
    image: "redis"
  node-app:
    build: .
    ports:
      - "5000:8080"

이후 docker-compose up 명령을 통해 yaml 파일에 명시된 컨테이너를 동시에 실행시킬 수 있다.

빌드와 함께 실행하고 싶다면 docker-compose up --build 명령어를 사용하면 된다.

종료시키고 싶다면 docker-compose down 명령어를 사용하고, 백그라운드에서 실행을 원하면 -d 옵션을 붙여준다.

728x90

' > Docker' 카테고리의 다른 글

[Docker]Travis CI, EB를 이용한 배포  (0) 2023.07.25
[Docker]개발 환경 vs. 운영 환경  (0) 2023.07.24
[Docker]이미지  (0) 2023.07.23
[Docker]기본 개념  (0) 2023.07.21

댓글