-
Docker ComposeContainer 2016. 3. 7. 09:00Docker 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-composechmod +x /usr/local/bin/docker-composeCompose 사용하기Compose를 사용하는건 간단하다.우선, 애플리케이션에서 필요한 환경을 Dockerfile에 정의한다. 그 다음 앱에서 필요한 각 서비스들을 docker-compose.yml에 정의한다. 이 파일을 이용해서 각 서비스들이 독립된 환경에서 함께 실행될 수 있다. 그리고 docker-compose up을 하면 Compose가 알아서 전체 앱에 필요한 서비스들을 실행한다.다음과 같은 예제 docker-compose.yml을 작성한 후docker-compose up 명령을 입력하면 자동으로 2개의 컨테이너가 실행되는걸 확인할 수 있다.web:build: .ports:- "5000:5000"volumes:- .:/codelinks:- redisredis:image: redisdocker-compose.yml 파일 구조docker-compose.yml 파일에는 image나 build 지시자가 반드시 있어야 한다.image사용할 이미지의 태그나 ID를 명시한다. 로컬에 그 이미지가 없으면 원격저장소에서 pull해서 가져온다.buildDockerfile이 있는 디렉토리의 경로. compose가 이 경로에 있는 Dockerfile을 빌드해서 사용한다.dockerfile기본 Dockerfile이 아니라 여기에 지정된 파일명을 Dockerfile로 인식해서 빌드해서 사용한다.command기본 command를 여기에 지정된 명령어로 오버라이드해서 사용한다.links컨테이너를 다른 서비스들과 연결한다. 연결하려는 서비스 이름을 쓰거나 별칭을 함께 쓰면 된다. 그러면 이 컨테이너의 /etc/hosts 파일에 그 내용이 추가되어서 컨테이너에서 다른 컨테이너들에 접근할 수 있게 된다.links:- db- db:database- redis위 처럼 설정을 하게 되면 아래와 같이 /etc/hosts 파일의 내용이 생성된다.172.17.2.186 db172.17.2.186 database172.17.2.187 redis두 번째 db:database 설정은 db의 ip 주소를 database라는 이름으로 설정한걸 볼 수 있다.external_linkslinks와 비슷한 방식으로 설정하지만 compose내부의 컨테이너가 아니라, compose 외부에 있는 서비스와의 연결을 위해 필요하다.extra_hosts컨테이너의 /etc/hosts에 외부 호스트정보를 추가한다.extra_hosts:- "somehost:162.242.195.82"- "otherhost:50.31.209.229"이런식으로 선언하면 컨테이너의 /etc/hosts에 아래처럼 내용이 추가된다.162.242.195.82 somehost50.31.209.229 otherhostports호스트포트:컨테이너포트의 형식으로 컨테이너에서 사용할 포트를 지정할 수 있다. 호스트 포트를 생략하고 컨테이너 포트만 지정할수도 있는데, 그 경우에 호스트 포트는 랜덤으로 생성되서 할당된다. 컨테이너 포트를 60보다 작게 설정하면 에러가 발생할 수 있다. YAML이 xx:yy형식을 60진법으로 처리하기 때문이다. 그래서 포트 매핑은 문자열로 선언하는 것이 좋다.expose호스트에는 노출하지 않고 연결된 서비스끼리만 접근가능한 포트를 명시한다. 여기에 있는 포트로는 호스트에서는 접근할 수 없다.volumes현재 디렉토리를 볼륨으로 마운트할때 컨테이너에서 사용할 경로를 입력한다. 호스트:컨테이너 형식으로 호스트의 마운트할 경로를 지정할수도 있고 호스트:컨테이너:접근모드 형식으로 컨테이너에 마운트된 디렉토리의 접근권한을 설정할 수도 있다.volumes:- /var/lib/mysql- ./cache:/tmp/cache- ~/configs:/etc/configs/:rovolumes_from다른 서비스나 컨테이너의 전체 볼륨을 마운트한다.volumes_from:- service_name- container_nameenvironment배열이나 사전형식으로 환경변수를 설정할 수 있다.environment:RACK_ENV: developmentSESSION_SECRET:environment:- RACK_ENV=development- SESSION_SECRETenv_file환경변수를 파일에서 추가할 수 있다. 값 하나를 쓸수도 있고 여러개를 사용할 수도 있다. environment 에 사용된 값들이 여기 있는 파일들에 있는 값들에 우선한다.env_file: .envenv_file:- ./common.env- ./apps/web.env- /opt/secrets.env이런 식으로 환경변수가 있는 파일들을 명시할 수 있고, 환경변수 파일 내용은 변수=값 형식으로 되어 있으면 된다. 주석은 #을 이용해서 처리할 수 있다. 아래와 같다.# Set Rails/Rack environmentRACK_ENV=developmentextends다른 서비스를 현재 파일에서 가져와서 확장해서 사용한다.아래처럼 common.yml과development.yml 2개의 파일이 있다고 하자.common.ymlwebapp:build: ./webappenvironment:- DEBUG=false- SEND_EMAILS=falsedevelopment.ymlweb:extends:file: common.ymlservice: webappports:- "8000:8000"links:- dbenvironment:- DEBUG=truedb:image: postgresdevelopment.yml에서 common.yml에 정의된 내용을 가져와서 사용한다. common.yml에 설정된 내용에 추가로 필요한 port나 link정보를 설정하고, 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-containerlog 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옵션과 같다.pidpid: "host"PID 모드를 호스트 PID모드로 설정한다. 이렇게 되면 컨테이너와 호스트 운영체제가 같은 PID 주소 공간을 공유하게 된다. 이 옵션을 통하면 컨테이너들이 서로 접근 가능하게 된다.dns컨테이너가 사용할 커스텀 DNS 서버를 설정한다.dns: 8.8.8.8dns:- 8.8.8.8- 9.9.9.9cap_add, cap_drop컨테이너의 시스템에 관한 권한을 추가하거나 삭제한다.cap_add:- ALLcap_drop:- NET_ADMIN- SYS_ADMINdns_searchdns 검색 도메인을 설정한다.dns_search: example.comdns_search:devices디바이스 매핑 목록. docker의 -- device 옵션과 같다.devices:- "/dev/ttyUSB0:/dev/ttyUSB0"security_opt각 컨테이너의 기본 label을 오버라이드 한다.security_opt:- label:user:USER- label:role:ROLEworking_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 댓글