본문 바로가기
Server & Network/Docker & Kubernetes

[Docker] 도커 허브(Docker Hub)를 활용한 MySQL 설치, 접속

by AustinProd 2023. 2. 13.

앞서 도커 이미지와 컨테이너에 대한 내용을 정리했다. 이번 포스트에서는 이러한 이미지를 보다 잘 유용하게 사용할 수 있게 도움 받을 수 있는 도커 허브(Docker Hub)에 대한 내용을 공유하고자 한다. 더불어, 실제로 도커 허브를 통해 mysql 이미지를 받아와 로컬에서 실행하는 작업도 같이 할 예정이다.

 

1. 도커 허브(Docker Hub)란?

도커 허브는 이름에서부터 어렴풋이나마 유추할 수 있듯, 도커를 통해 실행할 수 있는 이미지 소스를 저장하거나 빌려올 수 있는 저장소 개념이다. 깃허브와 같이 본인 계정을 등록하면 개인 저장소처럼 개인 저장소를 가질 수도 있고, 커뮤니티처럼 다른 사람과 이미지를 공유할 수 있다. 

 

도커 허브의 가장 큰 장점이라고 생각하는 점은 다양한 개발 환경 혹은 툴에 대한 공식 이미지를 무료로 이용할 수 있다는 점이다. 예를 들어, 개발자로서 우리들이 자주 사용하는 MySQL, MariaDB 같은 DB나 Ubuntu, CentOS와 같은 OS, 혹은 Apache, Nginx와 같은 웹서버를 이미지로 사용할 수 있다.

 

아래 본문에서는 이 중, MySQL 이미지를 받아와 실행해 보고, 외부 접근까지 해보는 과정을 소개할 예정이다.

 

도커 허브(Docker Hub)에서 제공하는 공식 이미지(Official Images) - 참고 : https://hub.docker.com/

 

2. MySQL 이미지 가져오기

MySQL 이미지를 받아오는 방법은 이 [ 링크 ]를 통에 상세히 소개되어 있다. 내가 코드 블록에서 전달하는 내용은 이미지를 어떻게 가져오는지, 컨테이너 생성에는 뭐가 필요한지, 실행과 종료에 대한 포괄적인 내용이다. 실행 명령어에 사용된 옵션 정보도 정리했다.

 

  • --name : 생성할 컨테이너 이름
  • -e : 환경 변수(env) 지정 (예제에서는 Root 사용자 비밀번호만 설정했다.)
  • -d : 백그라운드 실행 (해당 옵션이 없다면 포그라운드로 실행된다.)

 

# 최신 버전 MySQL 컨테이너 생성 및 실행
#   - 사용 가능한 대표적인 환경변수 목록
#      * MYSQL_ROOT_PASSWORD          : root 사용자 비밀번호
#      * MYSQL_RANDOM_ROOT_PASSWORD   : root 사용자 랜덤 비밀번호
#      * MYSQL_ALLOW_EMPTY_PASSWORD   : root 사용자 비밀번호 미지정
#      * MYSQL_ONETIME_PASSWORD       : root 사용자 로그인 시, 비밀번호 재설정 옵션 (=yes)
#      * MYSQL_DATABASE               : 컨테이너 생성 시, DB 스키마 자동 생성
#      * MYSQL_USER                   : 컨테이너 생성 시, 유저 등록 (MYSQL_PASSWORD와 함께 명시)
#      * MYSQL_PASSWORD               : 컨테이너 생성 시, 유저 비밀번호 등록

docker run --name [생성 컨테이너 이름] -e MYSQL_ROOT_PASSWORD=[루트 비밀번호] -d mysql:latest


# 실행 확인
docker ps

CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS          PORTS                               NAMES
dc46c78024c2   2846b2a84d49   "docker-entrypoint.s…"   3 days ago     Up 30 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   temp-mysql

 

# 이미지만 먼저 받아오고 싶은 경우
docker pull mysql:latest

# 등록 이미지 확인
docker images

REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
node         latest    0f3cb8409d59   1 days ago   948MB
mysql        latest    2846b2a84d49   1 days ago   531MB

 

3. 이미지 실행 및 Bash 환경에서 DB 접속

도커 이미지를 잘 받아왔다면, 아래 명령어를 참고해 컨테이너를 실행한다. 실행과 더불어 재실행, 종료 명령어도 참고로 적어두었다.

 

# 컨테이너 실행
docker start [컨테이너 이름]

# 컨테이너 재실행
docker restart [컨테이너 이름]

# 컨테이너 종료
docker stop [컨테이너 이름]

 

컨테이너 실행을 확인했다면, exec 명령어로 내부 터미널로 접근할 수 있다. -it 옵션은 interactive, teminal 옵션을 나타내며, 컨테이너에 터미널로 접속해 상호작용 할 것을 나타낸다. 뒤의 bash는 bash shell 환경을 이용함을 나타낸다.

 

# 컨테이너 내부 터미널 접속
#   - i : interactive. 컨테이너 표준 입력(STDIN) 확인
#   - t : tty. 터미널 환경(pseudo-TTY) 제공
docker exec -it temp-mysql bash

# 컨테이너 생성 시, 명시한 root 사용자 비밀번호로 DB 접근
mysql -u root -p

# 데이터 베이스 확인
show databases

 

4. 외부 접속

이제 외부에서 GUI 툴로 접근이 되는지 테스트해 볼 차례다. 그런데, 컨테이너 실행 시점에 입력한 값으로 연결을 시도하면, 아래 이미지와 처럼 접근할 수 없다는 에러가 발생한다. ( 원래 Azure Data Studio를 사용하지만, 에러 메세지 출력을 위해 Sequel Pro 이미지를 사용함을 밝힌다. )

 

문제 원인 지금 설치한 MySQL이 8.0 이상의 버전이라는 것과 내가 사용하는 GUI 툴에 있다. MySQL 버전을 5.0대로 낮추거나, TablePlus 같은 유료 툴을 사용하면 해당 에러를 피할 수 있다. 꼭 8.0 이상 버전을 그대로 사용하고 싶다면, 아래에 에러 핸들링방법을 적어두었다.

 

에러
MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded:

접속 실패 메세지

에러 메세지와 함께 앞의 문제 내용에 살을 더하면, 근본적인 원인은 MySQL 버전이 8.0 이상부터 비밀번호 인증 플러그인이 변경된 점에 있다. 직접 DB에서 조회해보니 caching_sha2_password가 DB 접근 옵션으로 지정되어 있고, 이 속성이 접근을 막고 있음을 알 수 있다.

 

mysql> select user, host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

 

해결방법으로 두 가지가 있는데, 가장 쉬운 방법은 예전 속성값이었던 mysql_native_password로 업데이트하는 것이다. 다른 방법은 mysql.cnf 파일에 기본 인증 플러그인 설정을 mysql_native_password로 넣어주고, DB를 재기동하는 방법이다. 지금 설정 파일을 만들고 컨테이너에 이를 읽게 하는 방법은 번거로우니 첫 번째 방법으로 진행한다.

 

# DB 사용자 플러그인 속성값 변경
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1234';

 

다시 접근을 시도하면 성공적으로 DB와 연결됨을 확인할 수 있다.

 

접속 성공

댓글