MySQL을 연동해 보자 그리고 Volume을 사용해 보자
들어가며
데이터베이스를 Docker 컨테이너에 올리고 워크벤치를 통해 원격으로 접속하는 방법에 대해 살펴보겠습니다. 또한 Docker의 지정된 볼륨과 호스트 컴퓨터의 볼륨을 만드는 방법도 함께 알아보겠습니다.
MySQL 컨테이너 생성하기
원격으로 접속하기 위해서는 일단 도커 컨테이너에 MySQL컨테이너가 있어야 한다. 일단 우리는 도커파일을 통해서 MySQL을 컨테이너에 올려보자.
- mysql-volume : 호스트가 볼륨을 설정하는 디렉터리
이제 이미지를 도커에 올리기 위해서 도커파일을 작성해 보자
Dockerfile
FROM mysql:8.0.33
ENV MYSQL_USER=blog
ENV MYSQL_PASSWORD=a1234
ENV MYSQL_ROOT_PASSWORD=root1234
ENV MYSQL_DATABASE=blogdb
CMD ["--character-set-server=utf8mb4","--collation-server=utf8mb4_unicode_ci"]
ENV : 명령어는 환경변수를 설정하는 명령어입니다.
CMD : 시작될 때 실행되는 기본 명령어입니다.
현재 저는 워크벤치 버전을 8.0.33 을사용하고 있습니다. 다른 버전을 사용하고 계신다면 도커허브(MySQL)에 접속하여 원하는 버전을 찾아서 mysql:<버전> 입력하시면 됩니다.
도커파일을 실행해 컨테이너에 올려보자
- 이미지 명을 mysql_img로 만든다.
- 컨테이너에 백그라운드에 실행하며 포트 포워딩으로 3307번으로 변경해 준다(포워딩을 사용하지 않으면 기존 워크벤치가 3306 포트를 사용하고 있어서 원격접속 실패) --name을 통해 컨테이너명을 설정
- 현재 컨테이너를 확인하고 STATUS가 UP으로 되어 있다면 정상적으로 작동 중인 것을 볼 수 있다.
MySQL 워크벤치에 연동하기
+ 버튼을 클릭한다.
- 사용할 커넥션 이름을 작성한다
- 포트번호를 docker 파일에 작성한 3307을 작성한다.
- 도커파일의 정의한 MYSQL_USER를 작성한다.
- 도커파일의 작성한 MYSQL_PASSWORD를 작성한다.
- 테스트를 진행해 Successfully... 창이 나오면 성공한 것이다. 만약 성공하지 못했다면... 해결해 보시길..
우리가 만든 커넥션에 들어가 보면 환경변수로 데이터베이스를 정의했던 blogdb가 생성된 것을 볼 수 있다. 이러면 원격으로 연결을 성공한 것이다.!!
도커의 볼륨
이제 테이블을 생성하고 값을 넣고 나서 컨테이너를 중지했다가 다시 시작해 커넥션에 다시 진입해서 테이블을 조회해 보자 그러면 우리가 이전에 넣었던 값이 출력될까?
하지만 조회되지 않고 데이터 베이스를 찾을 수 없다고 나온다.
왜 그럴까? 이유를 알기 전에 볼륨에 대해서 이해를 하고 가야 한다.
볼륨이란?
도커의 볼륨은 도커 컨테이너가 생성되고 실행될 때 컨테이너와 호스트 시스템 간에 데이터를 공유하거나 저장하기 위한 메커니즘입니다. 이를 간단하게 설명하자면, USB 저장소와 비슷한 역할을 한다고 생각할 수 있습니다.
그렇다면 왜 오류가 발생할까?
일반적으로 이런 오류는 도커 컨테이너에 볼륨을 설정하지 않고 실행할 경우 발생합니다. 기본적으로 도커는 컨테이너가 실행될 때 일회성 볼륨을 생성하여 컨테이너의 생명 주기 동안 데이터를 보관한다. 이는 컨테이너가 종료되면 볼륨이 삭제되고, 다시 시작할 때마다 새로운 볼륨이 생성되어 이전에 저장된 데이터가 초기화되는 결과를 초래할 수 있습니다.
볼륨 설정을 어떻게 할까?
데이터를 영구적으로 보관하기 위해서는 볼륨을 명시적으로 설정해주어야 합니다. 볼륨 설정 방법에는 호스트 저장 방식과 도커 내부에 저장하는 방식이 있습니다. 이러한 설정을 통해 데이터의 영구 보존이 가능합니다.
볼륨을 사용하지 않은 컨테이너
초반에 만들었던 컨테이너를 다시 시작한 후 db에 값을 넣었다고 가정해 봅시다.
생성 후 볼륨을 확인해 보면 현재 하나의 볼륨이 생성되어있습니다. 이 볼륨에는 db에 삽입한 데이터가 존재할것입니다. 이제 컨테이너를 삭제후에 값을 확인해보면 값이 없는 것을 확인해 볼 수 있습니다.
도커 내부 볼륨 사용한 컨테이너
도커 내부의 볼륨을 사용해 데이터를 영구적으로 저장하기
docker volume create <사용할 볼륨 명>
명령어를 통해 볼륨을 생성한다.
docker run -d -v <생성한 볼륨 명>:<mysql 저장소 위치> -p <사용할 포트명>:3306 --name <컨테이너명> <이미지명>
명령어를 통해 컨테이너를 실행한다.
원격으로 접속하여 db에 값을 생성 후 넣고 컨테이너를 삭제 후 다시 컨테이너를 시작해 보자 그러면 컨테이너를 삭제하기 전 값이 동일하게 출력되는 것을 볼 수 있다.
호스트 내부에 볼륨 폴더를 사용한 컨테이너
도커 내부 볼륨을 사용하는 방법이라 비슷하다. 단지 도커 내부에서는 내부에 볼륨 파일을 만들어서 하는 거었지만 호스트 내부는 호스트에 파일을 만들어 저장하는 방법이다.
docker run -d -v <생성한 호스트 파일명>:<mysql 저장소 위치> -p <사용할 포트명>:3306 --name <컨테이너명> <이미지명>
앞에서 파일 구조를 보면 미리 mysql-volume 파일을 생성한 것을 볼 수 있다. 이제 이 파일을 볼륨으로 지정할 것이다.
내부 파일을 볼륨으로 설정해 컨테이너를 실행하면 정상적으로 실행되는 것을 볼 수 있다. 이제는 도커의 볼륨을 사용하는 것이 아닌 우리가 호스트 내부에 생성한 도커 폴더를 사용하기 때문에
폴더 안에 mysql정보들이 들어가 있는 것을 볼 수 있다. 똑같이 값을 넣고 삭제후 다시 컨테이너를 실행해보면 동일한 값이 나오는것을 볼수있다.
'Devops > 도커' 카테고리의 다른 글
[Docker] 도커 허브(Docker hub)에 리파지토리(Repository)에 저장하기 및 다운받기 (0) | 2024.02.03 |
---|---|
[Dokcer] docker-compose로 도커컨테이너 실행하기 (0) | 2024.02.02 |
[Docker] nginx 설정파일 커스텀 해보기 (1) | 2024.01.31 |
[Docker] Docker파일 작성방법 및 실행해보기 (1) | 2024.01.31 |
[Docker] 헬스체크와 디펜던시 체크란? (1) | 2024.01.27 |