4.3.1 도커 컴포즈 기본 사용법

  • 도커 컴포즈는 컨테이너의 설정이 정의된 YAML 파일을 읽어서 컨테이너를 생성한다.
  • 아래와 같이 docker-compose.yml 파일을 작성한다.
  • version 은 YAML파일의 포맷버전을 의미한다.
  • services 생성될 컨테이너를 묶는 단위를 의미한다.
  • web mysql 생성될 서비스의 이름이다. 해당 항목 아래에 컨테이너가 생성될 때 필요한 옵션을 지정할 수 있다.
 1version: '3.0'
 2services:
 3  web:
 4    image: alicek106/composetest:web
 5    ports:
 6      - "80:80"
 7    links:
 8      - mysql:db
 9    command: sh -c 'echo "ServerName localhost" >> /etc/apache2/apache2.conf && cat /etc/apache2/apache2.conf && apachectl -D FOREGROUND'
10  mysql:
11    image: alicek106/composetest:mysql
12    command: mysqld
  • docker-compose up -d 명령어를 통해 컨테이너를 생성한다.
  • 교재대로 하면 apache 서버가 실행되지 않았다. 위처럼 직접 ServerName을 localhost로 지정해주니 정상적으로 실행이 됐다.
  • 정상적으로 2개의 컨테이너가 생성되었다.

Untitled

  • docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}" 를 통해 조회해본다.
  • 컨테이너 이름은 [프로젝트 이름]_[서비스 이름]_[서비스내 컨테이너 번호] 로 자동 생성된다.
  • 프로젝트 이름을 따로 지정하지 않는다면 docker-compose.yml 파일이 존재하던 디렉터리 명이 프로젝트 이름이 된다.

Untitled

  • 정상적으로 서비스하는 사이트에 접속이 된다.

Untitled

  • 서비스 내에는 여러개의 컨테이너가 존재할 수 있으며, replication을 지원한다.
  • docker-compose scale [서비스명]=[개수] 명령어를 통해 특정 서비스를 복사할 수 있다.
  • 이유는 모르겠지만 2개중 1개의 서비스가 종료되어 버렸다.

Untitled

  • docker-compose down 명령어를 사용하면 모든 서비스를 중단하고 컨테이너를 삭제한다.

Untitled

  • -p 옵션을 통해 프로젝트 명을 지정할 수 있다. 따라서 똑같은 docker-compose.yml을 실행하더라도 분리된 운영이 가능해진다.
  • 조회 및 삭제시에도 -p 옵션을 사용해서 프로젝트에 대한 개별적인 제어가 가능하다.

Untitled

4.3.2 도커 컴포즈 활용

버전

  • version: '3.0' 과 같이 작성한다.
  • 도커 컴포즈 버전 1.10에선 YAML 3.0 문법 사용이 가능하다.

서비스 정의

  • 생성할 컨테이너의 옵션을 정의한다.
  • 각 서비스는 컨테이너로 구현된다.
  • image 옵션은 서비스의 컨테이너를 생성할 때 쓰일 이미지의 이름을 설정한다.
1services:
2  my_container_1:
3    image: ...
4  my_container_2:
5    image: ...
  • links 옵션은 다른 서비스에 서비스명만으로 접근할 수 있도록 한다.
  • 아래와 같이 작성하며, [SERVICE:ALIAS] 형태로 작성하면 별칭으로도 접근이 가능하게된다.
1services:
2  web:
3    links:
4      - db
5      - db:database
6      - redis
  • environment 옵션은 서비스의 컨테이너 내부에서 사용할 환경변수를 지정한다.
  • 아래와 같이 2가지 방식을 허용한다.
1services:
2  web:
3    environment:
4      - MYSQL_ROOT_PASSWORD=mypassword
5    또는
6		environment:
7      - MYSQL_ROOT_PASSWORD: mypassword
  • command 옵션은 컨테이너가 실행될 때 수행할 명령어를 설정한다.
  • 아래와 같이 2가지 방식을 허용한다.
1services:
2  web:
3    image: alicek106/composetest:web
4    command: apachectl -DFOREGROUND
5    또는
6		image: alicek106/composetest:web
7		command: [apachectl, -DFOREGROUND]
  • depends_on 옵션은 특정 컨테이너에 대한 의존관계를 설정한다. 이 항목에 명시된 컨테이너가 먼저 실행되고 나서 현재 컨테이너가 실행된다.
  • 아래와 같이 작성하면 된다.
  • 주의할 점은 순서만 보장하며, 실행이 완료되었는지는 확인하지 않는다.
