이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
GitGet 서비스에서는 RDBMS인 `MariaDB`와 NoSQL인 `mongoDB` 총 두 개의 데이터베이스를 사용한다.
AWS EC2에 서비스를 올려서 운영해보기로 했는데, 우리는 Docker container로 데이터베이스를 띄워서 이를 사용하기로 했다.
EC2 초기 세팅에 대한 설명은 이전에 작성한 이 글 링크를 통해 확인할 수 있다 :)
🖥️ 개발 환경
EC2 인스턴스는 `t2.micro`를 사용하고 있으며, `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
2. Docker 로그인 (생략 가능)
$ docker login -u {Docker 아이디}
Password:
2-1. 오류 발생 시
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/auth": dial unix /var/run/docker.sock: connect: permission denied
$ sudo chmod 777 /var/run/docker.sock
✅ EC2에서 mariaDB 이미지 다운
EC2 인스턴스에 Docker를 깔았으니, 이제 우리가 사용할 `mariaDB`의 이미지를 다운받아야 한다.
밑의 링크는 mariaDB 공식 이미지들이 모아져 있는 링크이다.
https://hub.docker.com/_/mariadb/tags
위의 링크로 들어가면 밑과 같이 다양한 태그들이 있는데,
심플하게 제일 위에 있는 `docker pull mariadb` 부분을 복사해서 사용해도 되고, 원하는 버전이 있는 경우에는 태그 리스트들 중 원하는 이미지를 사용하면 된다.
`docker pull mariadb`를 사용하면 자동으로 `latest` 버전을 다운받게 된다.
우리 팀은 혹시나 나중에 EC2 세팅을 다시 하는 일이 발생할까 싶어 `mariaDB` 이미지를 받아서 root 계정 설정까지 끝낸 후, 팀 Docker 계정에 Docker image로 올려놓았다.
+ 기존의 image를 바탕으로 옵션을 커스텀하여 해당 이미지를 나의 Docker repository에 올리는 방법에 대해서도 추후 포스팅하겠다 :)
밑의 명령어는 우리 팀에서 사용하는 이미지를 받는 명령어이기 때문에,
mariaDB 공식 이미지를 받고자 한다면 `docker pull mariadb`를 입력하면 된다.
# mariadb 이미지를 받는 명령어를 실행하면 됩니다.
# 공식 이미지 받는 명령어: docker pull mariadb
$ docker pull geniusgitget/mariadb:1.0.0
1.0.0: Pulling from geniusgitget/mariadb
57c139bbda7e: Pull complete
d955af01184c: Pull complete
cc4a36e94244: Pull complete
2686694394f7: Pull complete
4f8f6cdd86a7: Pull complete
ec1987b8fb40: Pull complete
c3122371054c: Pull complete
ff77ae47b7a7: Pull complete
fb9e3ef38dec: Pull complete
b34c78830fa4: Pull complete
Digest: sha256:bc54ad4f6675bd9c1a0abc7aeef22a60ddce69269643ac696cb6e3ea0498b517
Status: Downloaded newer image for geniusgitget/mariadb:1.0.0
docker.io/geniusgitget/mariadb:1.0.0
이후 Docker image 리스트를 확인하는 명령어를 입력했을 때, 밑과 같이 리스트로 뜬다면 이미지를 제대로 받은 것이다.
ubuntu@ip-172-31-43-232:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
geniusgitget/mariadb 1.0.0 de70323777ee 7 weeks ago 404MB
✅ Docker container 생성
Docker image를 받았다면, 이제 container를 생성할 차례이다.
간단하게 비유를 해보자면, image는 클래스로 container는 객체로 비유해볼 수 있을 것 같다.
실질적으로 우리가 사용하는 것은 image가 아닌 container인 것이다.
docker run 명령어에 다양한 옵션을 넣어서 컨테이너를 생성할 수 있다.
docker run <옵션> <이미지> <명령> <매개 변수>
자주 사용하는 옵션들을 몇 개 살펴보자.
- --name {이름}
컨테이너의 이름을 설정하는 옵션 - -d, --detach
보통 데몬 모드라고 부르며, 컨테이너를 백그라운드에서 실행시키는 옵션 - -p <호스트 포트>:<컨테이너 포트>
포트포워딩 시 사용하는 옵션 - -e, --env
컨테이너 내에서 사용할 환경 변수를 설정하는 옵션. 보통 설정 값이나 비밀번호를 설정할 때 사용. - --restart
재시작 정책을 설정하는 옵션. EC2 재시작 시 컨테이너 또한 자동으로 실행되도록 설정할 때 사용.
mariaDB 공식 이미지를 받았을 때
mariaDB 공식 이미지를 받았다면, 비밀번호 설정이 안되어 있기 때문에 비밀번호 설정을 같이 주어야 한다.
`-e MYSQL_ROOT_PASSWORD={비밀번호}` 옵션을 통해서 root 계정(슈퍼어드민)의 비밀번호를 초기에 설정할 수 있다.
+ 예시로 12345를 적었지만 비밀번호를 이렇게 단순하게 설정하면 해킹을 당할 수 있으므로 주의하자!
컨테이너 생성이 정상적으로 이루어졌다면 `3770e3c329c4915e...`와 같이 컨테이너 ID가 뜰 것이다.
$ docker run --name {컨테이너 이름} -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD={비밀번호} mariadb:latest
ex) docker run --name gitget-mariadb -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 mariadb:latest
3770e3c329c4915e67714992b7dade477677f623a42c2d04a4dc3a07be332e3b
비밀번호가 설정된 커스텀 이미지를 받았을 때
내가 커스텀하게 생성한 이미지는 root 계정 및 비밀번호 설정이 되어 있기 때문에, 비밀번호를 설정하는 옵션을 따로 적어주지 않다.
$ docker run --name gitget-mariadb -d -p 3306:3306 geniusgitget/mariadb:1.0.0
3770e3c329c4915e67714992b7dade477677f623a42c2d04a4dc3a07be332e3b
✅ mariadb 접속
그렇다면 데이터베이스에 접근하려면 어떻게 해야 할까?
Docker container로 돌아가고 있기 때문에,
1) 생성한 container에 진입
2) 해당 container 내부에서 mariadb 접속
을 해야 한다.
Docker container 접속하기
`docker exec`는 container에 특정 명령을 실행할 때 사용하는 명령어이며,
커맨드라인을 통해 입출력을 주고 받는 경우 `-it` 옵션을 붙여주어야하며, `bash` 옵션을 통해 셸을 실행할 수 있다.
EC2 환경에서는 커맨드라인을 통해 입출력을 주고받기 때문에 `-it`과 `bash` 옵션을 모두 사용한다.
$ docker exec -it {컨테이너 이름} bash
ex) docker exec -it gitget-mariadb bash
container 접속에 성공했다면 밑과 같이 커맨드를 받는 부분이 달라진다.
mariaDB 접속하기
container 접속이 완료되었으므로, 이제 mariadb에만 접속하면 된다.
mariadb 접속하기 위해서는
`mariadb -u root -p`를 적은 후 → `Enter password:` 라는 글이 나오면 → container 실행 시 `-e MYSQL_ROOT_PASSWORD`에 적었던 비밀번호를 적으면 된다.
mariaDB가 mysql에서 파생되었기 때문에, 접속도 `mysql -u root -p`로 접속하라는 글들을 쉽게 찾아볼 수 있다.
나의 경우에는 mysql을 찾을 수 없다는 오류가 계속 발생하여 mysql 명령어를 통해 접속할 수 없었다.
버전 업데이트를 하면서 명령어가 바뀐 것이 아닐까 싶은데..!!!
mariadb의 접속은 `mariadb`로 하시면 됩니다!!!
$ docker exec -it gitget-mariadb bash
# mariadb 접속 명령어
root@3770e3c329c4:/ mariadb -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 11.2.2-MariaDB-1:11.2.2+maria~ubu2204 mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
✅ 계정 사용자 확인 및 설정
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.001 sec)
MariaDB [(none)]> create database gitget;
Query OK, 1 row affected (0.001 sec)
# 계정 설정을 위해 데이터베이스 변경
MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
# 등록되어 있는 계정 리스트 조회
MariaDB [mysql]> select host,user,password from user;
+-----------+-------------+-------------------------------------------+
| Host | User | Password |
+-----------+-------------+-------------------------------------------+
| localhost | mariadb.sys | |
| localhost | root | ***************************************** |
| % | root | ***************************************** |
| 127.0.0.1 | healthcheck | ***************************************** |
| ::1 | healthcheck | ***************************************** |
| localhost | healthcheck | ***************************************** |
+-----------+-------------+-------------------------------------------+
6 rows in set (0.001 sec)
# 특정 데이터베이스(gitget)에만 권한을 가지고 있는 계정 생성
MariaDB [mysql]> create user '{계정 이름}'@'%' identified by '{비밀번호}';
Query OK, 0 rows affected (0.002 sec)
# 특정 데이터베이스(gitget)에만 권한 부여
MariaDB [mysql]> grant all privileges on gitget.* to '{계정 이름}'@'%';
Query OK, 0 rows affected (0.001 sec)
# 권한 적용 - 꼭 해야합니다!
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.001 sec)
MariaDB [mysql]>
✅ 참고 자료 & 링크