docker compose yaml 파일 작성

2020. 2. 8. 18:44devops/docker

docker compose yaml 파일 작성

(1) 버전 정의

YAML 파일 포맷에는 버전이 여러개 있는데 compose version 1.10 이상부터는 사용할 수 있는 yaml 버전을 3으로 설정합니다. 그리고 버전 3은 docker swarm모드랑 호환되기때문에 좋습니다. 버전은 일반적으로 YAML 파일의 맨 윗부분에 명시합니다. 

version: '3.0'

 

(2) 서비스 정의 

서비스는 도커 컴포즈로 생성할 컨테이너 옵션을 정의합니다. 이 항목에 쓰인 각 서비스는 컨테이너로 구현된다. 이 컨테이너들은 하나의 프로젝트로서 도커 컴포즈에 의해 관리됩니다. 서비스의 이름은 services의 하위 항목으로 정의하고 컨테이너의 옵션은 서비스 이름의 하위 항목에 정의합니다. 

services:
	컨테이너1:
      image: 
    컨테이너2: 
      image

이미지 설정: 서비스의 컨테이너를 생성할  때  사용할 이미지를 설정합니다. 

services:
  my_container_1:
    image: ubuntu:14.04
  my_container_2:
    image: nginx

 

links: docker run 명령어의 --link와 같으며 다른 서비스에 서비스명만으로 접근할 수 있도록 설정합니다. 

[SERVICE:ALIAS]의 형식을 사용하면 서비스에 별명으로 접근할 수 있습니다.

services:
	web:
    	links:
        	- db
            - db:database
            - redis

 

environment: docker run 명령어의 --env, -e 옵션과 동일합니다. 환경변수를 지정하며 딕셔너리나 배열 형태로 사용할 수 있습니다. 

environment:
	- MYSQL_ROOT_PASSWORD=mypassword
    - MYSQL_DATABASE_NAME=mydb
    
or

environment:
	- MYSQL_ROOT_PASSWORD:mypassword
    - MYSQL_DATABASE_NAME:mydb
    

    

 

command: 컨테이너가 실행될 때 수행할 명령어를 설정하며, docker run 명령어의 마지막에 붙는 command와 같습니다. 

배열 및 일반적으로 사용할 수 있습니다. 

services:
  web:
    image: apache2
    command: apachectl -DFOREGROUND
  또는
  web: 
  	image: apache2
    command: [apachectl, -DFOREGROUND]


depends_on: 특정 컨테이너에 대한 의존 관계를 나타내며, 이 항목에 명시된 컨테이너가 먼저 생성되고 실행됩니다. 

links와 다른 점은 depends_on 서비스 이름 만으로만 접근할 수 있습니다. 아래의 경우 mysql 컨테이너가 먼저 발생한 후 apache2가 생성됩니다. 

services:
  web:
    image: apache2
    depends_on
    	- mysql
  mysql:
     image: mysql

특정 서비스의 컨테이너만 생성하되 의존성이 없는 컨테이너를 생성하려면 --no-deps를 사용하면 됩니다. 

docker-compose up --no-deps web

 

ports: docker run 명령어의 -p 옵션과 같으며 서비스 컨테이너에 개방할 포트를 설정하는 것입니다. 하지만 특정 포트를 설정하면 scale 옵션으로 컨테이너의 수를 늘릴 수 없습니다.

services:
	web:
    	image:nginx
        ports:
            - "8080"
            - "8081-8085"
            - "80:80"
    

 

build: build 항목에 정의된 도커파일 이미지를 빌드해 컨테이너를 생성합니다. 또한도커파일에 사용될 컨텍스트, 파일의 이름, 사용될 인자 값을 설정할 수 있습니다. 

services:
	web:
		build: ./buildFile
        context: ./buildFile
        dockerfile: myDockerfile
    args: 
    	HOST_NAME: web
        HOST_CONFIG: self_config
    

 

extends: 다른 YAML파일이나 현재 YAML파일에서 서비스 속성을 상속받게 설정합니다. 

docker-compose.yml

