본문 바로가기
Linux

Ubuntu 24.04 Docker 및 MySQL 컨테이너 설치

by 나하니인데 2025. 1. 19.
반응형

이제 우분투 설치를 완료했으니, 서버 구축의 다음 단계로 넘어가 보려고 합니다. 보통은 네트워크 설정이나 방화벽 설정이 우선순위가 되겠지만, 현재는 사설 네트워크 내에서만 개발할 예정이라 이 부분은 후순위로 미뤄두었습니다.

대신 오늘은 MySQL 데이터베이스 구축을 진행하려고 하는데요, 여기서 한 가지 중요한 결정을 했습니다. 바로 MySQL을 호스트에 직접 설치하지 않고 Docker 컨테이너로 구축하기로 한 것입니다.

왜 Docker 컨테이너를 선택했나?

제가 Docker 컨테이너를 선택한 데에는 몇 가지 중요한 이유가 있습니다.

 

1. Kubernetes와 Docker 실습 환경 구축

사실 이것이 가장 큰 이유입니다. 추후 쿠버네티스와의 연동을 고려할 때, 데이터베이스가 stateful 상태라는 특성을 가지고 있어 이를 실습해 보기 좋은 케이스라고 판단했습니다.

 

2. 프로젝트 격리성 확보

여러 프로젝트를 진행하다 보면 각각의 데이터베이스 설정이 충돌할 수 있습니다. 컨테이너를 사용하면 각 애플리케이션의 데이터베이스를 완벽하게 격리할 수 있어 이러한 문제를 방지할 수 있습니다.

 

3. 뛰어난 이식성

환경을 컨테이너로 정의해두면, 추후 다른 서버나 클라우드로 이전할 때 큰 이점이 있습니다. 이미지만 다시 설치하면 동일한 환경을 쉽게 구축할 수 있기 때문입니다.

 

물론 컨테이너화된 데이터베이스가 로컬 설치보다 성능이 다소 떨어질 수 있습니다. 하지만 제가 구축하려는 소규모 서비스에서는 그 차이가 크지 않을 것으로 판단됩니다.

 

 

우분투 도커 설치

1. 패키지 업데이트

sudo apt-get update

 

2. 필요 패키지 설치

HTTPS를 통해 Ubuntu 24.04가 Docker 저장소에 액세스 할 수 있도록 필요한 패키지를 설치

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

 

3. Docker 공식 GPG 키 추가

Docker의 공식 패키지를 인증할 수 있도록 GPG 키를 추가합니다.

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

 

4. Docker 공식 리포지토리 추가

Docker 패키지를 설치하기 위해 공식 Docker 리포지토리를 시스템에 추가합니다.

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

5. 패키지 목록 업데이트

새로 추가된 Docker 저장소를 사용하기 위해 패키지 목록을 업데이트

sudo apt-get update

 

6. Docker 설치

sudo apt-get install docker-ce docker-ce-cli containerd.io

 

7. Docker Version 확인

sudo docker --version

정상적으로 설치되었다면 Docker의 버전 정보가 출력됩니다.

 

8. Docker 서비스 실행 및 자동 시작 설정

sudo systemctl start docker
sudo systemctl enable docker

 

9. 현재 사용자에게 Docker 권한 추가

매번 sudo 치고 docker 사용하면 귀찮으니깐 sudo 없이 Docker 명령어를 실행하려면 현재 사용자를 docker 그룹에 추가합니다.

sudo usermod -aG docker $USER

변경 사항을 적용하려면 로그아웃 후 다시 로그인

 

10. Docker 테스트

docker run --rm -d -p 8080:80 --name test-nginx nginx

해당 명령어를 입력한 후 이미지와 컨테이너가 잘 설치되어 있는지 확인합니다. 8080으로 열었으니 접속도 해보겠습니다.

 

잘 되는것을 확인하고 nginx 이미지와 컨테이너를 지워주고 이제 MySQL 컨테이너를 설치해 보겠습니다.

 

MySQL 컨테이너 설치

1. MySQL 컨테이너 실행

