Docker 로 MySQL 설치하고 접속까지

Seunghee Lee·2024년 3월 20일

캡스톤

목록 보기
8/10

프로젝트를 진행하면서 어느정도 기능이 완성되었을 때 MySQL 로 DB 를 연결하기 위해 Docker 를 사용하기로 했다.

📍 Docker 와 Docker Compose 이해하기

웹 서비스는 일반적으로 FE 서버 + BE 서버 + DB 서버 로 구성된다. 따라서 각 서버를 Docker Container 로 연결하여 동작시키고, Docker Compose 를 사용하여 해당 컨테이너들을 관리한다.

Docker

Docker 는 컨테이너화된 애플리케이션을 실행하기 위한 플랫폼이다.

  • Dockerfile : Docker 이미지를 빌드하기 위한 텍스트 파일
    • 애플리케이션의 구성과 종속성을 정의한다.
  • Docker Image : 컨테이너 실행에 필요한 파일 시스템과 종속성을 포함한 읽기 전용 플랫폼
    • Dockerfile 로 정의되며, Docker 이미지 레지스터에 저장되고 공유될 수 있다.
  • Docker Container : 이미지를 실행한 가볍고 격리된 프로세스
    - 호스트 시스템의 리소스를 공유하고, 독립적으로 실행된다.
    - 애플리케이션과 종속성을 격리된 환경에서 실행할 수 있게 한다.

Docker Compose

Docker Compose 는 여러 개의 docker 컨테이너를 모아서 관리하기 위한 툴이다.

  • docker-compose.yml 은 Docker 컨테이너에 관한 실행 옵션을 기재한 파일이다.


Docker Compose 를 사용하는 이유

  • Docker Compose 가 관리나 가독성 측면에서 효율적이다.
  • Docker 와 Docker Compose 를 함께 사용하면 애플리케이션의 구성 및 실행, 관리를 단순화하고 일관성을 유지할 수 있다.

💡 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 Compose 사용하기

1️⃣ Docker 와 Docker Compose 설치

  1. 여기서 자신의 환경에 맞는 docker 를 설치한다.
	# 설치 버전 확인
	docker -v

	# 권한 에러가 뜰 수 있기 때문에 sudo 로 image 확인
    sudo docker images
  1. Docker Compose 설치를 위해 터미널에서 다음 명령어 실행한다.
	# 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
  1. 설치하고자 하는 Docker Image 파일을 검색 후, 다음 명령어 실행한다.
    # 이미지 설치
    docker pull <image>
    
   	ex) MySQL : docker pull mysql
    
    # 다운로드 된 이미지 확인
    docker images

2️⃣ 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 가 기본적으로 설정된다고 하던데 따로 추가해 줘야 하는지는 모르겠다
  1. 프로젝트 상위에 docker 폴더를 생성 후 그 안에 docker-compose.yml 를 생성한다. 그리고 다음과 같이 입력한다.
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

3️⃣ 실행 및 컨테이너 접속

  1. docker compose 를 실행하고 컨테이너에 접속한다. 이때 접속 위치는 docker 폴더 내에서 진행한다.
# 컨테이너 생성 및 실행
docker-compose up

# 실행 중인 컨테이너 조회 / 전체 조회 시 옵션 `-a` 사용
docker ps

# 컨테이너 접속
docker exec -it mysql-container bash  

# 컨테이너 종료
docker-compose down

그럼 다음과 같이 접속된 걸 확인할 수 있다.

  1. 이제 마지막으로 DB 사용자와 권한을 설정한다.
# 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;```
  1. DataGrip 과 같은 DB 툴로 연결이 잘 되는 지 확인해보자. (참고로 포트의 default는 3306 이다.)
profile
자라나라 개발개발 ~..₩

0개의 댓글