versin: '3.0'
	services:
    	web:
        	extends: 
            	file: extend_compose.yml
                service: extend_web
                
extend-compose.yml

version: '3.0'
	services: 
    	extend_web:
        image: ubuntu:14.04
        ports:
        - "80:80"

docker-compose.yml파일에서 extend_compose.yml 파일 및 services extend_web 파일을 파일 중 service extend_web이 지목받습니다. 추가로 depends_on, links, volumes_from 같은  것들은  의존성을 갖고있어서 extends 사용할 수 없습니다. 

 

네트워크 정의

이전에 network 설정을 통해 none, host, bridge 등을 설정했습니다. compose에서는 container가 생성되면 자동으로 bridge 타입으로 생성됩니다. 단 overlay 모드는 스웜도모드에서 만들 수 있습니다. 

version: '3.0'
services: 
	myservice: 
    	image: nginx
        networks: 
        - mynetwork
networks:
	mynetwork:
    	driver: overlay
        driver_opts: 
        	subnet: "255.255.255.0"
            IDAdress: "10.0.0.2"

 

IPAM: IP관리 manger을 위해 사용할 수 있는 option입니다. subnet, ip 범위 등을 설정할 수 있습니다. 

networks:
	ipam: 
    	driver: mydriver
        config: 
        	subnet: 172.20.0.0/16
            ip_range: 172.20.5.0/24
            gateway: 172.20.5.1
            

external: 프로젝트를 생성할 때마다 네트워크를 생성하는 것이 아닌 기존의 네트워크를 사용하도록 설정합니다. 

external:의 값을 true로 설정해주면 됩니다. 

services:
	web: 
    	image: alicek106/composetest:web
        networks: 
        - hoony_network
    networks: 
    	hoony_network:
        external: true
    

 

볼륨 정의 

driver: 볼륨을 생성할 때 사용될 드라이버를 설정합니다. 기본 값은 local입니다. driver_opts를 통해 인자로 설정할 수 있습니다. 

version: '3.0'
services: 

volumes: 
	driver: flocker
    	driver_opts:
        	opt: "1"
            opt2: 2

 

external: YAML 파일에서 volume, volumes-from 옵션 등을 사용하면 프로젝트마다 볼륨을 생성합니다. 이때 external 옵션을 설정하면 볼륨을 프로젝트를 생성할 때마다 매번 생성하지 않고 기존 볼륨을 사용하도록 설정합니다. 

services:
	web:
    	image: hoony/web
        volumes:
        - myvolume:/var/www/html
    volumes: 
	    myvolume:
        	external: true

 

YAML 파일 검증하기 

YAML 파일을 작성할 때 오타 검사나 파일 포맷이 적절한지 등을 검사하려면 docker-compose config 명령어를 사용합니다. 기본적으로 현재 디렉터리의 docker-compose.yml 파일을 검사하지만 -f 옵션을 통해 yaml 파일을 지정할 수 있습니다. 

 

doker compose network

YAML 파일에 네트워크 항목을 정의하지 않으면 프로젝트 별로 브리지 네트워크를 생성합니다. 네트워크 이름은 프로젝트이름_default로 설정됩니다. docker-compose scale 명령어로 생성되는 컨테이너 전부가 이 브리지 타임의 네트워크를 사용합니다. --net-alias가 서비스의 이름을 갖도록 자동으로 설정됩니다. 이 네트워크에 속한 컨테이너는 서비스의 이름으로 접근할 수 있습니다. 

 

위 사진과 같이 ubuntu가 mysql이라는 이름으로 접근하게되면 두 컨테이터 중 하나가 IP로 변환되어 반환합니다. 컨테이너가 여러개일 경우 라운드 로빈 방식으로 연결을 분산합니다. scale로 늘려도 컨테이너에 접근할 수 있습니다. 

 

 

 

'devops > docker' 카테고리의 다른 글

Docker compose  (0) 2020.02.08
Docker 구조  (0) 2020.02.04
Dockerfile 명령어  (0) 2020.02.04
docker build 과정  (2) 2020.02.02
docker file 작성  (0) 2020.01.31