docker run -d \
--name mysql-container \
-e MYSQL_ROOT_PASSWORD=rootpassword \
-e MYSQL_DATABASE=testdb \
-e MYSQL_USER=testuser \
-e MYSQL_PASSWORD=testpassword \
-p 3306:3306 \
-v mysql_data:/var/lib/mysql \
mysql:latest

 

명령어 옵션 설명

  • -d: 컨테이너를 백그라운드에서 실행.
  • --name mysql-container: 컨테이너 이름을 mysql-container로 지정.(저는 제가 진행할 프로젝트 이름으로 진행)
  • -e MYSQL_ROOT_PASSWORD=rootpassword: MySQL 루트 계정 비밀번호 설정.
  • -e MYSQL_DATABASE=testdb: 초기 생성할 데이터베이스 이름.
  • -e MYSQL_USER=testuser: 생성할 사용자 이름.
  • -e MYSQL_PASSWORD=testpassword: 생성할 사용자의 비밀번호.
  • -p 3306:3306: 호스트의 3306 포트를 컨테이너의 3306 포트에 매핑.
  • -v mysql_data:/var/lib/mysql: Docker 볼륨 mysql_data를 MySQL 데이터 디렉터리에 연결(데이터 영속성 보장).
  • mysql:latest: MySQL의 최신 버전 이미지를 사용.

잘 생성되었는지 확인

 

내가 호스트랑 연결한 볼륨이랑 컨테이너 안에 있는 볼륨이랑 잘 마운트가 잘 되었는지 확인.

기본적으로 /var/lib/docker 디렉터리는 root 사용자만 접근할 수 있어서 root로 계정전환해서 확인.

제가 만든 경로 devops_quiz_data/mysql_data 를 확인 할 수 있습니다.

 

 

위에 있는 사진은 왼쪽 MySQL 컨테이너의 데이터 디렉토리(/var/lib/mysql)와 오른쪽 Docker 볼륨(devops_quiz_data)이 제대로 연결되고, 데이터가 영속적으로 저장되고 있는 상태를 보여줍니다. 이는 Docker 볼륨을 통한 데이터 보존 및 컨테이너 간 데이터 공유 설정이 잘 작동하고 있음을 확인할 수 있습니다.

 

이제 MySQL 컨테이너가 성공적으로 설치되었으니, 다음 단계로 넘어가보려고 합니다. 서버로 활용하기 위해서는 가장 기본적으로 원격 접속 환경이 구축되어야 하는데요, 이를 위해 SSH를 설치하고 설정하는 작업을 진행하려고 합니다.

 

미니 PC에 SSH 설치

1. SSH 서버 설치

우분투 에 SSH 서버가 설치되어 있지 않다면, 먼저 설치해야 합니다

sudo apt update
sudo apt install -y openssh-server

 

2. SSH 서비스 시작 및 활성화

SSH 서버를 시작하고, 재부팅 시 자동으로 실행되도록 설정합니다

sudo systemctl start ssh
sudo systemctl enable ssh

 

3. SSH 상태 확인

sudo systemctl status ssh

잘 되는것을 확인했습니다.

 

4. 방화벽 설정

만약 서버에서 방화벽(UFW)이 활성화되어 있다면 SSH 포트를 허용해야 합니다

sudo ufw allow ssh
sudo ufw enable
sudo ufw status

SSH(22번 포트)가 허용된것을 확인했습니다.

 

5. 원격 접속 테스트

원격인 맥에서 접속시도 했습니다.

 

잘 접속이 되는것을 확인할수있습니다.

 

하지만 매번 이렇게 접속을 하면 비밀번호를 입력하고 들어가야하기때문에 공개키를 만들어서 비밀번호 없이도 서버와 ssh 연결을 안전하고 편리하게 할 목적으로 진행하겠습니다.

 

1. 클라이언트(내 컴퓨터)에서 SSH 키 생성

ssh-keygen -t rsa -b 4096 -f ~/.ssh/my_custom_key

 

2. 공개 키를 서버에 복사

ssh-copy-id -i ~/.ssh/my_custom_key.pub <서버 접속 계정>@<서버 IP 주소>

 

3. ssh key 사용하여 서버 접속

