docker-compose는 여러개의 컨테이너 설정 내용을 하나의 파일에 모아서 사용하는 YAML 파일 입니다. 이 docker-compose는 컨테이너의 서비스(services:), 네트워크(networks:), 볼륨(volumes:)을 정의 합니다.
docker-compose의 버전에 따라 여러 차이가 있기 때문에 작성할 때엔 아래처럼 버전을 정의 해주는것이 좋습니다.
version: "3"
docker compose의 기본적인 실행/중지 명령은 docker-compose up, docker-compose stop 이고, 실행 시키면서 빌드를 진행할 때에는 docker-compose up --build 를 사용 합니다.
-
1. image
docker-compose 안에서 베이스 이미지를 지정할 수 있습니다. docker build를 할때와 마찬가지로 베이스 이미지가 로컬 환경에 없다면 Docker hub에서 다운로드하여 베이스 이미지로 사용되고, 로컬 환경에 있다면 그 이미지를 베이스 이미지로 사용하게 됩니다.
services: # 컨테이너의 서비스라는것을 정의
nginx: # [이미지명]:
image: centos:7 # image: [이미지명]:[태그명]
-
2. build
1번은 어떤 베이스 이미지를 사용할 지 docker-compose 안에서 선언을 해주었다면, docker-compose에서 선언하여 Dockerfile을 이용해 자동으로 docker build 후 베이스 이미지로 사용할 수 있습니다.
# docker-compose.yml
services:
nginx:
build: .
# Dockerfile
FROM centos:7
위와 같이 설정 후 docker-compose up 명령어를 입력하면 자동으로 Dockerfile을 빌드하여 베이스 이미지를 만들고 centos를 기반으로 한 nginx 이미지를 생성해줍니다.
만약 Dockerfile의 경로나 이름이 다른곳에 있다면 아래와 같이 특정 Dockerfile을 지정해줄 수 있습니다.
services:
nginx:
build:
context: /mnt/backup ## Dockerfile이 있는 경로 (절대경로 또는 상대경로)
dockerfile: Dockerfile-agent ## 파일명이 Dockerfile이 아닐 경우 파일명 기입
args 으로 인수를 지정해줄 수 있는데, Dockerfile에서 ARG 또는 ENV로 지정한 변수에 값을 넣거나 할 수 있습니다. (args는 Dockerfile의 ARG와 비슷 합니다. docker-compose 명령이 실행되는 구간에서만 적용 됩니다.)
build 문법을 사용할 때에 하위 옵션(context, args 등)을 사용하게 되면 build: 옆에 인수를 비워두고 하위 옵션에 작성해주어야 합니다. 아래 코드를 참고 하시고, Dockerfile에 있는 환경변수 number에 docker-compose.yml을 이용하여 args로 환경변수에 값을 넣어준 결과 입니다.
# docker-compose.yml
version: "3"
services:
nginx:
build:
context: .
args:
number:1
# Dockerfile
FROM centos:7
ARG number
RUN echo "$number"
-
3. command / entrypoint
Dockerfile의 cmd,entrypoint와 거의 같습니다. 하지만 Dockerfile의 entrypoint보다 docker-compose의 entrypoint가 우선 순위가 높습니다.
즉, 아래 이미지와 같이 Dockerfile에 entrypoint를 정의 하여도 docker-compose를 실행 및 빌드할 때에 Dockerfile의 entrypoint를 덮어써서 docker-compose에 작성한 명령이 실행 됩니다.
# docker-compose.yml
version : "3"
services:
nginx:
build: .
entrypoint: cat /etc/hosts
# 또는
entrypoint:
- /bin/cat
- /etc/hosts
# Dockerfile
FROM centos:7
ENTRYPOINT ["/bin/ls", "-lh", "/root"]
-
4. links
links는 각 컨테이너들을 연결시켜주는 역할을 하는데, links는 Docker의 레거시 기능으로 Docker 공식 홈페이지에서도 권장하지 않는 명령 입니다. 네트워크 설정을 통해 연결 시켜 주거나 Volumes를 이용하는것을 권장 하기 때문에 links에 대한 설명은 패스 하겠습니다.
links:
- webserver # 연결할 컨테이너명
2편 (ports, expose, depends_on, nevironment, env_file, container_name, labels, volumes, volumes_from) : https://nirsa.tistory.com/80?category=868315