MySQL을 도커에서 작동시키기

0

개발지식공부

목록 보기
3/6

MySQL & Docker

MySQL :

먼저 MySQL을 도커에 올리게 된 계기라 하면 현재 학부생 인턴으로 실험을 진행하면서 여러 오픈 소스 웹 앱들을 다루고 있는데 그 중 몇가지는 예전 버전의 MySQL을 사용할 때가 있다. 로컬 환경에서는 단 하나의 MySQL을 설치할 수 밖에 없기 때문에 여러 오픈 소스 웹 앱들을 작동시킬 때마다 버전을 바꿀 필요가 생기게 된다.

이러한 문제점을 해결하기 위해서 MySQL을 도커에 올려서 작동시키고 여러 버전을 동작시킴으로써 필요에 맞게 알맞은 로컬 포트의 데이터베이스에 접근하도록 설정할 수 있다.

예를 들면 git에서 해당 웹 앱이 있다.(https://github.com/manhduydl/Shopping-web-Jsp-Servlet) 이 웹 앱의 경우 MySQL 버전 5에 접근하는 자바 코드를 가지고 있어서 MySQL 버전이 바뀔 경우 DBConnect.java의 코드를 전체적으로 수정해야할 필요성이 생긴다.

MySQL 도커 이미지 파일 :

공식 이미지는 다음 사이트에서 구할 수 있다. 이 외에도 git이나 도커 홈페이지에서 여러 이미지들을 구할 수 있다.
(https://hub.docker.com/_/mysql)

현재 살펴보면 버전5, 버전8 두가지가 존재한다. 여기서 나는 버전5를 다운받아 사용할 것이다.

$ docker run --name mysql-5 -e MYSQL_ROOT_PASSWORD={password} -d mysql:5 -p {로컬포트}:3306

{로컬포트}는 3306 같은 경우 이미 mysql이 설치되어 있는 경우 사용하지 못할것이므로 다른 포트를 이용해서 개방해야한다. 이렇게 되면 웹 앱에서 jdbc를 이용하여 DB에 접근할 경우 포트 번호를 방금 이미지에서 설정해준 포트로 작성하면된다.

예를들어 9999:3306으로 포트를 매핑할 경우, localhost:9999로 들어오는 요청이 mysql 컨테이너의 3306포트로 연결이 된다!!

이미지가 존재하지 않으면 자동으로 pulling 하고 컨테이너로 실행까지 완료되게 된다.

실제 사용 예시

실제로 다음의 명령어를 사용하여 mysql 버전 5 이미지를 실행시키고 로컬호스트의 3000번 포트에 매핑해놓았다.

$ docker run --name mysql-5 -e MYSQL_ROOT_PASSWORD=root -d mysql:5 -p 3000:3306

그렇다면 웹 앱의 jdbc에서 mysql 주소를 다음과 같이 입력하게 된다.

public class DBConnect {

	public static Connection getConnecttion() {
		Connection cons = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			cons = DriverManager.getConnection(
					"jdbc:mysql://localhost:3000/shopping", "root", "root");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cons;
	}
	
	public static void main(String[] args) {
		System.out.println(getConnecttion());
	}

}

3000번대 포트 주소를 작성해주고 있고 /shopping이라는 것을 보아 shopping 데이터베이스에 접근하고 있는 것을 알 수 있다.

소감

도커를 자주 사용했음에도 불구하고 처음에 포트를 매핑할 때 로컬포트와 컨테이너 내부 포트를 똑같이 설정해놓고 왜 접속이 안돼??? 하면서 어려워했었다. mysql자체가 내부 컨테이너에서 3306 기본 포트로 작동되고 있기 때문에 로컬 포트를 3306포트로 매핑시키는걸 깨닫기까지 좀 오래걸렸던것 같다.
하지만 덕분에 편하게 실험을 진행할 수 있게 되었다!!

profile
최악의 환경에서 최선을 다하기

0개의 댓글