AWS

[AWS] EC2에 Docker 이용해서 mongoDB 설치하기

HEY__ 2024. 5. 31. 16:09
728x90

이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!

 

 

GitGet 서비스에서는 RDBMS인 `MariaDB`와 NoSQL인 `mongoDB` 총 두 개의 데이터베이스를 사용한다.

AWS EC2에 서비스를 올려서 운영해보기로 했는데, 우리는 Docker container로 데이터베이스를 띄워서 이를 사용하기로 했다.

 

이전 포스팅에서 mariaDB를 설치하고 계정 설정까지 진행해보았는데, 이 링크에서 확인할 수 있다. :)

 

🖥️ 개발 환경
EC2 인스턴스는 `t2.micro`를 사용하고 있으며, OS는 `Ubuntu`를 사용하고 있습니다.
Linux 기반의 명령어이기 때문에 OS에 따라 명령어가 조금씩 다를 수 있습니다 :)

 

✅ EC2에서 Docker 설치

1. Linux 기준 Docker 설치하는 명령어 실행

EC2에는 기본적으로 Docker가 설치되어 있지 않기 때문에 명령어를 통해 Docker를 설치하자.

우선 `sudo apt update`를 통해 업데이트를 먼저 해주고, 그 다음 설치 명령어를 통해 설치하도록 하자.

 

이전에 update를 한 차례 했으면 다시 하지 않아도 되며,

`sudo`는 일반 사용자가 root 사용자의 권한을 잠시 빌려서 사용할 때 쓰는 명령어이다.

$ sudo apt update
$ sudo apt install docker.io

 

설치가 완료되었으면 밑의 명령어를 통해 Docker의 버전을 확인할 수 있으며, 버전이 잘 뜬다면 설치가 잘 된 것이다.

$ docker --version
Docker version 24.0.7, build 24.0.7-0ubuntu4

 


✅ EC2에서 mongoDB 이미지 다운

EC2 인스턴스에 Docker를 깔았으니, 이제 우리가 사용할 `mongoDB`의 이미지를 다운받아야 한다.

밑의 링크는 mongoDB 공식 이미지들이 모아져 있는 링크이다. 

https://hub.docker.com/_/mongo/tags

 

mongo Tags | Docker Hub

docker pull mongo:8.0.0-rc6-windowsservercore-ltsc2022

hub.docker.com

 

위의 링크로 들어가면 밑과 같이 다양한 태그들이 있는데,

심플하게 제일 위에 있는 `docker pull mongo` 부분을 복사해서 사용해도 되고, 원하는 버전이 있는 경우에는 태그 리스트들 중 원하는 이미지를 사용하면 된다.

`docker pull mongo`를 사용하면 자동으로 `latest` 버전을 다운받게 된다.

 

우리 팀은 혹시나 나중에 EC2 세팅을 다시 하는 일이 발생할까 싶어 `mongo` 이미지를 받아서 root 계정 설정까지 끝낸 후, 팀 Docker 계정에 Docker image로 올려놓았다.

+ 기존의 image를 바탕으로 옵션을 커스텀하여 해당 이미지를 나의 Docker repository에 올리는 방법에 대해서도 추후 포스팅하겠다 :)

 

밑의 명령어는 우리 팀에서 사용하는 이미지를 받는 명령어이기 때문에,

mongoDB 공식 이미지를 받고자 한다면 `docker pull mongo`를 입력하면 된다.

# mongo 이미지를 받는 명령어를 실행하면 됩니다.
# 공식 이미지를 받는 명령어: docker pull mongo
$ docker pull geniusgitget/mongo:1.0.0

1.0.0: Pulling from geniusgitget/mongo
01007420e9b0: Pull complete 
bc3bec6a423e: Pull complete 
c5db81b694a8: Pull complete 
427a1a117df0: Pull complete 
dfb180c9e7b5: Pull complete 
92e6f08e133c: Pull complete 
374f042f3159: Pull complete 
73549bb43006: Pull complete 
867682b1a960: Pull complete 
Digest: sha256:8a19f891a0511331a21c8e3b7b438d8aa232feca1f163900602169e5fc44dc27
Status: Downloaded newer image for geniusgitget/mongo:1.0.0
docker.io/geniusgitget/mongo:1.0.0

 

 

이후 Docker image 리스트를 확인하는 명령어를 입력했을 때, 밑과 같이 리스트로 뜬다면 제대로받은 것이다.

$ docker images
REPOSITORY             TAG       IMAGE ID       CREATED       SIZE
geniusgitget/mongo     1.0.0     17af2357023f   7 weeks ago   755MB
geniusgitget/mariadb   1.0.0     de70323777ee   7 weeks ago   404MB

 


mongoDB 컨테이너 실행

Docker image를 받았다면, 이제 container를 생성할 차례이다.

간단하게 비유를 해보자면, image는 클래스로 container는 객체로 비유해볼 수 있을 것 같다. 

실질적으로 우리가 사용하는 것은 image가 아닌 container인 것이다.

 

docker run 명령어에 다양한 옵션을 넣어서 컨테이너를 생성할 수 있다.

 

