EC2 Ubuntu에서 Docker를 활용한 MongoDB 구축

Jemin·2023년 10월 18일
0

인프라

목록 보기
3/6
post-thumbnail

사전 작업

인스턴스를 연결하고 Docker가 설치되어 있는 상태에서 시작한다.

먼저 패키지 목록을 업데이트한다.

apt-get update

api-get은 Debian 및 Debian 계열 리눅스 시스템에서 패키지 관리와 설치를 수행하는 명령줄 도구다. 이 도구를 사용하여 리눅스 시스템에 소프트웨어 패키지를 설치, 업데이트 및 제거할 수 있다. 패키지 매니저라고 보면 쉬울 것 같다.

아래의 패키지를 설치하고 시작할 것이다.

apt-get install vim

apt-get install net-tools
  • vim: Vim 텍스트 편집기다. 리눅스 시스템에서 코드 편집이나 텍스트 파일 편집에 주로 사용된다.

  • net-tools: 네트워크 도구와 관련된 패키지다. 이 패키지는 네트워크 설정 및 모니터링에 사용되는 다양한 도구를 포함하고 있다.

MongoDB

image 받아오기

docker pull mongo:4.4

MongoDB는 4.4 버전을 사용한다. pull 명령어를 사용해 image를 받아주고 이미지명 뒤에 태그로 버전을 명시해준다.

docker images 명령어를 사용해 받아온 image 목록을 확인할 수 있다.

container 설정

docker run -i -t --name <컨테이너명> -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=<사용자명> -e MONGO_INITDB_ROOT_PASSWORD=<암호명> -d mongo:4.4
  • docker run: Docker 컨테이너를 실행하는 명령어

  • -i: 컨테이너와 상호작용 모드로 실행한다. 즉, 컨테이너 표준 입력을 연결하고 컨테이너의 터미널과 상호작용할 수 있도록 한다.

  • -t: 유사한 터미널을 사용하여 컨테이너를 실행한다.

  • ----name <컨테이너명>: 컨테이너에 이름을 부여한다. 이 이름은 컨테이너를 식별하는데 사용된다.

  • -p 27017:27017: 호스트와 컨테이너 간 포트 매핑을 설정한다. 이 경우 호스트의 포트 27017은 컨테이너의 포트 27017과 연결된다.

  • -e MONGO_INITDB_ROOT_USERNAME=<사용자명>: mongoDB 컨테이너 내에서 사용할 초기 데이터베이스의 루트 사용자 이름을 설정한다.

  • -e MONGO_INITDB_ROOT_PASSWORD=<암호명>: mongoDB 컨테이너 내에서 사용할 초기 데이터베이스의 루트 사용자 암호를 설정한다.

  • -d mongo:4.4: 실행할 Docker 이미지를 지정한다.

mongoDB container에 접속

docker exec -it -u <사용자명> <실행할 컨테이너 이름> /bin/bash
  • docker exec: 실행 중인 Docker 컨테이너 내에서 명령어를 실행하기 위해 사용한다.

    • -it: 이 플래그는 상호작용 모드로 실행하고 유닉스 터미널을 연다는 것을 나타낸다.
  • -u <사용자명>: 입력된 사용자명으로 접속한다.

  • <실행할 컨테이너 이름>: 실행할 컨테이너 이름을 지정한다.

    • /bin/bash: 실행할 명령어다. 즉, Bash Shell을 실행하도록 지정한다.

위 명령어를 실행하면 해당 Docker 컨테이너 내에서 Bash Shell을 시작하고, 이 컨테이너 내에서 명령을 실행하거나 디버깅 작업을 수행할 수 있게 된다.

본인은 root라는 사용자명으로 접속했다.

MongoDB 시작

이제부터 MongoDB의 쿼리문을 사용할 수 있다.

mongo -u root -p 1234
  • mongo: MongoDB 클라이언트를 시작한다.
use admin

데이터베이스 생성을 위해 admin 계정으로 접속한다.

db.system.users.find().pretty()

