목차
개요
이전 포스팅 내용에서 docker-compose.yml의 하단부에 있던 volume 설정에 대해서 설명이 부족한 것 같아서 작성하게 되었다.
아무것도 모르면서 실행한다면 막상 코드에 변화나 옵션을 주어야할때 막막한 경우가 많다!
버전과 서비스 정의하기
version: "3"
services:
db:
image: mysql:8.0
platform: linux/x86_64
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: mysqldb
MYSQL_USER: nstgic
MYSQL_PASSWORD: 1234
TZ: Asia/Seoul
volumes:
- ./db/mysql/data:/var/lib/mysql
- ./db/mysql/config:/etc/mysql/conf.d
- ./db/mysql/init:/docker-entrypoint-initdb.d
가장 첫번째 줄에 보면 version : "3"은 사용하는 Docker Compose 파일의 버전을 명시한다.
services:
image:
이후에는 서비스를 명시해주고 있다. 우리가 이전에 진행하였을때는 mySQL을 실행시키는것이 목적이었기에 서비스에는 오직 db: 하나만 존재하고 있다. image의 경우에는 mySQL을 가져올 것이며 뒤에 가져올 이미지의 버전을 명시해두었다.
platform :
OS/아키텍처 조합으로 맥이라면 arm64 옵션을 넣어주고 윈도우면 x86_64나 amd64를 넣어주자
restart:
Docker 시작될 시에 컨테이너가 자동으로 시작되게 하고싶으면(컴퓨터를 키고 docker를 실행만 하면 mySQL을 쓰게하고 싶으면 always를 넣자
enviroment:
컨테이너에서 사용할 환경변수를 설정하면 된다.
MySQL의 비밀번호 아이디 사용할 db이름.. 그리고 한글을 사용한다면 혹은 Time관련된 형식을 사용한다면 타임존 설정도 해주자
민감한 정보는 당연히 환경변수를 이용해서 git에 올라가지 않게 해야겠지만 개발 도중에는 어차피 1. 로컬에서만 띄우고 2. 비밀번호도 러프하게 1234 해놓으면 최악의 상황은 면할수 있다.
볼륨은 아래에서 자세하게 말하겠다.
mySQL의 볼륨 정의
version: "3"
services:
db:
image: mysql:8.0
platform: linux/x86_64
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: mysqldb
MYSQL_USER: nstgic
MYSQL_PASSWORD: 1234
TZ: Asia/Seoul
volumes:
- ./db/mysql/data:/var/lib/mysql
- ./db/mysql/config:/etc/mysql/conf.d
- ./db/mysql/init:/docker-entrypoint-initdb.d
아래 세 줄을 살펴보자
Volumes..? 이건 이전 포스팅에서 다뤘던 내용인데
2023.01.21 - [Docker] - 튜토리얼(4) 볼륨 마운트(Volume mount)로 Persist DB관리
해당 글을 보게되면 왜 볼륨 마운트로 로컬이나 특정한 위치에 db를 저장시키는 지에 대해 즉 왜 사용하는지에 대해서 이해를 할 수 있을 것이다.
해당 포스팅을 보고온다면 알수 있겠지만 CLI에서 실행할때는 도커 이미지를 불러오고 또 따로 볼륨을 만들어주고 컨테이너를 연결해주는 과정을 해당 compose.yml에 미리 적어주어 단순히 docker-compose.yml을 통해 실행을 하기만 해도 이 모든 옵션이 자동으로 행해진다!
그럼 다시 코드를 봐보자
볼륨에 대해서 더 자세하게
volumes:
- ./db/mysql/data:/var/lib/mysql
- ./db/mysql/config:/etc/mysql/conf.d
- ./db/mysql/init:/docker-entrypoint-initdb.d
이제 용도를 알았으니 무엇을 나타내는지 알아보자
- 위치1 : 위치 2
형식으로 보이는데 위치2를 위치1에 할당해주는 작업이라고 생각하면 된다.
정리하자면 db에 데이터를 입력하거나 설정을 입력하거나 사전 정보를 주어주는데 이를 로컬이나 사용자가 접근하기 쉬운 위치로 세팅을 해두어서 백업이나 초기화 등을 용이하게 하려고 하는 것은 물론이고 가장 주된 요인은 도커 내 서버에 저장될 DB를 로컬로 가져와서 깃허브에 올려서 공동작업자와 공유하거나 접근하기 쉽게(도커 서버로 접근하기 위해서는 별도의 ssh 설정이나 터미널이 필요하다)하기 위함이다.
가장 중요한 이유는 혹시나 모르는 컨테이너 리부팅 상황 등에 있어서 컨테이너 내부 내용이 다 사라지는 경우가 있기에 DB의 정보를 지키기 위해서는 외부에 이와 같이 마운트하여 저장하는 것이 좋다.
그럼 각자위치가 도커의 MySQL의 어떤 항목들을 저장하는 루트인지 알아보자.
1. - ./db/mysql/data:/var/lib/mysql
본론부터 말하자면 DB가 저장되는 저장 경로이다.
만약 자신이 UNIX의 FHS에 대한 지식이 있었다면 대강 데이터 저장하는 곳이겠네~ 라고 생각할 수 있었을것이다.
그럼 우린 이것을 백업을 하고 싶으면 따로 복사하여 저장하고 혹시나 많은 쿼리와 스키마를 작성했는데 빠른 삭제; 초기화가 하고싶으면 이 폴더를 날리고 도커를 재시작하면 초기 세팅을 가져올 수 있다.
실제로 도커의 터미널로 해당 경로를 들어가게 되면 pem키들 부터 sock , 각종 log 파일 등을 볼 수 있다. 아마 자신이 만든 DB이름으로의 파일도 존재할 것 이다.
2. - ./db/mysql/config:/etc/mysql/conf.d
외부 접속을 위한 파일들이 저장되는 저장경로이다. 따라서 이는 로컬의 config 폴더내에 가져와준다.
만약 해당 컨테이너를 여러번 실행하는데 오류가 뜨면서 실행이 되지 않는다면 data와 config 폴더를 날린 후에 다시 시도하면 문제없이 초기상태로 실행 될것이다.
3. - ./db/mysql/init:/docker-entrypoint-initdb.d
도커가 처음 실행될 당시에만 실행되는 초기 세팅 파일이다.
이전 포스팅에서 해당 내부에 database 를 하나 만들고 이를 SHOW하는 SQL구문을 적어놓았는데 이건 정말 연결을 위한 테스트였던것 뿐이지 이를 응용하면 스키마 A,B,C가 필요한 환경을 구축하고 싶다면 해당 init 폴더내에 여러 .sql 파일을 만들어서 각각 묘사해둔다면 나중에 DDL 등의 수정에 있어서 독립성을 가지게 되어 편하게 구축이 가능하다.
마무리
이렇게 compose 파일의 volumes 옵션이 각각 무엇을 설정하는지에 대해서 알아보았다.
다음 포스팅은 실제 Intellj 개발 환경 내에서 docker위의 MySQL에 연결하는 법을 포스팅하려한다.
아래 글까지 확인한다면 intelliJ + MySQL 환경에서 편하게 Spring 관련된 개발 환경을 구축할수 있다
2023.04.10 - [Spring] - SpringBoot+MySQL(JPA) 회원가입,JWT 로그인 구현하기 - (1)
'Docker' 카테고리의 다른 글
IntelliJ 위에서 Docker deploy하기 (0) | 2023.06.30 |
---|---|
도커로 MySQL 설치하고 접속하기, MySQLWorkBench로 관리 (0) | 2023.04.05 |
튜토리얼(6) 멀티 컨테이너(Multi container apps) (0) | 2023.01.22 |
튜토리얼(5) 바인드 마운트(Bind mount)로 소스 코드 업데이트 (0) | 2023.01.21 |
튜토리얼(4) 볼륨 마운트(Volume mount)로 Persist DB관리 (0) | 2023.01.21 |