Infra/Docker

[Docker] 도커와 MySQL을 연동하여 사용하는 방법 (feat. IntelliJ)

kth990303 2022. 4. 23. 21:33
반응형

우아한테크코스에서 웹과 db를 연동해야 하는 웹 체스 미션이 주어져서 도커를 사용하게 되었다.

도커(docker)는 애플리케이션을 편리하게 구축하고 배포할 수 있도록 기술들을 컨테이너로 관리하는 오픈 소스 플랫폼이다.

 

도커를 이용하면 사용자들의 로컬에 mysql이 깔려있지 않더라도 도커의 mysql을 이용하여 애플리케이션을 실행시킬 수 있으므로 환경에 구애받지 않고 편리하게 작동할 수 있게 해준다.

미션을 진행하면서 알게 된 도커 사용법을 간단하게 기록하려 한다.


docker desktop을 설치하자

아래 홈페이지에서 도커를 설치하자.

https://www.docker.com/get-started/

나는 맥북 m1을 이용중이었기 때문에 빨간 박스로 칠한 부분을 클릭해주었다.


docker 환경설정

프로젝트 폴더 내에 docker 폴더를 만들어주도록 하자.

cd docker

터미널에서 위 명령어를 입력해주어 docker 폴더로 들어가주도록 하자.

docker 폴더 내부에 docker-compose.yml을 만들어주고, mysql 연동을 위해 아래와 같이 입력해주자.

version: "3.9"
services:
  db:
    image: mysql:8.0.28
    platform: linux/x86_64
    restart: always
    ports:
      - "3306:3306"	// mysql 기본 port
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: chess	// database 이름
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      TZ: Asia/Seoul
    volumes:
      - ./db/mysql/data:/var/lib/mysql
      - ./db/mysql/config:/etc/mysql/conf.d
      - ./db/mysql/init:/docker-entrypoint-initdb.d

나는 chess 웹 미션을 진행중이었기 때문에 MYSQL_DATABASE 이름은 chess로 설정해주었다.

 

그리고 mysql을 연동해줄 예정이었기 때문에 mysql 기본 포트인 3306으로 설정해주었다.

만약 3306 포트를 이미 사용중이라면 13306:3306, 23306:3306과 같이 변경해주면 된다.

버전은 8.0.28 버전을 이용하였다.


docker 컨테이너에 서비스를 등록시키자.

init.sql로 테이블을 만들어주자.

도커를 실행하여 배포하기 전에, 먼저 mysql 폴더의 init 폴더를 생성해준 후, init.sql을 만들어주어 미리 테이블을 생성시켜주자.

도커 내 mysql의 테이블을 만들어주는 것이다.

참고로 config 폴더와 data 폴더는 무시하면 된다. 나중에 도커 컨테이너로 생성 및 실행하면 자동으로 생성되는 폴더들이다.

 

init.sql을 만들어주었다면, 이제 테이블들을 생성하고 애플리케이션을 실행시키기 위해 도커 컨테이너로 등록시켜주자.

// 도커에 서비스를 컨테이너로 생성 및 실행시켜주자
docker-compose -p {서비스명} up -d

// 도커 컨테이너 목록 확인 명령어
docker ps

// 이전에 도커에 등록됐었던 서비스를 컨테이너에서 삭제해주고 싶을 경우
docker-compose -p {서비스명} down

도커 컨테이너로 서비스를 등록시키기 위해선 up 명령어를 입력해주어야 한다.

docker 폴더로 이동 후, docker-compose -p {서비스명} up -d 명령어를 입력해주어 도커 컨테이너로 등록시켜주자.

등록시켜주면 도커가 알아서 서비스를 실행시켜준다.

 

등록 후에 docker ps 명령어로 서비스가 잘 등록됐는지 확인해주자.

등록해주었다면 mysql 폴더 밑에 config, data 폴더들이 자동으로 생성됐을 것이다.

data 폴더 아래에 굉장히 많은 파일들이 생성됐을 것이다. (1~2분 정도 소요)

만약, 위처럼 많은 파일들이 생성되지 않았다면 아직 준비중이라는 것과 같으므로 천천히 기다려보도록 하자.

 

+) data 폴더가 아무리 기다려도 정상적으로 생기지 않을 경우는 아래 그림처럼 docker-compose -p {서비스명} down 명령어로 삭제시킨 후 재등록해주자. (그 외에 mysql error 들이 발생할 경우에도 아래 절차를 진행!)

jwp-chess 컨테이너를 지워보자.
jwp-chess를 down해주자. 반드시 docker 폴더에서 해주어야 한다.

down할 때, mysql 내에 있는 data 폴더도 반드시 삭제해주도록 하자.

그래야 새로 컨테이너에 등록할 때 올바른 데이터 파일들이 제대로 생길 수 있다.

성공적으로 삭제됐다.

삭제한 이후에 다시 up 명령어를 위 내용을 참고해서 실행시켜 컨테이너에 등록시킨 후, data 폴더 파일들이 생성될 때까지 기다려주자.


등록한 컨테이너를 실행해주자

docker exec -it {서비스명의 name} bash

위 명령어를 입력해주어 컨테이너를 실행시켜주도록 하자.

exec은 execute의 줄임말이고, bash는 실행하라는 명령어이다.

 

주의할 점은, docker ps 명령어로 확인된 빨간 박스 안의 NAMES의 이름을 bash해주어야 한다는 점이다!

또 주의할 점은, docker 폴더 내부에서 위 명령어를 입력해주어야 한다는 점이다.

 

입력해준 후, 위 그림처럼 뜨면 성공이다.

mysql -u {mysql id} -p{mysql password}

// 또는 아래와 같이 입력
mysql -u {mysql id} -p

이제 mysql 을 실행시켜주면 제대로 작동될 것이다~

 

+) 아래와 같은 에러들이 발생할 수 있다.

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

 

둘 다 data 폴더 내 파일들이 제대로 생성되지 않은 경우이다.

차분히 기다려보고 다시 mysql -u root -p 명령어를 입력해주면 제대로 실행될 것이다.

정말 오래 기다려도 실행되지 않는다면 위 내용을 참고해서 down 명령어로 컨테이너에서 삭제시켜주고 재등록해주자.


간단 요약

  • docker-compose.yml, init.sql 생성!
  • docker-compose -p {서비스명} up -d
  • docker exec -it {서비스명의 name} bash
  • mysql -u root -proot

 

로컬에 mysql 을 설치할 필요 없이, 도커로 행복코딩을 할 수 있다는 점이 만족스러웠다.

다만, 도커에 익숙하지 않았기 때문에 여러 에러들을 많이 겪었는데 (특히 1045...) down, up 명령어를 많이 입력한 덕분에 지금은 아예 외워버렸다.

나같은 사람이 또 생기질 않길 바라는 마음으로 환경세팅 포스팅을 올려본다~

 

반응형