main-logo

Docker Volume과 Compose

Docker Volume과 Compose의 기초

profile
나만애옹이없어
2024년 11월 21일 · 0 분 소요

들어가며

Docker의 중요한 개념 중 하나인 Volume과 컨테이너 관리에 이점을 주는 Compose에 대해서 알아봅니다.

 

Docker Volume

Docker 컨테이너는 뛰어난 이식성을 가지고 있지만 컨테이너 내부의 데이터 영속성까지 보장해 주진 않습니다.

개발자 A는 진행 중인 프로젝트를 Docker 이미지로 생성했습니다. 추후 프로젝트가 더 진행되어 새로운 버전을 릴리스하게 되었습니다. 이때 Docker 이미지는 업데이트되지 않고 새롭게 이미지를 생성해야 합니다. 실행 중인 컨테이너는 새로운 이미지를 기준으로 다시 실행되어야 하기에 기존 컨테이너는 삭제하고 새롭게 생성된 이미지를 기준으로 다시 컨테이너를 실행했더니 기존 컨테이너에 저장되어 있던 데이터들이 모두 삭제되었습니다.

이러한 경우를 방지하기 위해서는 Docker Volume이라는 개념을 활용해야 합니다.


Docker Volume이 데이터를 유지하는 방법

docker run -v [호스트 컴퓨터의 절대 경로]:[컨테이너의 디렉터리 절대 경로]

run 명령어를 입력할 때 -v 옵션을 넣게 되면 호스트 컴퓨터의 저장 공간을 Docker 컨테이너에서 빌려와 사용할 수 있게 됩니다.

 

Volume 연결 시 주의할 점

호스트 컴퓨터의 디렉터리가 이미 존재하는 경우, 호스트 컴퓨터의 디렉터리의 내용이 컨테이너 디렉터리의 내용을 덮어씌우는 경우가 발생합니다. 이 경우, 의도대로 정상 작동하지 않을 수 있으니 호스트 컴퓨터의 디렉터리를 미리 생성하지 않고 명령어 입력 시 자동 생성되도록 하여 구성하도록 합니다.

 

 

Docker Compose

Docker를 실행할 때마다 복잡하고 긴 명령어를 매번 입력하는 것은 매우 비효율적입니다. Compose를 활용하여 긴 명령어를 간편하게 실행하고 또한 여러 개의 컨테이너를 동시에 편하게 관리할 수 있습니다. Dockerfile을 생성한 동일한 경로에 compose.yml 파일을 생성하여 시작할 수 있습니다.

 

Compose의 기본 문법

기본적으로 yml 문법으로 작성하게 됩니다.

services:
  my-web-server:
    container_name: my-web-server
    image: nginx
    ports:
      - 80:80
			
  my-cache-server:
    container_name: my-server
    image: redis
    ports:
      - 6379:6379
  • services : Compose에서는 service라는 항목으로 각 컨테이너들을 관리합니다. 즉 Compose에서 관리되는 각 컨테이너들의 묶음이라고 볼 수 있습니다. 다음 위계에서는 포함될 컨테이너들의 명칭을 입력합니다. 이는 컨테이너 이름과는 별개로 Compose 자체에서 컨테이너들 구분을 위해서 붙이는 명칭이라고 이해하면 됩니다.
  • container_name : 컨테이너 이름입니다.
  • image : 이 컨테이너가 사용할 이미지를 정합니다.
  • ports : 매핑할 포트 정보입니다.

 

가장 기본적인 명령어들 외에도 여러 가지 명령어가 있는데 Docker CLI 명령어들과 매칭됩니다. 예를 들어, Docker Volume의 경우…

  • CLI
    docker volume create my-volume
    docker run -v my-volume:/data my-container
  • compose.yml
    services:
      my-container:
        image: nginx
        volumes:
          - my-volume:/data
    
    volumes:
      my-volume:

와 같은 케이스로 볼 수 있습니다.

 

Compose 실행과 중지

docker compose up -d --build

docker compose up 명령어로 compose.yml 파일에 정의된 대로 컨테이너가 실행됩니다. 백그라운드로 실행하려면 -d 옵션을 추가하고 매 실행마다 새롭게 이미지를 빌드 해야 한다면 --build 옵션도 추가합니다.

 

docker compose down

docker compose down 명령어는 실행 중인 모든 컨테이너를 중지 및 삭제합니다.

 

docker compose ps

docker compose ps compose를 통하여 실행된 모든 컨테이너들의 목록을 볼 수 있습니다.

 

다중 컨테이너들끼리의 통신

설정한 컨테이너의 명칭은 각 컨테이너들의 ip 주소로 사용할 수 있습니다. 각 컨테이너들 내부에서 다른 컨테이너로의 주소로 연결이 필요할 때 해당 컨테이너의 이름을 주소 대신 사용하여 연결합니다.

또한, 명시적인 네트워크 정의를 통해서도 가능합니다. AI에게 React 프런트엔드 환경과 Node 백엔드 환경 간의 API 통신을 가정한 샘플 코드를 요청했습니다. 늘 그렇듯 AI의 코드들은 검증이 필요하지만 로직 검증이 필요한 질문은 아니기에 compose.yml 파일의 구성에 대해 훑어보기에는 적합한 것 같습니다.

services:
  frontend:
    build:
      context: ./frontend
    image: react-frontend
    ports:
      - "3000:3000" # Expose the React app on port 3000
    environment:
      - REACT_APP_API_URL=http://backend:4000 # Backend API URL
    networks:
      - my-network

  backend:
    build:
      context: ./backend
    image: node-backend
    ports:
      - "4000:4000" # Expose the Node.js app on port 4000
    networks:
      - my-network

networks:
  my-network:
    driver: bridge

 

마치며

이렇게 Docker Volume과 Compose의 기초 이론과 사용법에 대해 확인해 보았습니다. 기회가 된다면 다음 아티클에서는 프런트엔드 프로젝트를 Docker 이미지로 생성하여 AWS에 배포하는 방법에 대해 다뤄보겠습니다.