1services:
2  web:
3    image: alicek106/composetest:web
4    depends_on:
5      - mysql
6  mysql:
7    image: alicek106/composetest:mysql
  • ports 명령어는 서비스의 컨테이너를 개방할 포트를 설정한다.
  • 호스트의 특정 포트를 서비스의 컨테이너에 연결하면 scale 명령어로 서비스의 컨테이너의 수를 늘릴수 없다.
1services:
2  web:
3    image: alicek106/composetest:web
4      ports:
5        - "8080"
6				- "8081-8085"
7				- "80:80"
  • build 명령어는 Dockerfile에서 이미지를 빌드해 서비스의 컨테이너를 생성하도록 한다.
  • build 에 정의된 dockerfile을 사용해서 image 에 정의된 이름으로 이미지를 만든다.
  • 주의할 점은 Dockerfile을 수정해도 새로운 이미지를 생성하지 않는다. --build 옵션을 통해서 매번 이미지를 빌드할 수 있도록 할 수 있다.
 1services:
 2  web:
 3    build: ./composetest
 4    image: alicek106/composetest:web
 5	  또는 
 6    build: ./composetest
 7		context: ./composetest
 8	  dockerfile: myDockerfile
 9		args:
10			HOST_NAME: web
11			HOST_CONFIG: self_config
  • extends 다른 YAML 파일이나 현재 YAML 파일에서 서비스 속성을 상속받게 설정한다.
  • 아래와 같이 extends 명령어를 통해 설정을 상속 받을 수 있다.
1version: '3.0'
2	services:
3		web:
4			extends:
5				file: extend_compose.yml
6				service: extend_web
  • extend_compose.yml 파일은 아래와 같다고 가정했다.
1version: '3.0'
2	services:
3		extend_web:
4			image: ubuntu:14.04
5			ports:
6				- "80:80"
  • 다음과 같이 1개의 yml 파일 안에서도 extends 가 가능하다.
1version: '3.0'
2	services:
3		web:
4			extends:
5				service: extend_web
6		extend_web:
7			image: ubuntu:14.04
8			ports:
9				- "80:80"

네트워크 정의

  • driver 를 통해 기본으로 제공하는 브리지 타입의 네트워크가 아닌 원하는 네트워크를 사용하도록 설정할 수 있다.
  • 아래는 overlay 방식의 네트워크를 mynetwork로 정의해서 서비스가 사용하는 예제이다.
 1version: '3.0'
 2	services:
 3		myservice:
 4			image: nginx
 5			networks:
 6				- mynetwork
 7networks:
 8	mynetwork:
 9		driver: overlay
10		driver_opts:
11			subnet: "255.255.255.0"
12			IPAdress: "10.0.0.2"
  • ipam(IP Address Manager) 는 subnet, ip 범위 등을 설정할 수 있다.
1version: '3.0'
2	...
3networks:
4	ipam:
5		driver: mydriver
6		config:
7			subnet: 172.20.0.0/16
8			ip_range: 172.20.5.0/24
9			gateway: 172.20.5.1
  • external 명령어를 통해 프로젝트를 생성할때마다 새로운 네트워크를 생성하는것이 아닌 기존의 네트워크를 사용할 수 있도록 한다.
  • external 은 기존의 준비된 네트워크를 사용하기 때문에 drvier,driver_ops, ipam 옵션과 함께 사용이 불가능하다.
1
2services:
3	web:
4		image: alicek106/composetest:web
5		networks:
6			- alicek106_network
7networks:
8	alicek106_network:
9		external: true

볼륨 정의

  • driver 명령어는 볼륨을 생성할 때 사용될 드라이버를 설정합니다.
1version: '3.0'
2services:
3	...
4volumes:
5	driver: flocker
6		driver_opts:
7			opt: "1"
8			opt2 : 2
  • external 명령어를 사용하면 기존 볼륨을 사용하도록 설정할 수 있다.
1services:
2	web:
3		image: alicek106/composetest:web
4		volumes:
5			- myvolume:/var/www/html
6volumes:
7	myvolume:
8		external: true

YAML 파일 검증하기

  • docker-compose config 명령어를 사용해서 YAML 파일의 오타나, 파일 포맷 등을 검사할 수 있습니다.