[AWS] EC2에 Docker 이용해서 mongoDB 설치하기
이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
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
위의 링크로 들어가면 밑과 같이 다양한 태그들이 있는데,
심플하게 제일 위에 있는 `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' ]
}
]