AWS

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

HEY__ 2024. 5. 31. 15:42
728x90

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

 

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

 

mariadb Tags | Docker Hub

mariadb •• MariaDB Server is a high performing open source relational database, forked from MySQL.

hub.docker.com

 

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

심플하게 제일 위에 있는 `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]>

✅  참고 자료 & 링크

 

 

728x90