ssh -i ~/.ssh/my_custom_key <서버 접속 계정>@<서버 IP 주소>

 

접속 성공.

 

SSH로 서버에 접속할 때마다 -i 옵션과 함께 SSH 키 파일의 경로를 입력하는 것이 번거롭게 느껴졌습니다. 이런 번거로움을 해결하기 위해 SSH Config 파일을 사용하여 SSH 키를 관리하기로 했습니다. Config 파일을 사용하면 복잡한 SSH 접속 설정을 간단한 별칭으로 저장해두고 사용할 수 있기 때문입니다.

 

4. SSH Config 파일 사용

~/.ssh/config 파일을 열고 다음 내용을 추가합니다

Host n100-server
    HostName 192.168.0.57
    User sungmin
    IdentityFile ~/.ssh/n100_server
    Port 22

 

  • Host: 별칭(원하는 이름으로 설정 가능).
  • HostName: 접속할 서버의 IP 주소.
  • User: 사용자 이름(예: root).
  • IdentityFile: 사용하려는 키 파일의 경로.
  • Port: SSH 포트(기본값 22).

5. 접속 테스트

ssh n100-server

 

 

 

접속 성공!

 

원격에서 MySQL 접속

ssh 활용하여 서버 접속도 끝냈고 이제 원격에서 MySQL 접속 설정을 하겠습니다. 저는 제 컴퓨터에서 GUI 사용할 계획이여서 MySQL Workbench 다운로드 하고 접속 해보겠습니다.

 

다운로드 후 MySQL 컨테이너 원격 접속전에 필요한 설정이 있습니다

 

1. MySQL 컨테이너 원격 접속 허용

MySQL 컨테이너의 bind-address 설정이 0.0.0.0인지 확인

컨테이너 접속 후 

cat /etc/mysql/my.cnf | grep bind-address

 

저는 /etc/mysql 디렉토리 안에 conf.d 디렉토리 바께 없었습니다. 그래서 find /etc -name "*.cnf" 사용 하여서 MySQL 설정 파일이 어디있는지 찾아봤습니다.

확인 결과 저는 etc 하위 경로에 my.cnf 가 있었습니다.

 

2. MySQL 설정 파일 편집

echo "[mysqld]" > my.cnf
echo "bind-address = 0.0.0.0" >> my.cnf

 

이 명령어를 사용하는 이유는 MySQL 서버가 외부에서의 원격 접속을 허용하도록 설정하기 위함입니다. 기본적으로 MySQL은 보안을 위해 로컬 호스트(127.0.0.1)에서만 접속을 허용합니다.

 

echo "[mysqld]" > my.cnf

  • MySQL 서버 설정을 정의하는 섹션 [mysqld]를 추가합니다.
  • [mysqld]는 MySQL 서버 데몬에 대한 설정을 담는 섹션입니다. 이 아래에 옵션들을 추가할 수 있습니다.

echo "bind-address = 0.0.0.0" >> my.cnf

  • bind-address는 MySQL 서버가 특정 네트워크 인터페이스에서의 접속을 허용할지를 설정합니다.
  • 0.0.0.0은 모든 네트워크 인터페이스에서의 접속을 허용한다는 의미입니다. 이 설정을 통해 MySQL 서버는 외부 IP 주소에서도 접속이 가능해집니다.

 

3. MySQL 재시작

docker restart mysql-container

 

4. MySQL workbench 접속

 

원격 DB 접속 성공.

 

이제 원격에 DB 서버를 만들었고. 백엔드 개발 및 디비 테이블 만들어서 개발을 계속 진행하면 될 것 같습니다.

 

이제 기본적인 홈서버 환경 구축이 완료되었습니다. Ubuntu 운영체제 위에 Docker로 MySQL을 구동하고, SSH를 통한 원격 접속 환경까지 구성했습니다.

앞으로는 이 환경을 기반으로 본격적인 개발을 시작할 수 있게 되었는데요, 구체적으로는:

  • 백엔드 서버 개발
  • 데이터베이스 테이블 설계 및 구현
  • 실제 서비스 구현
반응형

댓글