docker(도커) 및 쿠버네티스

docker-compose(명령어, yaml파일구조)

데이터왕 2023. 12. 29. 00:49

docker-compose란

  • 여러 도커 컨테이너를 정의하고 컨테이너들 간의 환경설정, 의존성, 포트매핑, 네트워크, 실행 등을 관리하는 도구
  • 이러한 설정 파일은 YAML 형식으로 작성되며, 컨테이너, 네트워크, 볼륨 등과 관련된 설정을 포함
    docker-compose.yml ,   docker-compose.yaml
  • 개별 컨테이너를 따로 관리하는거보다 효율적이다.
  • 개발 환경 (dev), 테스트 환경 (test), 운영 환경 (prod) 등 다양한 버전으로 만든다.

docker-compose 관련명령어

  • docker-compose up: 설정된 서비스들을 시작합니다. ( build->create->start 3단계 다있음)
  • docker-compose down: 실행 중인 서비스들을 중지하고 관련된 리소스를 삭제합니다. (stop +rm : 멈추고 삭제)
  • docker-compose ps: 현재 실행 중인 서비스들의 상태를 표시합니다.
  • docker-compose logs: 서비스들의 로그를 표시합니다.
  • docker-compose build : 정의된 서비스들의 이미지를 빌드
  • docker-compose pull : 정의된 서비스들에 대한 이미지를 Docker Hub 또는 지정된 레지스트리에서 가져옴
  • docker-compose start : 명령어는 정의된 서비스들을 시작
  • docker-compose stop : 실행 중인 서비스들을 중지
  • docker-compose rm : 정의된 서비스들과 관련된 컨테이너, 네트워크, 볼륨 등을 삭제합니다. -v 옵션을 추가하면 관련된 볼륨도 함께 삭제
  • docker-compose push : docker hub로 이미지들을 올림
  • docker compose = docker-compose
  • docker-compose.yaml = docker-compose.yml (둘다 존재하면 에러 발생하니 주의)

+ 만약 다른 이름의 파일 사용하고 싶으면 docker-compose -f docker-compose.mac.yml up (-f 사용)
보통 이렇게 쓰임
docker-compose.prod.yml (프로덕션용) , docker-compose.dev.yml (개발용) , docker-compose.test.yml (테스트용)
프로덕션 : 실제운영환경/ 개발 :개발하고 디버깅 / 테스트 : 버그 찾아내고 테스트

 

docker-compose 설치

  • docker desktop의 일부로 자동 설치됨
  • docker engine 실행하고 터미널에서 버전 확인
  • docker-compose --version

docker-compose.yml 파일구성

  1. **`services`:**
       - `services` 섹션은 여러 개의 컨테이너 서비스를 정의합니다. 각 서비스는 독립적으로 실행되는 컨테이너를 나타냅니다. 각 서비스에는 사용할 도커 이미지, 포트 매핑, 환경 변수 등을 설정할 수 있습니다.

       services:
         web:
           image: nginx:latest
           ports:
             - "8080:80"
         database:
           image: postgres:latest
           environment:
             POSTGRES_PASSWORD: example

  2.  **`volumes`:**
       - `volumes` 섹션은 볼륨을 정의합니다. 볼륨은 컨테이너 간 데이터를 공유하거나 데이터를 영속적으로 저장하는 데 사용됩니다. 여러 서비스 간에 데이터를 공유하거나 컨테이너 내부의 데이터를 호스트와 분리하는 데 활용됨

       volumes:
         data-volume:

       볼륨은 `services` 섹션에서 각 서비스의 `volumes` 옵션을 통해 연결할 수 있습니다.

  3.  **`networks`:**
       - `networks` 섹션은 네트워크를 정의합니다. 여러 컨테이너 간의 통신을 위한 네트워크를 설정할 수 있습니다. 기본적으로 `docker-compose`는 기본 네트워크를 생성하며, 추가적으로 정의된 네트워크를 사용할 수 있습니다.

       networks:
         frontend:
         backend:

       네트워크는 `services` 섹션에서 각 서비스의 `networks` 옵션을 통해 연결할 수 있습니다. 이를 통해 서비스 간에 특정 네트워크를 통한 통신이 가능해집니다.

    이러한 섹션들을 조합하여 `docker-compose.yml` 파일을 작성하면 여러 개의 컨테이너로 구성된 멀티-컨테이너 애플리케이션을 쉽게 정의하고 실행할 수 있습니다.

+여기다 서버를 각각 따로 구성하려면 networks도 추가

 

docker 관련 명령 동작 예시

  • docker images : 이미지들을 출력.
    'docker-compose build' 시 폴더 이름(example/voting/app) 이 앞에 첨자로 붙어 출력된다.
    +다른방법으로 빌드 됐거나, 도커 허브에서 온경우 첨자가 붙지 않는다.
  • docker-compose images : 컨테이너들을 출력
  • docker-compose push : docker hub로 이미지들을 올림(허브에서 온애들 안올림)

  • docker-compose ls (그룹별로 보여줌)
  • docker-compose ps(그룹내 각각 보여줌)

 

  • docker network ls (bridge, host, none)

+Bridge 모드는 Docker의 기본 네트워크 모드이며, 컨테이너를 위한 가상 브리지를 생성합니다. 이 가상 브리지는 호스트 시스템과 컨테이너 간의 통신을 도와줍니다.
   - **특징:**
     - 컨테이너 간 통신을 지원합니다.
     - 각 컨테이너는 가상 브리지에 연결되어 호스트와 격리됩니다.
   docker run --network=bridge my-container

Host 모드는 호스트의 네트워크 네임스페이스를 공유하는 방식으로 동작합니다. 컨테이너는 호스트의 네트워크 인터페이스를 직접 사용하게 됩니다.
   - **특징:**
     - 호스트와 동일한 네트워크 네임스페이스를 공유하므로 호스트와 동일한 IP 주소를 사용합니다.
     - 호스트와 완전히 통합되어 있는데, 이는 네트워크 격리를 해제하는 효과가 있습니다.
   docker run --network=host my-container

None 모드는 네트워크를 사용하지 않는 방식으로, 컨테이너는 네트워크를 가지지 않습니다. 따라서 외부와의 통신이 차단
   - **특징:**
     - 외부와 통신이 필요하지 않은 경우에 사용됩니다.
     - 컨테이너는 외부 네트워크와 격리되며, 내부에서만 동작합니다.
   docker run --network=none my-container