자주 사용하는 옵션들을 몇 개 살펴보자.

  • --name {이름}
    컨테이너의 이름을 설정하는 옵션
  • -d, --detach
    보통 데몬 모드라고 부르며, 컨테이너를 백그라운드에서 실행시키는 옵션
  • -p <호스트 포트>:<컨테이너 포트> 
    포트포워딩 시 사용하는 옵션
  • -e, --env
    컨테이너 내에서 사용할 환경 변수를 설정하는 옵션. 보통 설정 값이나 비밀번호를 설정할 때 사용.
  • --restart
    재시작 정책을 설정하는 옵션. EC2 재시작 시 컨테이너 또한 자동으로 실행되도록 설정할 때 사용.

 

mongoDB 공식 이미지를 받았을 때

mongoDB 공식 이미지를 받았다면 비밀번호가 설정이 안되어 있기 때문에 비밀번호 설정을 같이 해주는 것이 편하다.

 

mariaDB에서와 같이 `-e` 옵션을 통해 root(슈퍼 어드민) 계정의 비밀번호를 설정할 수 있다.

`MONGO_INITDB_ROOT_USERNAME`에는 root를 `MONGO_INITDB_ROOT_PASSWORD`에는 사용하고자하는 비밀번호를 설정할 수 있다.

 

컨테이너 생성이 정상적으로 이루엊졌다면, `3770e3c329c4...`와 같이 컨테이너 ID가 뜰 것이다.

docker run --name {컨테이너 이름} -p 27017:27017 -d -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD={비밀번호} mongo:latest

b7da5711fd61a2fed83e2bf8867fe9fcc1ded924167d4b5f077d50216b29f37a

 

 

비밀번호가 설정된 커스텀 이미지를 받았을 때

내가 커스텀하게 생성한 이미지는 root 계정 및 비밀번호 설정이 되어 있기 때문에, 비밀번호를 설정하는 옵션을 따로 적어주지 않다.

$ docker run --name gitget-mongo -d -p 27017:27017 geniusgitget/mongo:1.0.0
b7da5711fd61a2fed83e2bf8867fe9fcc1ded924167d4b5f077d50216b29f37a

 


  mongoDB 접속

그렇다면 데이터베이스에 접근하려면 어떻게 해야 할까?

Docker container로 돌아가고 있기 때문에,

1) 생성한 container로 진입

2) 해당 container 내부에서 mongoDB 접속

을 해야 한다.

 

Docker container 접속하기

`docker exec`는 container에 특정 명령을 실행할 때 사용하는 명령어이며,

커맨드라인을 통해 입출력을 주고 받는 경우 `-it` 옵션을 붙여주어야하며, `bash` 옵션을 통해 셸을 실행할 수 있다.

 

EC2 환경에서는 커맨드라인을 통해 입출력을 주고받기 때문에 `-it`과 `bash` 옵션을 모두 사용한다.

$ docker exec -it {컨테이너 이름} bash
ex) docker exec -it gitget-mongodb bash

 

container 접속에 성공했다면 밑과 같이 커맨드를 받는 부분이 달라진다.

 

 

 

mongoDB 접속하기

container 접속을 했으므로, 이제 mongoDB만 접속하면 된다.

 

mongoDB에 접속하기 위해서는

`mongosh -u root -p`를 적은 후 → `Enter password:`라는 글이 나오면 → `-e MONGO_INITDB_ROOT_PASSWORD`에 적었던 비밀번호를 입력하면 된다.

$ docker exec -it gitget-mongo bash
root@b7da5711fd61:/ mongosh -u root -p
Enter password: ****************
Current Mongosh Log ID: 665972b072ef77e2d4276134
Connecting to:          mongodb://<credentials>@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.1.4
Using MongoDB:          7.0.5
Using Mongosh:          2.1.4

For mongosh info see: https://docs.mongodb.com/mongodb-shell/


To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).
You can opt-out by running the disableTelemetry() command.

------
   The server generated these startup warnings when booting
   2024-05-31T06:48:00.716+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
   2024-05-31T06:48:01.901+00:00: vm.max_map_count is too low
------

 


 계정 확인 및 설정

test> show databases;
admin   100.00 KiB
config   12.00 KiB
local    72.00 KiB

# 계정 설정을 위해 admin 데이터베이스로 변경
test> use admin;
switched to db admin

# 특정 데이터베이스에만 권한을 가지고 있는 계정 생성
admin> db.createUser({ user: "gitget-admin", pwd: "{비밀번호}", roles: [{role: "readWrite", db: "GitGet"}] })
{ ok: 1 }

# 생성된 계정이 있나 확인
admin> show users;
[
  {
    _id: 'admin.gitget-admin',
    userId: UUID('a8b0b9a9-1666-473d-a955-4ed7fcef554d'),
    user: 'gitget-admin',
    db: 'admin',
    roles: [ { role: 'readWrite', db: 'GitGet' } ],
    mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
  },
  {
    _id: 'admin.root',
    userId: UUID('ef9cd45b-127f-44d3-bf2e-c7f4a3b0edc7'),
    user: 'root',
    db: 'admin',
    roles: [ { role: 'root', db: 'admin' } ],
    mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
  }
]

 

 

 

728x90