Docker Compose란?
여러 개의 컨테이너로부터 통합적으로 Docker 이미지를 만들어준다.
이를 통해 만들어진 각각의 컨테이너를 시작 및 중지하는 등의 작업을 더 쉽게 수행할 수 있도록 도와준다.
Docker compose에서는 compose 파일을 준비하여 커맨드를 1회 실행하는 것으로, 그 파일로부터 설정을 읽어들여 모든 컨테이너 서비스를 실행시키는 것이 가능하다.
간단히 말해서, 1개 이상의 도커 컨테이너 생성 시, 스크립트 하나로 생성할 컨테이너들을 정의하고 관리하는 Docker의 기능!
yaml 파일이 있는 위치에서 sudo docker compose up을 입력하면 도커 컴포즈 서비스가 시작된다.
Docker Compose를 사용하는 법
1. 서비스 빌드하기
각각의 컨테이너의 Dockerfile을 작성함
docker-compose.yml에 정의하고, docker compose를 사용하여 서비스를 빌드함
-> 이 과정을 통해 Docker 이미지를 생성함
2. 서비스 시작하기
Docker Compose를 사용하여 서비스 시작함
한 개 이상의 컨테이너가 시작한다고 생각하면 됨
다수의 컨테이너 사용하는 애플리케이션 서비스 이용할 수 있게됨
3. 서비스 정리하기
사용 끝난 서비스를 해체하고 컨테이너 중지, 원하는 경우 제거 가능
docker-compose.yml 파일
docker-compose.yml에 모든 서비스를 정의함
docker-compose의 빌드를 통해 이미지를 생성함
이미지를 실행하면 컨테이너를 만들 수 있음
서비스란?
실행될 웹 인스턴스나 프레임워크, 노드, php, 데이터베이스, 캐싱서비스, 일부 응용 프로그램 서버 서비스 등이 될 수 있음
docker-compose.yml 파일 해석하기
services: # docker-compose.yml 빌드하게 되면 실행하려는 서비스
mysql: # mysql 이라는 서비스를 정의
user: 501:20 # 사용자 및 그룹 ID 설정
image: mysql:8.0.33 # 사용할 MySQL Docker 이미지 지정
ports:
- 13306:3306 # 로컬 호스트의 13306 포트와 컨테이너 내의 3306 포트를 연결
volumes: # 로컬 파일 시스템과 MySQL 컨테이너 내의 데이터 디렉토리를 볼륨으로 마운트
- /Users/black/dev/mysql_docker/data:/var/lib/mysql:rw
- /Users/black/IdeaProjects/backend-preonboarding/src/main/resources/initdb:/docker-entrypoint-initdb.d
command:
- '--character-set-server=utf8mb4'
- '--collation-server=utf8mb4_unicode_ci'
environment: # MySQL 루트 비밀번호 및 초기 데이터베이스 이름 설정
MYSQL_ROOT_PASSWORD: preonboarding
MYSQL_DATABASE: wanted
여기서 하나 특징적으로 보이는 건 volumes 섹션이다.
Docker에서 볼륨(Volume)이란?
일반적으로 컨테이너가 실행될 때 변경된 내용이 레이어에 쓰이지만 컨테이너가 제거되면 그 내용도 사라지게 된다.
다행히도 Docker와 컨테이너에서는 볼륨이라는 기능을 통해 컨테이너와 독립해서 데이터를 관리할 수 있다.
도커에섭 볼륨이란 컨테이너와 관련된 호스트 시스템의 특별한 유형의 디렉터리이다.
볼륨은 컨테이너의 파일 시스템이 아닌 호스트의 파일 시스템에 데이터를 저장하고 유지된다.
볼륨을 사용하면 컨테이너 내의 특정 경로를 호스트 시스템의 특정 볼륨에 연결하여 컨테이너 내의 데이터를 저장하고 유지할 수 있다.
따라서, 컨테이너가 삭제되어도 데이터는 보존된다.
일반적으로 볼륨엔 모든 데이터 유형을 저장할 수 있으며, 코드가 될 수도 있고 로그 파일을 저장할 수도 있다.
주로, 다음과 같은 상황에서 사용된다.
- 데이터 영속성: 컨테이너의 데이터를 보존하고 유지하기 위해 사용된다. 예를 들어, 데이터베이스 서버에서 데이터 파일을 저장하거나 로그 파일을 유지하는 데 사용될 수 있다.
- 데이터 공유: 여러 컨테이너 간에 데이터를 공유하려는 경우 사용된다. 예를 들어, 웹 서버와 로그 수집기 간에 로그 파일을 공유할 때 사용될 수 있다.
- 데이터 백업: 컨테이너의 데이터를 백업하고 복원하기 위해 사용될 수 있다.
따라서
volumes: # 로컬 파일 시스템과 MySQL 컨테이너 내의 데이터 디렉토리를 볼륨으로 마운트
- /Users/black/dev/mysql_docker/data:/var/lib/mysql:rw
- /Users/black/IdeaProjects/backend-preonboarding/src/main/resources/initdb:/docker-entrypoint-initdb.d
이렇게 생겨있던 위의 코드는
- /Users/black/dev/mysql_docker/data:/var/lib/mysql:rw
- /Users/black/IdeaProjects/backend-preonboarding/src/main/resources/initdb:/docker-entrypoint-initdb.d
빨강색이 볼륨의 이름이고 호스트 시스템에 연결된 볼륨이다.
초록색은 컨테이너 내의 경로이다.
즉 위의 설정은 컨테이너 내의 /var/lib/mysql:rw 경로를
호스트 시스템에 있는 /Users/black/dev/mysql_docker/data라는 이름의 볼륨에 연결한다.
총 두 개의 볼륨을 생성하는 것인데,
첫 번째 볼륨은 MySQL 데이터 디렉토리를 호스트 시스템의 특정 디렉토리에 저장하므로 MySQL 데이터를 영구적으로 보존할 수 있다.
두 번째 볼륨은 초기화 스크립트를 호스트 시스템의 특정 디렉토리에서 컨테이너 내의 특정 디렉토리로 복사한다.
MySQL 컨테이너가 시작될 때 이 디렉토리 내의 SQL 파일들은 자동으로 실행된다.
따라서 정리하면 위의 설정을 통해 호스트 시스템의 두 가지 다른 경로를
MySQL 컨테이너 내의 두 가지 다른 경로에 연결하여 데이터를 관리하고 초기화할 수 있다.
Ref.
https://engineer-mole.tistory.com/221 [매일 꾸준히, 더 깊이:티스토리]
'DevOps' 카테고리의 다른 글
[docker] mysql 데이터베이스 생성 후 SQL문 실행으로 초기화 (0) | 2024.02.08 |
---|---|
[docker] docker compose로 mysql 컨테이너 생성 후 실행하기 (1) | 2024.02.07 |