프로그래밍 기초

Docker Compose

hs-archive 2023. 5. 23. 16:30

도커 컴포즈

도커는 애플리케이션을 격리된 환경인 "컨테이너" 안에 패키징하여 실행하는 기술입니다. 여러 개의 "컨테이너"를 함께 실행하고 관리하는 것은 번거롭고 복잡합니다. 이때 Docker Compose를 사용하면 여러 개의 컨테이너를 하나의 그룹으로 묶어 관리할 수 있습니다.

 

간단하게 말하면, Docker Compose는 여러 개의 "컨테이너"로 구성된 애플리케이션을 쉽게 실행하고 관리하기 위한 도구입니다. Docker Compose를 사용하여 개발자는 복잡한 컨테이너 관리 작업을 간소화하고 여러 개의 컨테이너로 구성된 애플리케이션을 다른 환경으로 쉽게 이동하거나 공유할 수 있어 개발과 배포의 효율성을 높일 수 있습니다.

 

mysql과 node 서버를 각 컨테이너에 구동시키는 Docker compose 파일은 아래처럼 작성할 수 있습니다.

 

# Docker Compose 버전입니다.
version: '3.8'

# 서비스는 동일한 컨테이너 이미지(및 구성)를
# 한 번 이상 실행하여 플랫폼에서 구현되는 추상적인 개념입니다.
services:
  db:
    # DB가 실행되는 컨테이너의 이름을 지정합니다.
    container_name: msg_db_container
    # mysql 이미지입니다.
    image: mysql:8.0
    # .env 파일을 가져옵니다.
    env_file:
      - .env
    # 가져온 .env 파일에 적혀져 있는 값으로 환경 설정을 합니다.
    environment:
      MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD}
      MYSQL_DATABASE: ${DATABASE_NAME}
    # <호스트 포트 번호>:<컨테이너 포트 번호>로 바인딩합니다.
    # <호스트 포트>로 들어온 요청은 <컨테이너 포트>로 전달됩니다.
    ports:
      - '3306:3306'
    # "컨테이너"는 격리된 환경에서 돌아가기 때문에 기본적으로 다른 컨테이너와의 통신이 불가능합니다.
    # 하지만 여러 개의 컨테이너를 하나의 Docker 네트워크(network)에 연결하면 서로 통신이 가능해집니다.
    # db는 msg와 통신해야 하므로 같은 네트워크로 구성합니다.
    networks:
      - msg_network
    # 도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 됩니다.
    # 컨테이너에서 생성된 정보는 이미지 위에 container layer라는 곳에 기록이 되는데,
    # 컨테이너가 삭제되면 해당 정보도 전부 삭제됩니다.
    # 볼륨은 Docker 컨테이너에서 생성되고 사용되는 데이터를 "유지"하기 위해 사용하는 매커니즘입니다.
    # 볼륨은 컨테이너 외부에 존재하여 컨테이너가 삭제되더라도 그 정보가 사라지지 않습니다.
    volumes:
      - db_data:/var/lib/mysql

  msg:
    container_name: msg_container
    # 이미지를 다른데서 가져오는 것이 아닌
    # ./apps/msg/dockerfile에 적힌 대로 image를 만든 후
    # 해당 이미지를 사용합니다.
    build:
      context: .
      dockerfile: ./apps/msg/dockerfile
    env_file:
      - .env
    ports:
      - '3000:3000'
    networks:
      - msg_network
    # 위에 있는 db라는 서비스가 실행된 후 msg를 실행합니다.
    depends_on:
      - db
    volumes:
      - msg_data:/app
    # 커맨드 입니다.
    command: npm run start:msg:dev

volumes:
  db_data:
  msg_data:


# 네트워크는 서비스가 서로 통신할 수 있게 해주는 계층입니다.
networks:
  msg_network:

 

.env 파일은 아래와 같습니다.

DATABASE_HOST="localhost"
DATABASE_PORT="3306"
DATABASE_USERNAME="root"
DATABASE_PASSWORD="test"
DATABASE_NAME="msg"
DATABASE_SYNCHRONIZE='true'
DATABASE_LOGGING='true'

 

하지만 위처럼 DATABASE_HOST를 "localhost"로 작성하면 아래 오류가 발생합니다.

docker Error: connect ECONNREFUSED 127.0.0.1:3306

 

이는 node 컨테이너에서의 localhost는 자기 자신(node 컨테이너)을 지칭하는 것이기 때문입니다. node 컨테이너의 3306 포트는 db 컨테이너와 연결되어 있지 않기 때문에 당연히 오류가 날 수밖에 없습니다. 따라서, "localhost" 대신 db 컨테이너의 IP 주소를 직접 넣거나 해당 컨테이너의 이름으로 지정한 "msg_db_container"를 넣어줘야 합니다. 이렇게 하면 오류가 해결됩니다.

 

 

 

 

 


 

https://donochi.tistory.com/208

 

[삽질포함] Docker 따라하기 #4

지금까지는 Docker 로 하나의 Container 를 돌리는 실습을 해 보았습니다. 이번에는 Docker Compese 라는 툴을 이용하여, 두개 이상의 Container 를 구동하여 서비스를 만드는 연습을 해 보겠습니다. 최종 목

donochi.tistory.com

https://www.daleseo.com/docker-volumes-bind-mounts/

 

Docker 컨테이너에 데이터 저장 (볼륨/바인드 마운트)

Engineering Blog by Dale Seo

www.daleseo.com

https://www.daleseo.com/docker-networks/

 

Docker 네트워크 사용법

Engineering Blog by Dale Seo

www.daleseo.com

https://velog.io/@ckstn0777/%EB%8F%84%EC%BB%A4-%EB%B3%BC%EB%A5%A8

 

5장. 도커 볼륨 이용하기

이 포스팅은 위키북스의 시작하세요! 도커/쿠버네티스 를 보고 공부한 내용을 바탕으로 하고 있습니다. (문제가 된다면 비공개 처리하겠습니다😂😂)도커 이미지로 컨테이너를 생성하면 이미

velog.io

'프로그래밍 기초' 카테고리의 다른 글

콘텐츠 보안 정책(Content Security Policy, CSP)  (0) 2023.06.03
윈도 시스템, X 윈도 시스템, Xvfb  (0) 2023.05.31
깃허브 액션  (2) 2023.05.15
CI/CD  (2) 2023.05.14
클린 아키텍처 번역  (0) 2023.03.28