사이드프로젝트에서 mysql을 도커를 사용하여 올려서 DB 서버로 이용한다.
mysql 서버를 올릴 때 사용하는 docker-compose.yml 파일의 작성법에 대해 정리해 보려한다.
dockerfile과 docker-compose.yml의 차이점과 함께 docker-compose.yml의 작성법을 정리해보자
1. Dockerfile
- 목적
base Image 파일로 수정된 image를 만드는 일련의 과정들을 정리해 놓은 파일
docker는 이 dockerfile을 이용하여 손쉽게 동일한 이미지를 반복해서 만들 수 있다.
- 예시(문법)
# 베이스를 만들 이미지를 지정
FROM node:16
# 명령어들이 이루어질 기본 디렉토리 설정
WORKDIR /app
# 소스를 복사, 자주 바뀌는 소스일 수록 아래에 작성
COPY package.json package-lock.json /app
COPY index.html /app
COPY server.js /app
# 도커 컨테이너가 실행 되었을 때 리슨 포트지정
EXPOSE 80
# 도커 컨테이너가 실행되었을 때 실행하는 명령어
CMD ["node", "server.js"]
- 이미지 빌드 후 실행
docker build -t node-server ./
docker run -it -p 80:80 node-server
2. docker-compose.yml
- 목적 : 연결된 다수의 컨테이너를 하나로 통합하여 관리하는 도구
- docker-compose는 host level 에서만 동작한다.
- 컨테이너 실행 옵션을 미리 정의한 문서
- docker-compose.yml 파일에서 dockerfile에 정의된 이미지를 관리할 수도 있다.
- 예시로는 mysql을 docker로 올려서 사용하는 방법이다.
1) 우선 docker-compose.yml 파일 없이 그냥 도커를 다운받아서 mysql 이미지를 올리는 상황이다.
-> docker-compose.yml 파일 사용 안함!!
# 도커 mysql 이미지 다운로드
# 도커 Public registry(Docker Hub)에 있는 이미 만들어진 mysql 이미지를 다운받는다
docker pull mysql:8.0.17
# 다운받은 도커 이미지들 확인
docker images
다음처럼 그동안 받았던 이미지들의 리스트를 확인 할 수 있다.
처음 받는 경우라면 mysql 하나만 있을 것이다.
# 도커 mysql 컨테이너 생성 및 실행
# 호스트pc의 원하는 디렉토리를 mysql용 디렉토리로 마운트 시킨다
# docer mysql 같은 DB를 설치하는 경우 컨테이너 삭제와 함꼐 데이터도 날라간다
# -v 볼륨 옵션의 -v /c/data/mysql 가 호스트 pc에서 사용할 디렉토리이다.
# 한글 깨짐 방지를 위한 옵션도 마지막에 넣어준다
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name mysql-test -v /c/data/mysql:/var/lib/mysql mysql:8.0.17 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
2) docker-compose.yml 파일 사용예시
전체적인 프로세스는 위와 같고, 이제 이렇게 매번 명령어를 그떄그때 치는 것 보다,
docker-compose.yml 파일을 생성하여 어디서도 동일한 환경으로 컨테이너를 올릴 수 있다.
같은 내용을 다른 방법으로 실행하는 것이라고 생각하면 된다.
- docker-compose.yml 작성 예시
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
db: # 서비스 명
image: mysql:8 # mysql 버전.
restart: always
container_name: mysql # 컨테이너 이름 설정
ports:
- "3305:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
environment: # -e 옵션
MYSQL_ROOT_PASSWORD : "password_mysql"
TZ : "Asia/Seoul"
command: # 명령어 실행
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- /c/data/mysql:/var/lib/mysql # -v 옵션 (다렉토리 마운트 설정 해당 폴더 생성 필요)
- 실행
# 모든 서비스 실행
docker-compose up
# 특정 서비스만 실행하고 싶다면
docker-compose run db(서비스명)
- 도커 클라이언트 프로그램에서도 잘 돌아가는걸 확인 할 수 있다.