2020. 2. 8. 18:44ㆍdevops/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 |