본문 바로가기
기타/기타

Docker를 통해 MySQL 컨테이너 사용하기

by 프로그래밍 공부 2024. 8. 9.

 Docker를 통해 MySQL 컨테이너를 생성하고 이를 프로젝트에 적용하는 법을 학습하려고 한다. 

우선 Docker를 통해 컨테이너를 만드려는 프로그램의 이미지를 받아야 한다. 

MySQL 컨테이너를 만들기 위해서는 역시 MySQL 이미지를 받아야 하는데 이는 Shell을 통해서도 가능하고

Docker 프로그램을 통해서도 가능하다. 

이런 식으로 검색을 하면 mysql 이미지들이 뜬다.

이를 pull하면 이미지 탭에 위와 같이 뜨는 걸 확인할 수 있다.

 

Shell을 통해 mysql 이미지를 pull하기 위해서는 간단하게 명령어를 통해 수행할 수 있다.

이렇게 pull을 하고 난 뒤 현재 존재하는 이미지를 조회하면 

기존의 mysql 이미지 말고 새로운 mysql이미지를 확인할 수 있다.

 

이렇게 받은 이미지를 통해 MySQL 컨테이너를 만들고 실행하여 프로젝트와 연동할 수 있다. 

(여기서 새로운 MySQL 이미지를 받게 되면서 기존의 MySQL 이미지는 dangling 이미지가 되어 버렸다.

dangling 이미지는 태그가 없는 이미지로 더 이상 사용되지 않는다. 이 상황에서는 새로 받은 MySQL 이미지가 최신 버전이기 때문에 기존의 것이 더 이상 사용되지 않기 때문에 전환된 것 같다. 즉, 새로운 이미지가 기존의 이미지를 대체했기 때문이다. 

Docker는 Garbage Collector가 없기 때문에 이렇게 사용되지 않는 이미지를 능동적으로 삭제해 메모리를 확보하지는 않는다. 그래서 직접 삭제를 해줘야 한다. 

위와 같이 docker 명령어에서 image들을 확인하는 images를 입력한 다음 filter를 설정하는 -f 명령어와 함께 dangling 상태가 true인 이미지를 검색하는 명령어 -f "dangling=true"를 입력하면 dangling 이미지들만 검색하게 된다.

이렇게 확인된 dangling 이미지를 지우기 위해서는 prune 명령어를 사용하면 된다. 

prune 명령어는 사용되지 않는 데이터를 정리하는데 사용되는데, 기본적으로 사용되지 않는 모든 dangling 이미지를 삭제한다. 예시를 위해 최신 redis 이미지도 받아서 한 번에 지워지는지 체크해봤다.

다음과 같이 dangling 이미지는 redis, mysql 이미지가 검색되며, prune 명령어를 작성하니 경고와 함께 모든 dangling 이미지를 삭제하겠냐고 물어본다. 여기서 y를 입력하면

위와 같이 최신 이미지만 남고 dangling 이미지는 삭제된 것을 볼 수 있다. )

 

다시 돌아가서, 이미지를 pull했으니 남은 것은 컨테이너 생성과 실행, 프로젝트와 연동이 남았다.

우선 컨테이너를 생성하고 실행해보자.

docker 명령어에서 run은 새로운 컨테이너를 생성하고 실행하는 명령어다.

다음으로 --name 은 생성된 컨테이너의 이름을 작성하는 명령어이고, -e 는 환경 변수를 설정하는 명령어다. MySQL 컨테이너를 생성할 때 MYSQL_ROOT_PASSWORD를 입력하라고 뜨기 때문에 설정해줘야 한다. 그 뒤 -p는 호스트와 컨테이너의 포트를 맵핑하는 명령어인데, 여기서 나는 3306 포트를 사용하고 있기에 3307로 맵핑해 주었다. 그 후에 -d 명령어를 통해서 detached mode를 적용한다. 이를 사용하면 컨테이너가 백그라운드에서 실행되고, 터미널은 즉시 제어권을 반환받아서 다른 작업을 계속할 수 있게 된다. 마지막으로 사용할 이미지를 입력하면된다. 

-d 명령어에서 설명한 Detached Mode는 컨테이너가 백그라운드에서 실행되도록 하는 명령어이며, 이를 적용할 시 터미널이 즉시 반환되서 다른 작업을 계속할 수 있도록 한다. 적용하지 않을 때는 Foreground Mode라고 하며 컨테이너의 로그와 출력이 터미널에 표시되고, 터미널이 컨테이너에 묶여서 다른 작업을 할 수 없게 된다. 아래와 같이 로그가 쌓이는 것이다.

$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=root_password -p 3306:3306 mysql:latest
2021-08-08T08:00:00.000000Z 0 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.34-1debian10 started.
2021-08-08T08:00:00.000000Z 1 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-08-08T08:00:01.000000Z 2 [Note] [Entrypoint]: MySQL init process done. Ready for start up.

 

그 외에도 -e MYSQL_DATABASE=" " 와 같이 환경변수를 설정하는 명령어를 통해 데이터베이스를 생성하고, 사용자 이름과 비밀번호를 설정할 수도 있다. 

 

이렇게 명령어를 통해 생성하고 실행된 컨테이너 확인을 위해 MySQL 워크벤치를 통해 연결해보자.

컨테이너를 생성할 때 작성했던 포트 번호와 패스워드를 작성해서 넣으면 끝이다.

이렇게 연결된 MySQL 컨테이너가 제대로 연결된 건지 확인을 위해 MySQL 컨테이너와 연결하고 test 데이터베이스를 생성했다.

 

위와 같이 mysql 컨테이너 내부로 접속하고 클라이언트를 실행한 뒤 test 데이터베이스를 만들었더니

워크벤치에서도 반영된 모습이다. 워크벤치와 도커의 연동은 끝났다.

 

마지막으로 컨테이너와 프로젝트 사이의 연동을 해보자. 

컨테이너에 접근할 수 있는 포트번호와 DB 이름, root id와 password는 민감한 정보이기 때문에 환경변수를 사용해 yml 파일에 적용하는 것이 좋다고 생각한다.

yml 파일에는 위와 같이 환경변수로 설정해서 해당 정보를 감추고

그 후 프로젝트 루트 디렉토리에 .env파일을 만든 다음 다음과 같이 작성하면 환경변수를 통한 프로젝트 연동은 끝이 난다.

마지막으로 .env 파일을 .gitignore 파일에 추가해주기만 하면 깃에는 환경변수 파일이 들어가지 않아서 조금은 안심할 수 있다.