Dockerfile에 ubuntu-nginx-php를 만들고 RDS와 연동해 보기 – RDS 연동편

Dockerfile에 ubuntu-nginx-php를 만들고 RDS와 연동해 보기 - RDS 연동편
2021.08.12

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는「Dockerfile에 ubuntu-nginx-php를 만들고 RDS와 연동해 보기」라는 주제로 Docker와 AWS 서비스인 RDS를 연동해 보는 블로그를 써볼까 합니다. 이전에 집필한 블로그「Dockerfile에 ubuntu-nginx-php를 만들고 RDS와 연동해 보기 – 서버 구축편」은 여기를 참고해주세요!

이전에 집필한 Docker 블로그는 아래 링크를 참고해주세요.

데이터베이스를 연동하기전 설정

먼저 php와 데이터베이스를 연동하기 위해서는 php-mysql을 설치해야 합니다.

dockerfile에 다음 문장을 한 줄을 추가해 줍니다.

RUN apt install -y php-mysql

FROM ubuntu:latest
MAINTAINER "kim.jaewook@classmethod.jp"

RUN apt-get update
RUN apt-get install -y nginx
RUN apt install -y php-fpm
RUN apt-get install -y nano
RUN apt install -y php-mysql

COPY default /etc/nginx/sites-available/
COPY phpinfo.php /var/www/html

WORKDIR /etc/nginx

CMD service php7.4-fpm start && nginx -g "daemon off;"

EXPOSE 80

이제 dockerfile을 빌드해 봅시다.

docker build -t jaewook/ubuntu-nginx-phpsql .

빌드가 끝나면 이미지를 확인해 봅시다

docker images

그럼 빌드가 잘 된것을 볼 수 있습니다.

이제 컨테이너로 만들어서 실행해 봅시다.

docker start container ID

컨테이너를 실행 합니다.

해당 포트로 접속해 보면 정상 작동되는 것을 볼 수 있습니다.

RDS 생성 및 연동 작업

이제 RDS를 만들고 php와 RDS를 연동해 보도록 하겠습니다.

AWS의 RDS에 들어가서 mysql, 프리티어를 선택한 다음 데이터베이스를 만들어줍니다.

생성하면 데이터베이스가 생성 중이라고 뜨는 것을 볼 수 있고, 생성이 완료되면 DB 식별자에 나와 있는 database-1을 눌러서 들어가 봅시다.

하단에 내려가 보면 퍼블릭 액세스 가능성이 예로 되어있는데「예」로 되어있으면 외부에서도 RDS에 접근 가능하다는 것을 의미합니다. 만약「아니오」로 되어있으면 같은 VPC내에서 허용한 IP주소만 접근 가능합니다.

더 아래에 내려가 보면 보안 그룹 규칙이 있는데 가장 아래에 있는 녀석을 눌러서 수정해줍니다.

보안그룹에 들어가서 인바운드 규칙 편집을 눌러줍니다.

그리고 유형은 MYSQL/Aurora로 선택해주고, 현재 퍼블릭 엑세스 허용이 되어있기 때문에 먼저, 외부에서 접속 테스트를 해보기 위해 내 IP를 선택 합니다. 아래는 EC2에서 RDS로 접근하기 위해 EC2의 보안그룹을 넣어줍니다.

EC2의 보안그룹은 EC2에 들어간 다음 아래에 내려보면 보안 그룹이라고 있는데 복사해서 붙여 넣어주면 됩니다.

docker exec -i -t container ID bash
nano rdstest.php

다음 명령을 입력해서 해당 컨테이너로 접속합니다. 그리고 www/html 경로로 이동한 다음 php 코드를 작성합니다.

엔드포인트는 RDS에 들어가 보면 나와 있으니 그대로 복사해줍니다.

그리고 DB접속할 때 사용할 ID와 비밀번호를 입력해주고, RDS를 만들 때 테스트용으로 만들어뒀던 데이터베이스명을 적어주고 마지막으로 포트번호를 씁니다.

RDS 접속 테스트

그리고 접속을 해보면 docker container php에서 RDS로 잘 접속되는 것을 볼 수 있습니다.

그럼 외부에서 접속해 보도록 하겠습니다.

저는 mysql 워크벤치를 사용했습니다.

다음과 같이 입력하고 테스트를 눌러봅시다.

그럼 성공적으로 접속이 됐다고 나옵니다. 이제 docker에서 만든 서버에서 RDS로 접속할 수 있게 됐습니다.

이어서 퍼블릭 액세스를「아니오」로 해두면 어떻게 되는지 테스트 해보도록 하겠습니다.

