ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker Compose
    Container 2016. 3. 7. 09:00
    반응형
    Docker Compose를 이용하면 하나의 yaml 형식의 설정파일에 여러개의 컨테이너를 정의하고 실행할 수 있다. 명령 한번으로 컨테이너 여러개를 띄워서 애플리케이션을 올릴 수 있다. 주로 개발환경, 스테이징 서버, CI(Continuous Integration)에서 편하게 이용할 수 있다.
     
    설치하기
    Compose를 설치하는 건 간단하다. 우선 Docker가 설치되어 있어야 한다. 그 다음에는 아래 명령을 입력하면 된다.
    curl -L https://github.com/docker/compose/releases/download/1.3.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
     
    Compose 사용하기
    Compose를 사용하는건 간단하다.
    우선, 애플리케이션에서 필요한 환경을 Dockerfile에 정의한다. 그 다음 앱에서 필요한 각 서비스들을 docker-compose.yml에 정의한다. 이 파일을 이용해서 각 서비스들이 독립된 환경에서 함께 실행될 수 있다. 그리고 docker-compose up을 하면 Compose가 알아서 전체 앱에 필요한 서비스들을 실행한다.
    다음과 같은 예제 docker-compose.yml을 작성한 후docker-compose up 명령을 입력하면 자동으로 2개의 컨테이너가 실행되는걸 확인할 수 있다.
    web:
      build: .
      ports:
       - "5000:5000"
      volumes:
       - .:/code
      links:
       - redis
    redis:
      image: redis
     
     
     
     
     
    docker-compose.yml 파일 구조
    docker-compose.yml 파일에는 imagebuild 지시자가 반드시 있어야 한다.
     
     
    image
    사용할 이미지의 태그나 ID를 명시한다. 로컬에 그 이미지가 없으면 원격저장소에서 pull해서 가져온다.
     
    build
    Dockerfile이 있는 디렉토리의 경로. compose가 이 경로에 있는 Dockerfile을 빌드해서 사용한다.
     
    dockerfile
    기본 Dockerfile이 아니라 여기에 지정된 파일명을 Dockerfile로 인식해서 빌드해서 사용한다.
     
    command
    기본 command를 여기에 지정된 명령어로 오버라이드해서 사용한다.
     
    links
    컨테이너를 다른 서비스들과 연결한다. 연결하려는 서비스 이름을 쓰거나 별칭을 함께 쓰면 된다. 그러면 이 컨테이너의 /etc/hosts 파일에 그 내용이 추가되어서 컨테이너에서 다른 컨테이너들에 접근할 수 있게 된다.
    links:
     - db
     - db:database
     - redis
     
    위 처럼 설정을 하게 되면 아래와 같이 /etc/hosts 파일의 내용이 생성된다.
    172.17.2.186  db
    172.17.2.186  database
    172.17.2.187  redis
     
    두 번째 db:database 설정은 dbip 주소를 database라는 이름으로 설정한걸 볼 수 있다.
     
    external_links
    links와 비슷한 방식으로 설정하지만 compose내부의 컨테이너가 아니라, compose 외부에 있는 서비스와의 연결을 위해 필요하다.
     
    extra_hosts
    컨테이너의 /etc/hosts에 외부 호스트정보를 추가한다.
    extra_hosts:
     - "somehost:162.242.195.82"
     - "otherhost:50.31.209.229"
     
    이런식으로 선언하면 컨테이너의 /etc/hosts에 아래처럼 내용이 추가된다.
    162.242.195.82  somehost
    50.31.209.229   otherhost
     
    ports
    호스트포트:컨테이너포트의 형식으로 컨테이너에서 사용할 포트를 지정할 수 있다. 호스트 포트를 생략하고 컨테이너 포트만 지정할수도 있는데, 그 경우에 호스트 포트는 랜덤으로 생성되서 할당된다. 컨테이너 포트를 60보다 작게 설정하면 에러가 발생할 수 있다. YAMLxx:yy형식을 60진법으로 처리하기 때문이다. 그래서 포트 매핑은 문자열로 선언하는 것이 좋다.
     
    expose
    호스트에는 노출하지 않고 연결된 서비스끼리만 접근가능한 포트를 명시한다. 여기에 있는 포트로는 호스트에서는 접근할 수 없다.
     
    volumes
    현재 디렉토리를 볼륨으로 마운트할때 컨테이너에서 사용할 경로를 입력한다. 호스트:컨테이너 형식으로 호스트의 마운트할 경로를 지정할수도 있고 호스트:컨테이너:접근모드 형식으로 컨테이너에 마운트된 디렉토리의 접근권한을 설정할 수도 있다.
    volumes:
     - /var/lib/mysql
     - ./cache:/tmp/cache
     - ~/configs:/etc/configs/:ro
     
    volumes_from
    다른 서비스나 컨테이너의 전체 볼륨을 마운트한다.
    volumes_from:
     - service_name
     - container_name
     
    environment
    배열이나 사전형식으로 환경변수를 설정할 수 있다.
    environment:
      RACK_ENV: development
      SESSION_SECRET:
     
    environment:
      - RACK_ENV=development
      - SESSION_SECRET
     
    env_file
    환경변수를 파일에서 추가할 수 있다. 값 하나를 쓸수도 있고 여러개를 사용할 수도 있다. environment 에 사용된 값들이 여기 있는 파일들에 있는 값들에 우선한다.
    env_file: .env
     
    env_file:
      - ./common.env
      - ./apps/web.env
      - /opt/secrets.env
     
    이런 식으로 환경변수가 있는 파일들을 명시할 수 있고, 환경변수 파일 내용은 변수=값 형식으로 되어 있으면 된다. 주석은 #을 이용해서 처리할 수 있다. 아래와 같다.
    # Set Rails/Rack environment
    RACK_ENV=development
     
     
    extends
    다른 서비스를 현재 파일에서 가져와서 확장해서 사용한다.
    아래처럼 common.ymldevelopment.yml 2개의 파일이 있다고 하자.
    common.yml
     
    webapp:
      build: ./webapp
      environment:
        - DEBUG=false
        - SEND_EMAILS=false
    development.yml
     
    web:
      extends:
        file: common.yml
        service: webapp
      ports:
        - "8000:8000"
      links:
        - db
      environment:
        - DEBUG=true
    db:
      image: postgres
     
    development.yml에서 common.yml에 정의된 내용을 가져와서 사용한다. common.yml에 설정된 내용에 추가로 필요한 portlink정보를 설정하고, DEBUG같은 environment 정보를 오버라이드해서 사용한다.
     
    labels
    컨테이너에 docker label을 이용해서 메타데이터를 추가한다. 배열형식이나 사전형식을 쓸 수 있다. 다른 소프트웨어와의 혼돈을 방지하기 위해서 DNS 표기를 역으로 하는 방식이 추천된다.
    labels:
      com.example.description: "Accounting webapp"
      com.example.department: "Finance"
      com.example.label-with-empty-value: ""
     
    labels:
      - "com.example.description=Accounting webapp"
      - "com.example.department=Finance"
      - "com.example.label-with-empty-value"
     
     
    container_name
    컨테이너에서 사용할 이름을 지정한다.
    container_name: my-web-container
     
     
    log driver
    서비스의 컨테이너에서 사용할 로깅 드라이버를 명시한다. 현재는 json-file, syslog, none이렇게 3가지를 사용할 수 있다. 기본값은 json-file이다. log_opt을 이용해서 로깅 드라이버에 옵션을 줄 수도 있다.
    log_driver: "syslog"
    log_opt:
      address: "tcp://192.168.0.42:123"
     
    net
    네트워킹 모드를 지정한다. docker–net옵션과 같다.
     
    pid
    pid: "host"
    PID 모드를 호스트 PID모드로 설정한다. 이렇게 되면 컨테이너와 호스트 운영체제가 같은 PID 주소 공간을 공유하게 된다. 이 옵션을 통하면 컨테이너들이 서로 접근 가능하게 된다.
     
    dns
    컨테이너가 사용할 커스텀 DNS 서버를 설정한다.
    dns: 8.8.8.8
    dns:
      - 8.8.8.8
      - 9.9.9.9
     
    cap_add, cap_drop
    컨테이너의 시스템에 관한 권한을 추가하거나 삭제한다.
    cap_add:
      - ALL
     
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
     
     
    dns_search
    dns 검색 도메인을 설정한다.
    dns_search: example.com
    dns_search:
     
    devices
    디바이스 매핑 목록. docker  -- device 옵션과 같다.
    devices:
      - "/dev/ttyUSB0:/dev/ttyUSB0"
     
    security_opt
    각 컨테이너의 기본 label을 오버라이드 한다.
    security_opt:
        - label:user:USER
        - label:role:ROLE
     
    working_dir, entrypoint, user, hostname, domainname, mac_address, mem_limit, memswap_limit, privileged, restart, stdin_open, tty, cpu_shares, cpuset, read_only, volume_driver
    각 명령들이 docker run을 실행할때의 동일한 옵션에 대응한다.
     
     
    참고자료
     
    반응형

    'Container' 카테고리의 다른 글

    Docker Machine  (0) 2016.03.11
    Docker Kitematic  (0) 2016.03.09
    Docker 이미지(Dockerfile)  (2) 2016.03.04
    Docker 사용하기  (0) 2016.03.02
    Docker 설치하기  (0) 2016.03.02

    댓글

Designed by Tistory.