프로젝트를 진행하면서 어느정도 기능이 완성되었을 때 MySQL 로 DB 를 연결하기 위해 Docker 를 사용하기로 했다.
웹 서비스는 일반적으로 FE 서버 + BE 서버 + DB 서버 로 구성된다. 따라서 각 서버를 Docker Container 로 연결하여 동작시키고, Docker Compose 를 사용하여 해당 컨테이너들을 관리한다.
Docker 는 컨테이너화된 애플리케이션을 실행하기 위한 플랫폼이다.

Dockerfile : Docker 이미지를 빌드하기 위한 텍스트 파일Docker Image : 컨테이너 실행에 필요한 파일 시스템과 종속성을 포함한 읽기 전용 플랫폼Docker Container : 이미지를 실행한 가볍고 격리된 프로세스Docker Compose 는 여러 개의 docker 컨테이너를 모아서 관리하기 위한 툴이다.
docker-compose.yml 은 Docker 컨테이너에 관한 실행 옵션을 기재한 파일이다.
💡 Docker 와 Docker Compose 는 서비스를 수행하는 과정에 차이가 있다.
Docker 로 해당 서비스를 수행한다고 할 때, 다음과 같이 매번 docker run 옵션을 설정해 CLI 컨테이너를 생성해야 한다.
ex)
# MySQL 컨테이너 생성
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest
# Apach 컨테이너 생성
docker run -d --name apache -p 8080:80 httpd
Docker Compose 는 위와 같은 번거로움을 해결하기 위해 여러 컨테이너를 하나의 서비스로 묶어 다룰 수 있는 작업 환경을 제공한다.

# 설치 버전 확인
docker -v
# 권한 에러가 뜰 수 있기 때문에 sudo 로 image 확인
sudo docker images
# Docker Compose 설치
sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-`uname -s`-`uname -m` | sudo tee /usr/local/bin/docker-compose > /dev/null
# 권한 변경
sudo chmod +x /usr/local/bin/docker-compose
# 심볼릭 링크 설정
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 설치 확인
docker-compose --version
# 이미지 설치
docker pull <image>
ex) MySQL : docker pull mysql
# 다운로드 된 이미지 확인
docker images
docker-compose.yml✓ 옵션별 설명
version: YAML 파일 포캣 버전을 나타낸다. (일반적으로 버전 3을 사용한다.)service: 생성될 컨테이너들의 묶음을 나타낸다.image: 생성할 Docker Cotainer 의 이름을 정의한다.container_name: 컨테이너 이름을 설정한다.volumes: docker run 명령의 -v 옵션과 동일한 역할을 한다.restart: Docker Contatiner 가 다운되었을 때, 항상 재시작하도록 설정한다.environment: Dockerfile 의 ENV 옵션과 동일한 역할을 한다.command: docker run 명령어 마지막에 붙는 설정값이다.networks: 컨테이너 간의 네트워크 연결을 정의한다.
ㄴ ※ docker-compose 는 network 가 기본적으로 설정된다고 하던데 따로 추가해 줘야 하는지는 모르겠다
version: '3'
services:
mysql:
image: mysql:8.0
restart: always
container_name: mysql-container # 컨테이너 이름 수정 가능
ports:
- "3306:3306" # 포트 수정 가능
environment: # .ENV 파일 생성 후 아래 값들을 넣어준다.
MYSQL_DATABASE: "${DATABASE}"
MYSQL_USER: "${USER}"
MYSQL_PASSWORD: "${PASSWORD}"
MYSQL_ROOT_PASSWORD: "${ROOT_PASSWORD}"
TZ: Asia/Seoul
command:
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --range_optimizer_max_mem_size=16777216
volumes:
- ./data/mysql/:/var/lib/mysql
- ./mysql/initdb.d:/docker-entrypoint-initdb.d
# 컨테이너 생성 및 실행
docker-compose up
# 실행 중인 컨테이너 조회 / 전체 조회 시 옵션 `-a` 사용
docker ps
# 컨테이너 접속
docker exec -it mysql-container bash
# 컨테이너 종료
docker-compose down
그럼 다음과 같이 접속된 걸 확인할 수 있다.

# ROOT 로 접근
mysql -u root -p
# 사용자 추가
# 방1. localhost 에서만 접속 가능한 계정 생성
mysql> use mysql;
mysql> create user '<username>'@'localhost' identified by '<password>';
mysql> grant all privileges on *.* to '<usernmae>'@'localhost';
mysql> flush privileges;
# 방2. 모든 DB, 테이블에 접속 가능한 계정 생성
mysql> use mysql;
mysql> create user 'sa'@'%' identified by '<password>';
mysql> grant all privileges on *.* to 'sa'@'%';
mysql> flush privileges;```
