ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [docker] docker compose 시작하기
    인프라/docker 2021. 3. 31. 16:43

    docker compose 란

     

    도커 컴포즈는 컨테이너 여럿을 띄우는 도커 애플리케이션을 정의하고 실행하는 도구(Tool for defining and running multi-container Docker applications) 이다.

    컨테이너 실행에 필요한 옵션을 docker-compose.yml이라는 파일에 적어둘 수 있고, 컨테이너 간 의존성도 관리할 수 있어서 좋다.

     

    도커와 도커 컴포즈를 비교하면 다음과 같다.

    • Dockerfile vs. Dockerfile-dev: 서버 구성을 문서화한 것(=클래스 선언이 들어 있는 파일)
    • docker build vs. docker-compose build: 도커 이미지 만들기(=클래스 선언을 애플리케이션에 로드)
    • docker run의 옵션들 vs. docker-compose.yml: 이미지에 붙이는 장식들(=인스턴스의 변수들)
    • docker run vs. docker-compose up: 장식 붙은 이미지를 실제로 실행(=인스턴스 생성)

    간단히 말해 docker run 으로 실행하면 매번 복잡한 옵션 및 명령어들을 여러개 적어두고 실행해야 하는데, 

    docker-compose 는 docker-compose.yml 에 사용하고자 하는 도커이미지 및 옵션 값들을 작성해 놓고 docker-compse up 이라는 명령어로 일관적으로 실행할 수 있다.

    하나씩 실행해야 하는 수고로움이 덜어진다.

     

    설치

    docker-compose version 을 치고 조회가 되면 설치할 필요가 없다.

     

    없다면 설치하면 된다.

    docker-compose 설치는 매우매우 쉽다. 아래를 따라하면 된다.

    출처는 https://docs.docker.com/compose/install/

    윈도우는

    curl -L https://github.com/docker/compose/releases/download/1.6.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    
    chmod +x /usr/local/bin/docker-compose
    
    docker-compose --version

     

    docker-compose 속성

    version

    version: '2.1'

    docker run에서는 없었던 부분입니다. docker-compose.yml 파일의 제일 윗부분에는 파일 규격 버전을 적는다. 파일의 규격에 따라 지원하는 옵션이 달라지며, 최근에 "3.1"이 등장하긴 했지만 보통은 "2"나 "2.1"을 사용해도 충분.

    services

    services:

    이 항목 밑에 실행하려는 서비스들을 정의한다. 서비스란, 앱 컨테이너나 postgres 컨테이너 각각의 묶음이다.

    services 하위

    서비스의 이름

    image

    image: postgres:9.6.1

    db 서비스에서 사용할 도커 이미지를 적는다.

    volumes

    volumes: - ./docker/data:/var/lib/postgresql/data

    docker run으로 앱 컨테이너를 실행할 때 --volume 옵션을 사용하여 데이터베이스의 데이터를 로컬 컴퓨터에 저장했던 부분과 같다.

    다만 docker-compose.yml의 volumes에는 상대 경로를 지정할 수 있다는 점이 다르다.

    environment

    environment: - POSTGRES_DB=sampledb - POSTGRES_USER=sampleuser - POSTGRES_PASSWORD=samplesecret - POSTGRES_INITDB_ARGS=--encoding=UTF-8

    docker run에서 -e 옵션에 적는 내용이다. 마지막의 POSTGRES_INITDB_ARGS 부분이 추가되었는데, 데이터베이스 서버의 인코딩을 설정하기 위함이다.

    healthcheck

    healthcheck: test: "pg_isready -h localhost -p 5432 -q -U postgres" interval: 3s timeout: 1s retries: 10

    postgres 서비스가 제대로 실행될 뿐만 아니라 데이터베이스에 접근할 수 있는지도 파악을 해야 합니다.

    healthcheck는 바로 이것을 제어할 수 있습니다. 검사에 사용할 명령(test)을 3초 간격(interval)으로 열 번 시도(retries)하며, 각 시도에서 타임아웃은 1초(timeout)로 지정하였다.

    여기서 사용한 pg_isready 명령은 데이터베이스 서버에 접근할 수 있는지를 파악. 

     

    service 하위

    앱 서비스의 이름으로 지정자 마음대로 지으면 된다.

     

    build

    build: context: . dockerfile: ./compose/django/Dockerfile-dev

    db 서비스와 달리 앱 서비스는 도커 이미지를 빌드할 일이 잦기 때문에, 특정 이미지 대신 build 옵션을 추가한다.

    context는 docker build 명령을 실행할 디렉터리 경로라고 보면 된다.

    dockerfile은 도커 이미지를 빌드하는 데 사용할 Dockerfile을 지정하면 된다. 

    environment

    environment: - DJANGO_DEBUG=True - DJANGO_DB_HOST=db - DJANGO_DB_PORT=5432 - DJANGO_DB_NAME=sampledb - DJANGO_DB_USERNAME=sampleuser - DJANGO_DB_PASSWORD=samplesecret

    환경 변수는 그냥 docker run을 할 때보다 좀더 자세하게 적었습니다. 각 값은 Django 설정 파일(djangosample/settings.py)에서 사용합니다.

    ports

    ports: - "8000:8000"

    도커 컴포즈로 서비스를 실행하면 기본적으로 가상의 네트워크가 하나 만들어지고, 네트워크 외부의 접근이 막힙니다. (도커 컨테이너가 그렇듯이요.) 따라서 외부에서 접근할 수 있는 포트를 지정해주어야 한다. 여기서는 Django 개발 서버의 기본 포트는 8000을 지정하였습니다.

    depends_on

    depends_on: db: condition: service_healthy

    서비스가 하나 이상일 때, 실행 의존성을 지정할 수 있다. 여기서 지정한 내용은, db 서비스가 실행된 후에 django 서비스를 실행하겠다는 의미. contidion 뒤에는 서비스 시작(service_started)이나 서비스 헬스체크 성공(service_healthy)을 지정할 수 있다.

    db 서비스의 healthcheck 부분과 여기서의 service_healthy 부분이 서로 맞물리면, db 서비스에서 데이터베이스 서버 접속이 가능해진 순간 이후에야, django 서비스가 시작한다.

    depend_on에서 condition을 지정하는 방식이 도커 컴포즈 파일 규격 3.0과 3.1에서는 제대로 작동하지 않는다고 합니다.

    links

    links: - db

    docker run에서 --link 옵션에서 지정했던 내용입니다. 앱 컨테이너 안에서 db 서비스를 db라는 이름으로 참조할 수 있다.

    command

    command: /start-dev.sh

    docker run으로 앱 컨테이너를 실행할 때 가장 마지막에 적었던 ./manage.py runserver 0:8000을 대신할 셀 스크립트 파일을 하나 만들었습니다. 다음은 start-dev.sh의 내용이다.

    #!/bin/sh python manage.py migrate python manage.py runserver 0:8000

    volumes

    volumes: - ./:/app/

    docker run으로 앱 컨테이너를 실행할 때 프로젝트 루트 디렉터리를 컨테이너 안에 연결했던 부분과 같습니다.

     

    예시

    version: "3.3" # 파일 규격 버전
    services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
      db: # 서비스 명
        image: mysql:5.7 # 사용할 이미지\
        # restart: always
        container_name: jun-mysql # 컨테이너 이름 설정
        ports:
          - "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
        environment: # -e 옵션
          MYSQL_ROOT_PASSWORD: '비번'  # MYSQL 패스워드 설정 옵션
          MYSQL_USER: '계정'
          MYSQL_PASSWORD: '비번'
        volumes:
          - /Users/유저명/폴더명:/var/lib/mysql  
        # command: # 명령어 실행
          # - mysqld --default-authentication-plugin=mysql_native_password
          # - --character-set-server=utf8mb4
          # - --collation-server=utf8mb4_unicode_ci
      mongo:
        image: mongo
        # restart: always
        ports:
          - 9017:27017
        environment:
          MONGO_INITDB_ROOT_USERNAME: 유저계정
          MONGO_INITDB_ROOT_PASSWORD: 비번  

    예시2

    version: '2.1'
    
    # 변경 부분!
    volumes:
      django_sample_db_dev: {}
    
    services:
      db:
        image: postgres:9.6.1
        volumes:
          # 여기도 변경 부분!
          - django_sample_db_dev:/var/lib/postgresql/data
        environment:
          - POSTGRES_DB=sampledb
          - POSTGRES_USER=sampleuser
          - POSTGRES_PASSWORD=samplesecret
          - POSTGRES_INITDB_ARGS=--encoding=UTF-8
        healthcheck:
          test: "pg_isready -h localhost -p 5432 -U postgres"
          interval: 3s
          timeout: 1s
          retries: 10
    
      django:
        build:
          context: .
          dockerfile: ./compose/django/Dockerfile-dev
        environment:
          - DJANGO_DEBUG=True
          - DJANGO_DB_HOST=db
          - DJANGO_DB_PORT=5432
          - DJANGO_DB_NAME=sampledb
          - DJANGO_DB_USERNAME=sampleuser
          - DJANGO_DB_PASSWORD=samplesecret
          - DJANGO_SECRET_KEY=dev_secret_key
        ports:
          - "8000:8000"
        depends_on:
          db:
            condition: service_healthy
        links:
          - db
        command: /start-dev.sh
        volumes:
          # 마지막으로 여기도!
          - ./manage.py:/app/manage.py
          - ./requirements.txt:/app/requirements.txt
          - ./requirements-dev.txt:/app/requirements-dev.txt
          - ./djangosample:/app/djangosample

    docker-compose 실행하기

    https://docs.docker.com/compose/wordpress/

    에 워드프레스 docker-compose.yml 파일이랑 실행방법 있음

     

    yml 파일 설치된 dir 에서 실행

    docker-compose up -d ##시작
    docker-compose down -d ##내리기

     

     

    참고문헌

    > http://raccoonyy.github.io/docker-usages-for-dev-environment-setup/ --도커 docs

    > docs.microsoft.com/ko-kr/visualstudio/docker/tutorials/use-docker-compose - ms에서 만든 문서 - build 도 나옴

    반응형

    댓글

Designed by Tistory.