사용자를 조회한다. MongoDB Container를 생성할 때 root 계정을 활성화시켰기 때문에 따로 root 계정을 활성화 하지 않아도 된다. 접속할 때도 root 계정으로 접속했다.

이제 데이터베이스가 정상적으로 동작하는지 확인해볼 것이다.

db.toy.insert({"name": "user1", "info": "test"})

Collection을 생성하고 간단한 테스트용 데이터를 넣어준다.

db.toy.find()

해당 Collection을 조회해서 데이터가 잘 들어갔는지 확인한다.

db.createUser({ user: "MyUser", pwd: "1234", roles: ["root"] })

이제 위에서 생성한 데이터베이스를 관리하는 user를 생성해준다.

db.getUsers()

getUsers()로 유저가 정상적으로 생성되었는지 확인한다.

잘 생성된다면 이제 외부에서 접속 가능하게 AWS 콘솔창으로 넘어가야 한다.

AWS 외부 접속 허용

AWS EC2 인스턴스의 보안 그룹의 인바운드 규칙을 수정한다.
mongoDB의 포트를 27017로 설정했기 때문에 보안 규칙에서 27017을 추가하면 된다. 소스는 접속 허용할 IP를 지정해주면 된다. 0.0.0.0으로 설정해도 되지만 해킹당하면 곤란하기 때문에 IP를 직접 지정해주는 것이 좋다.

bind-address 편집

bind-address는 네트워크 상에서 어떤 주소로 MongoDB 서버가 연결을 수락할지 설정하는 MongoDB의 구성 옵션이다.

기본적으로 MongoDB는 모든 네트워크 인터페이스를 통해 연결을 수라갛므로 bind-address가 설정되지 않으면 모든 네트워크 인터페이스를 사용한다. 그러나 bind-address를 설정하면 서버가 특정 IP 주소나 호스트에만 바인딩되도록 할 수 있다.

bind-address 설정의 목적은 보안과 네트워크 접근을 관리하는 것이다. 특정 IP 주소에서만 MongoDB에 접근을 허용하고 다른 곳에서 접근을 거부할 수 있다.

우선 Docker에서 image로 Container를 생성했기 때문에 해당 Container에는 Vim이 설치가 안되어 있어서 편집 기능이 동작하지 않는다.

apt-get update
apt-get install vim

위에서 했던 것과 동일하게 Container에 -u root로 접속하고 apt-get을 사용해 vim을 install 한다.

이후 Container안에서 mongoDB bind-address를 편집한다.

vi /etc/mongod.conf

설정 파일 편집

MongoDB는 기본적으로 bind-address가 127.0.0.1로 설정되어 있기 때문에 0.0.0.0으로 수정해서 외부 접속을 허용해준다.

net:
  bindIp: 0.0.0.0
  port: 27017

방화벽 설정

이제 EC2의 방화벽을 설정해주어야 한다.

apt-get install firewalld

명령어를 사용해 각 포트를 열어주고 적용한 후 정상적으로 적용이 되었는지 목록을 출력해서 확인한다.

firewall-cmd --permanent --zone=public --add-port=27017/tcp
firewall-cmd --reload
firewall-cmd --list-all

Connection

스프링부트를 사용 중이기 때문에 application.properties에 등록해줬다.

# MongoDB Connection
spring.data.mongodb.host=<IP주소>
spring.data.mongodb.port=27017
spring.data.mongodb.database=<DB이름>
spring.data.mongodb.username=MyUser
spring.data.mongodb.password=1234

동작 확인

이제 MongoDB가 본인 컴퓨터에서 잘 동작하는지 확인한다.

admin database에 무언가를 하면 곤란한 상황이 발생할 수 있기 때문에 다른 database를 생성해서 사용하는 것이 좋다.

참고
소경관 : AWS EC2 Ubuntu 20.04에서 Docker를 활용해서 MariaDB, MongoDB 구축 후 연동

profile
경험은 일어난 무엇이 아니라, 그 일어난 일로 무엇을 하느냐이다.

0개의 댓글