Notice
Recent Posts
Archives
Today
Total
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Recent Comments
관리 메뉴

우당탕탕 개발일지

[MySQL] docker 에서 MySQL 사용하기 (생성에서 매핑까지) 본문

Database

[MySQL] docker 에서 MySQL 사용하기 (생성에서 매핑까지)

devchop 2023. 7. 7. 01:03

개발환경 : macos

docker 홈페이지에서 docker desktop download.

다운로드 후 터미널에서 docker --version 명령어를 통해 정상적으로 다운받아졌는지 확인이 가능하다.

https://www.docker.com/products/docker-desktop/

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

MySQL docker image 다운로드

docker pull mysql
docker pull mysql:8.0.22  ## 특정버전을 다운받고싶을때

docker images ## 다운받은 이미지리스트 확인가능

특정 버전을 다운받고싶을때 홈페이지에 가서 버전을 확인한다.

https://hub.docker.com/_/mysql/?tab=tags 

 

mysql - Official Image | Docker Hub

Quick reference Supported tags and respective Dockerfile links 8.0.33, 8.0, 8, latest, 8.0.33-oracle, 8.0-oracle, 8-oracle, oracle 8.0.33-debian, 8.0-debian, 8-debian, debian 5.7.42, 5.7, 5, 5.7.42-oracle, 5.7-oracle, 5-oracle 5.7.42-debian, 5.7-debian, 5-

hub.docker.com

 

docker container 생성

$ docker run -it --name <name> -e MYSQL_ROOT_PASSWORD= "<password>" -d -p 3306:3306 mysql:latest

<name> 란에는 이름을, <password> 란에는 비밀번호를 입력한다.

docker ps 명령어를 통해 현재 실행중인 도커 컨테이너 리스트를 확인할 수 있다. 하나 생성된것을 확인할 수 있음.

 

docker container 실행 및 MySQL 접속

docker exec -it <conatinerName> /bin/bash #cotainer 실행
mysql -uroot -p #mysql 에 접속

 

 

아까 container 생성 시에 정해줬던 <name> 을 이용해서 컨테이너를 실행할 수 있다. (나의경우db001) 비밀번호는 컨테이너 생성할때 입력했던 <password>

 

container 외부에서 mysql 접속하도록 세팅하기

-p 3306:3306 옵션은 3306 포트를 열어놓고 container의 외부에서 mysql에  접근 가능하도록 하기 위한 옵션이다.

위 설정을 했다면, 터미널 상태에서 바로 mysql에 접속할 수 있다 . 

근데  mysql client 가 설치되어있어야 한다. 설치하는 방법은 다음과 같다.

# bomebrew 가 설치되어있지 않다면 설치먼저 해주자. 이미깔려있다면 패스!
 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
 
 #homebrew 설치후에도 정상적으로 깔리지 않았다면 다음 두 개의 명령어를 입력한다.
 echo 'export PATH=/opt/homebrew/bin:$PATH' >> ~/.zshrc
 source ~/.zshrc
 
 brew --version # 정상설치 확인!
 
 # 설치되어있다면
 brew install mysql
 brew install mysql-client

#정상설치 확인하기
mysql --version

#mysql 원격접속 방법은 다음과 같다. 포트번호는 기본 3306 이니까 생략하겠다. 
#여기서 ip주소는 docker가 올라가있는 ip의 주소로, aws위에서 도커 사용중이라면 aws의 ip주소가 되겠다.
#나는 로컬에 깔았으니까 로컬ip주소를 입력했다
mysql -uroot -p -h <ipaddress>

 

 

docker 에서 mysql 을 사용할 경우, container가 삭제되면 저장한 데이터까지 삭제되는 문제가 있음. 이를 위해 , db 데이터를 container 외부 공간과 공유하여 저장하게끔 하여 container가 삭제되더라도 데이터가 남아있게끔 하는 작업이 필요함.

 

mkdir -p <db데이터를 저장하고자 하는 폴더>
chmod 777 <db데이터를 저장하고자 하는 폴더>

docker run -it --name <db이름> -p 3306:3306 -v <db데이터를 저장하고자하는 폴더>:/var/lib/mysql -e MYSQL_ROOT_PASSWORD="<비밀번호>" -d mysql:latest


# 이렇게사용하자
mkdir -p /db/db001/data
chmod 777 /db /db/db001 /db/db001/data #모든 폴더에 접근권한 부여
docker run -it --name db001 -p 3306:3306 -v /db/db001/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD="<비밀번호>" -d mtsql:latest

참고로 호스트에 있는 경로이름은 내맘대로 정하도록 하자 나의경우 container 이름이 db001 이라 이렇게만들었다. 

이렇게 할 경우 host컴퓨터(로컬) 내의 /db/db001/data 와 container 내의 /var/lib/mysql  폴더는 공유하고있는 상태가 된다. 

 

데이터 저장소 뿐만 아니라, log나 config 디렉토리 또한 공유하는것이 좋음. 


#디렉토리가 아직 없을 경우 host에서 폴더와 파일을 생성해줌. 
mkdir /db/db001/log /db/db001/conf
chmod 777 /db/db001/log /db/db001/conf

cd /db/db001/conf
vi my.cnf  #conf 파일을 생성해줌, 기본 세팅값 복사해넣기. 기본세팅값은 아래에 있음. 
chmod 644 my.cnf #생성한 파일 또한 권한 부여

 

my.cnf  /db/db001/conf/my.cnf 파일에 아래 내용을 붙여넣는다.

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server           = utf8mb4
collation-server               = utf8mb4_unicode_ci

skip-external-locking

skip-host-cache
skip-name-resolve

결론

#-v 옵션 정리
-v /db/db001/data:/var/lib/mysql # data 폴더 공유 (필수, db데이터 저장소)
-v /db/db001/log:/var/log/mysql #log 폴더 공유
-v /db/db001/conf/my.cnf:/etc/mysql/my.cnf #config 파일 공유

# run 명령어(매핑,원격접속,이름,비밀번호설정 완료)
docker run -it --name db001 -p 3306:3306 \
-v /db/db001/data:/var/lib/mysql \
-v /db/db001/log:/var/log/mysql \
-v /db/db001/conf/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD="<password기입>" \
-d mysql:latest

#정상적으로 실행되었는지 확인, 원하는 정보만 --format 옵션을 사용하여 추출하기
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"