개발놀이터

Docker 로 MySQL 생성 후 외부 연결 본문

배포/Docker

Docker 로 MySQL 생성 후 외부 연결

마늘냄새폴폴 2023. 6. 6. 19:43

이번 포스팅에선 Docker를 이용해 MySQL을 설치하고 외부 연결까지 해보도록 하겠습니다. 

 

사전 준비로 ec2가 준비되어있어야 합니다. 또한 ec2의 크기를 medium으로 설정하셔야합니다. 그래야 docker를 돌렸을 때 렉이 안걸린다고 하네요. 

 

ec2 설치는 아래의 링크를 확인해주세요. 

https://coding-review.tistory.com/160

 

aws 배포 ec2 (1) : 모놀리식 배포

우선 aws ec2에 들어간다. 인스턴스 시작을 클릭! 더 많은 AMI 찾아보기를 클릭 후 우분투 리눅스를 둘중 하나 클릭 조금 내려가다 보면 키 페어를 선택하라고 나오는데 이부분은 새 키페어 생성을

coding-review.tistory.com

 

이제 시작해보죠!

 

1. Docker 설치

먼저 도커를 설치해야합니다. 그리고 도커 설치하는 김에 docker-compose도 같이 설치하겠습니다. 

 

sudo apt-get install docker
sudo apt-get install docker-compose

 

2. MySQL 이미지 다운로드

아래의 명령어를 입력해 MySQL 8.0.17 태그 이미지를 다운로드합니다. 

docker pull mysql:8.0.17
권한 없다고 뜨면 맨 앞에 sudo 붙여서 해보기

 

정상적으로 다운로드가 되었다면 아래의 명령어를 입력했을 때 MySQL이 잘 보일겁니다. 

docker images
안되면 sudo 붙여보기

 

3. Docker MySQL 컨테이너 생성 및 실행

이제 Docker에 MySQL 컨테이너를 생성하고 실행할건데 여기서 주의할 점은 docker에 MySQL과 같은 DB를 설치하는 경우 컨테이너 삭제와 함께 데이터도 날아가므로 저장소는 반드시 외부 저장소를 사용합니다. 

 

(sudo) docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name capston-mysql -v /Users/capston/datadir:/var/lib/mysql mysql:8.0.17 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

조금 긴데 한번 잠깐 설명해드리자면 

  • MYSQL_ROOT_PASSWORD 이 뒤에는 자신이 원하는 DB의 패스워드를 입력합니다.
  • --name 뒤에는 자신의 데이터베이스 이름을 적습니다. 
  • -v 뒤에는 외부 저장소를 만들고 그 저장소에 /var/lib/mysql 의 데이터를 바인딩하겠다는 것입니다. 
  • --character-set-server=utf8mb4 --collation-server-utf8mb4_unicode_ci 는 적지않으면 한글이 깨지기 때문에 반드시 적어줍니다. 

 

이렇게 적는게 역시 난잡하고 힘들기 때문에 우리는 미리깔아둔 docker-compose를 이용해서 적는 방법도 보여드리겠습니다. 

 

먼저 아무 디렉토리나 들어가서 docker-compose.yml 파일을 만듭니다. 

mkdir docker-compose.yml

그리고 안에 내용을 집어넣습니다. 

version: "3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
  db: # 서비스 명
    image: mysql:8.0.17 # 사용할 이미지
    container_name: capston-mysql # 컨테이너 이름 설정
    ports:
      - "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    environment: # -e 옵션
      MYSQL_ROOT_PASSWORD: "password"  # MYSQL 패스워드 설정 옵션
    command: # 명령어 실행
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /Users/jmlim/datadir:/var/lib/mysql # -v 옵션 (다렉토리 마운트 설정)

yml에 왜 - 가 들어가있지? 싶지만 저렇게 적는게 맞습니다. 

 

저장 후 빠져나온 다음 (esc 누르고 :wq 엔터) docker-compose를 실행시키기만 하면 위의 복잡한 명령어를 줄여줄 수 있습니다. 

(sudo) docker-compose up -d
-d 는 백그라운드로 실행 시 옵션

 

4. docker 컨테이너 목록 출력

(sudo) docker ps -a

 

5. MySQL 컨테이너에 bash 셀 접속

docker exec 명령을 사용해서 docker 컨테이너에 접근한 다음 MySQL에 로그인합니다. 

(sudo) docker exec -it capston-mysql bash

-it 뒤에는 아까 docker-compose에서 적었던 container_name에 있는 것을 적으면 됩니다. 

 

 

6. MySQL 서버 접속

root@f3af78fa6428:/# mysql -u root -p
mysql>

패스워드는 docker-compose에서 설정한 자신의 패스워드를 입력하면 됩니다. 

 

7. 데이터베이스와 사용자를 생성하고 MySQL에서 권한을 부여한다. 

mysql> CREATE USER 'capston'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'capston'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit

컨테이너 외부에서도 MySQL에 로그인이 되어야 하기 때문에 원래 'capston'@'localhost' 에서 localhost 부분을 %로 바꿔줍니다. 

 

8. MySQL 설정파일에서 외부 연결 설정 해제하기

bash 셀 상태에서 아래의 명령어를 입력합니다. 

vi /etc/mysql/my.cnf

만약 command not found가 뜬다면 

apt-get update
apt-get install vim

이렇게 쳤는데도 안된다. 그럼 apt-get update자체의 문제입니다.

E: Failed to fetch http://security.debian.org/debian-security/dists/stretch/updates/main/binary-amd64/Packages  404  Not Found

보통 이런 에러가 뜰텐데 이건 오래된 버전의 stretch를 사용하기 때문입니다. 

 

이때는

sed -i 's/stretch/buster/g' /etc/apt/sources.list

이렇게 명령어를 입력하시고 다시 apt-get update를 하시면 될겁니다. 

 

그렇게 my.cnf 파일에 들어가보면 

bind-address << 요게 있으면 주석처리를 해주세요. 알아보니 없는 사람도 있더라구요. 없으면 그냥 빠져나오시면 됩니다. 

 

9. AWS EC2 인스턴스 보안그룹 변경

거의 다왔습니다. 이제 AWS의 인스턴스 보안그룹을 변경해줘야합니다. 모든 지역에서 인스턴스에 접근할 수 있어야하기 때문이죠. 

 

 

자신의 인스턴스 오른쪽 버튼 > 보안 > 보안 그룹 변경에 들어가보면

 

자신의 인스턴스와 연결된 보안 그룹이 나옵니다. 

 

왼쪽에 보안 그룹에 들어가면 위와같은 모습인데 아까 확인했던 보안 그룹 이름과 일치하는 보안 그룹을 선택하고 아래의 인바운드 규칙 편집을 눌러줍니다. 

 

그리고 규칙 추가를 두번 해서 하나는 ::/0, 하나는 0.0.0.0/0 을 선택하고 저장 후 나와줍니다. 

 

10. 외부 연결

이렇게 연결해주시면? 

 

이렇게 연결이 된 것을 볼 수 있습니다. 

 

 

마치며

이번에 도커를 손 대봤는데 정말 어렵네요... 하지만 앞으로 자주 봐야할 것 같습니다. 

 

도커를 이용해 최종적인 목표는 CI / CD 에서 Blue / Green 배포를 진행하는 것입니다. 아직 프로젝트도 못올렸고 elasticsearch도 연결해야 하지만 첫 걸음이 가볍게 마무리되어서 기분이 좋습니다. 

 

긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~