접속을 해보면 연결이 실패했다고 뜹니다.

그렇다면 EC2에서는 접속이 되는지 확인해 봅시다.

EC2 퍼블릭 주소로 들어가서 DB에 접근해보면 잘 작동이 됩니다.

즉 퍼블릭 액세스를「예」로 설정하면 외부에서 접근이 가능하도록 열어두지만「아니오」로 설정해놓으면 같은 VPC내에서 허락한 주소만 접속이 가능하게끔 합니다.

퍼블릭 액세스 상태에 따른 RDS 접속

이전까지 했던 테스트는 외부에서 RDS에 접근하는 방법이었습니다. 이번에는 퍼블릭 액세스가 허용되지 않았을 때의 접속 방법에 대해 다뤄볼까 합니다. 먼저 docker를 이용해서 mysql을 설치하고 docker로 설치한 mysql로 RDS로 접근해 보도록 하겠습니다.

일단 docker를 최대한 활용할 생각이기 때문에 docker에서 mysql을 다운받아서 접근 해보도록 하겠습니다.

docker hub에 들어가서 mysql이라고 검색하고 official이라고 적혀있는 녀석을 눌러줍니다. 그러면 오른쪽에 이미지를 다운로드 하는 방법이 나와 있습니다.

일단 저는 바로 run으로 컨테이너를 실행 시킬 것이기 때문에 run 명령어를 사용하겠습니다.

아래로 내려가다 보면 run 명령을 통해서 실행하는 방법이 나옵니다.

일단 -e 옵션으로 환경설정을 바꿔줄 수 있는데, 환경변수 뭐를 바꿔야 할지 모르겠다 하면 그냥 컨테이너를 만들고 난 다음, bash로 접근해서 printenv 를 입력해주면 됩니다. 그러면 환경변수들이 나오는데, 여기서 본인이 수정하고 싶은 환경 변수들을 run할 때 바꿔주면 됩니다.

docker run --name mysql-rds -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

저는 이름은 mysql-rds라고 줬고 비밀번호는 root로 줬습니다.

어차피 테스트용으로 만드는 것이기 때문에 비밀번호는 쉽게 root로 줬습니다.

docker start container_ID

다운로드가 끝나면 docker start로 컨테이너를 실행시켜줍니다!

현재 docker ps -a 명령어를 통해 확인한 컨테이너 상황입니다.

mysql을 설치해서 기동을 시켜놨고, dockerfile로 만든 ubuntu와nginx-php 컨테이너 또한 8000 포트로 돌아가고 있습니다. 여기서 RDS로 접근하기 위해서는 먼저 EC2와 RDS간 접근이 가능하도록 보안그룹 설정을 해줘야 합니다. 

EC2와 RDS간 보안그룹 설정은 위에 했었던 설정 그대로 따라하면 됩니다.

마지막으로 RDS 수정으로 들어간 다음 퍼블릭 액세스 가능을「아니요」로 바꿔서 외부에서 접근 못 하도록 막아줍니다.

docker exec -i -t Container_ID bash

그런 다음 bash로 mysql 컨테이너에 접근합니다.

mysql -u ID -p -h RDS엔드포인트값

그리고 다음과 같이 입력해주면 성공적으로 RDS로 접근할 수 있습니다.

엔드포인트는 RDS에 들어가 보면 바로 나와 있으니 복사해서 넣어주면 됩니다.

show databases; 라고 쿼리를 날려보면 RDS를 생성할 때 만들어 둔 데이터베이스 example가 들어가 있는 것을 볼 수 있습니다. 이제 여기서 example2라는 데이터베이스를 추가한 다음, ubuntu 컨테이너의 php가 인식을 하는지 테스트를 해보겠습니다.

create database example2
exit

데이터베이스를 만들어주고 나서 exit로 빠져나갑니다.

docker exec -i -t Container_ID bash
cd /var/www/html
nano rdstest.php

이어서 ubuntu 컨테이너로 접속하고 html 경로로 이동해준 다음, nano 명령어로 php 파일을 열어줍니다.

그리고 다음과 같이 입력을 하고 저장합니다.

다시 8000포트로 접근을 해보겠습니다.

성공적으로 example2 데이터베이스에 접근한 것을 볼 수 있습니다.

마지막으로

여기까지가 dockerfile을 이용해서 ubuntu-nginx-php와 phpsql을 설치하고, mysql 컨테이너를 이용해서 RDS에 접근까지 하는 방법이었습니다. 추가로 퍼블릭 액세스를 허용했을 떄와 허용하지 않았을 때의 접속 방법에 대해서도 알아보았습니다.