Docker Compose 정리

jonghyukLee·2022년 9월 17일
1

Docker-compose yml 파일

예시

version: '3.3'
services:
	#WebServer config
	webserver:
		build: .
		ports:
			- "80:80"
		depends_on:
			- redis
	#Redis config
	redis:
		image: redis:4.0

version

  • 가장 먼저 버전을 명시함.
  • 명시하지 않았을 경우 v1.0
  • 여러개의 compose 파일 작성 시, 버전을 통일해야함

services

  • 관리할 컨테이너의 서비스를 정의함

image

  • 컨테이너의 바탕이 되는 이미지를 지정함
  • 이미지 이름 또는 이미지 ID 중 하나를 명시
  • 해당 이미지가 로컬에 있으면 그것을 사용하고, 그렇지 않으면 Docker Hub에서 당겨온다.
  • 태그를 지정하지 않으면 최신버전 설치

build

  • 이미지 작성을 Dockerfile에 기술하고, 이를 자동으로 빌드하여 베이스 이미지로 지정할 수 있다.
  • build에는 도커파일의 경로를 지정한다.
  • docker-compose.yml 파일이 있는 디렉토리가 기준이 된다
  • 아래와 같이 경로와 파일명을 직접 매핑해줄 수도 있다. (context : 도커파일의 위치, dockerfile : 파일명)
bulid:
	context: /data
	dockerfile: Dockerfile-name
	# 인수도 같이 지정할 수 있다. (bool 연산자는 ''로 둘러싸야함)
	args:
		arg1: arg1
		arg2: arg2

command

  • 컨테이너에서 작동하는 명령을 지정한다.

entrypoint

  • 마찬가지로 entrypoint도 아래와 같이 사용할 수 있다.
entrypoint:
	- php
	- -d
	- memory_limit=-1
  • 컨테이너 간 연결
  • 링크를 사용하여 컨테이너를 서로 연결할 수 있다.
links:
	-logserver
	# 앨리어스
	-logserver:log01

ports/expose

  • 호스트포트:컨테이너포트 형태로 명시, 호스트의 포트번호 작성 안했을때는 -P(호스트 랜덤) 처럼 동작
  • YAML은 xx:yy 형식을 시간으로 해석하기 때문에, 반드시 “”로 감싸서 정의해야한다.
ports:
	- "3000"
	- "8000:8000"
  • 호스트에 대한 포트를 공개하지 않고 링크 기능을 사용하여 연결하는 컨테이너에게만 포트를 공개할 때는 expose를 지정한다.
expose:
	- "3000"
	- "8000"
  • 로그 서버와 같이 호스트에서 직접 액세스하지 않고, WAS 기능을 갖고 있는 컨테이너를 경유해서만 액세스하고 싶은 경우 등에 사용된다.

depends_on

  • 서비스의 의존 관계 정의
  • 예를 들어 webserver 컨테이너를 시작하기 이전에 db, redis 컨테이너를 먼저 시작하고 싶은 경우
    아래와 같이 정의함
services:
	webserver:
		depends_on:
			- db
			- redis
	db:
		#이하 생략
	redis:
		#이하 생략
  • 하지만, depends_on은 컨테이너의 시작 순서만 제어할 뿐 애플리케이션의 이용 가능 상태까지 기다리는 것은 보장하지 않는다. 각 서비스가 준비가 완료될때까지 기다리는 것에 대해서는 애플리케이션 측에서 대책을 세워야한다.

environment

  • 컨테이너 환경변수 지정
  • YAML 배열 또는 해시 형식 중 하나로 변수를 지정한다.
# 배열 형식
environment:
	- HOGE=fuga
	- FOO
# 해시 형식
environment:
	HOGE: fuga
	FOO:
  • 설정해야 할 환경변수가 많을 경우, 파일을 읽어들일 수도 있다.
env_file: envfile(파일명)

# 여러개도 가능
env_file:
	- ./envfile1
	- ./app/envfile2
	- ./tmp/envfile3

container_name

  • 컨테이너에 이름을 설정
  • 컨테이너명은 고유해야함
container_name: name
# 라벨 설정

# 배열 형식
labels:
	- "com.example.description=ASDFASD"
# 해시 형식
labels:
	"com.example.description=ASDFASD"
	"com.example.description=ASDFASD"
  • 설정한 라벨 확인할때는 docker-compose config 명령어 활용

volumes/volume_from

  • 컨테이너에 볼륨을 마운트한다.
volumes:
	- /var/lib/mysql
	# 호스트에서 마운트 경로 지정
	- cache/:/tmp/cache
	# ro를 지정하면 볼륨을 읽기 전용으로 마운트할 수 있다. 
	# 설정파일이 저장된 볼륨과 같이 쓰기를 금지하고 싶은 경우에 활용된다.
	- ~/configs:/etc/configs/:ro
  • 다른 컨테이너로 부터 모든 볼륨을 마운트할때는 volumes_from에 컨테이너명을 지정한다.
# log라는 이름의 컨테이너로 모든 볼륨을 마운트
volumes_from:
	- log

Docker Compose의 주요 서브 명령어

docker-compose는 생략

up컨테이너 생성/시작
ps컨테이너 목록 표시
logs컨테이너 로그 출력
run컨테이너 실행
start컨테이너 시작
stop컨테이너 정지
restart컨테이너 재시작
pause컨테이너 일시 정지
unpause컨테이너 재개
port공개 포트 번호 표시
config구성 확인
kill실행 중인 컨테이너 강제 정지
rm컨테이너 삭제
down리소스 삭제
  • docker-compose 명령은 docker-compose.yml을 저장한 디렉토리에서 실행된다.
  • 만일 이외의 위치를 지정하려면 -f 옵션으로 파일 경로를 명시한다.
    • docker-compose -f {파일경로} up
  • 서브 명령 이후에 컨테이너명을 지정하면 해당 컨테이너만 조작할 수 있다.
    • docker-compose stop {컨테이너명}

여러 컨테이너 생성 (up)

  • docker-compose up 을 사용하면 작성한 yml 파일을 바탕으로 여러 개의 컨테이너를 생성하여 시작한다.
  • 지정할 수 있는 옵션
    • -d : 백그라운드 실행
    • —no-deps : 링크 서비스를 시작하지 않음
    • —build : 이미지를 빌드
    • —no-build : 이미지를 빌드하지 않음
    • -t, —timeout : 컨테이너의 타임아웃을 초로 지정(기본 10초)
    • —scale SERVICE=서비스 수 : 서비스 수를 지정
      • server_a 컨테이너 10개, server_b 컨테이너 20개 시작하고 싶을 경우
      • docker-compose up —scale server_a=10 —scale server_b=20

여러 리소스의 일괄 삭제(down)

  • compose 정의 파일을 바탕으로 생성한 컨테이너나 이미지를 모아서 삭제할때는 down 명령어를 사용한다.
  • down 명령은 실행중인 컨테이너를 정지시키고, 이미지, 네트워크, 데이터 볼륨을 일괄적으로 삭제한다.
  • 옵션
    • —rmi all : 모든 이미지 삭제
    • —rmi local : 커스텀 태그가 없는 이미지만 삭제
    • -v, —volumes : compose 정의 파일의 데이터 볼륨을 삭제
profile
머무르지 않기!

0개의 댓글