최근 Docker를 활용한 이미지 배포와 클라우드 환경에서의 VM 구축 경험을 통해, 인프라 및 미들웨어 설정이 얼마나 간소화되었는지 체감하고 있습니다. 이전보다 훨씬 수월하게 개발 및 배포 환경을 구성할 수 있게 된 덕분에, 이번 프로젝트에서는 **기본 인프라(혹은 인프라 기반)**를 탄탄하게 만든 후, 실제 서비스 구동에 필요한 웹 서비스 환경을 구축해보려고 합니다.

프로젝트 개요

이번 프로젝트의 주요 목표는 다음과 같습니다.

  • 인프라 구성:
    • GCP 혹은 Azure의 무료 티어를 활용하여 VM을 생성합니다.
    • 해당 VM 위에 Docker를 설치해 컨테이너 기반 환경을 구축합니다.
  • 서비스 구성:
    • Docker 컨테이너 내에서 nginx와 tomcat을 활용해 웹 서비스를 운영합니다.
    • 백엔드는 Spring Boot, 프론트엔드는 React를 사용하여 개발합니다.
  • CI/CD 파이프라인 구축:
    • 개인 GitHub 저장소를 이용해 코드 관리를 하고, 이를 통해 CI(Continuous Integration)를 구성합니다.
    • GitLab과 같은 다른 CI 도구도 고려해봤지만, 서버 리소스 사용량이 많아 클라우드 환경에 부적합하다고 판단하여 GitHub 방식으로 진행할 예정입니다.

 

Docker로 인프라 구축하기

 

Docker를 도입하면서부터 인프라 관련 설정이 크게 간소화된 것을 느낍니다.
기존에는 직접 VM에 서버 설정을 하고, 필요한 미들웨어를 하나하나 설치하며 시간을 많이 소비했지만, 이제는
Docker 이미지로 배포를 통일하여 빠르고 일관된 환경 구성이 가능해졌습니다.

예를 들어, Nginx와 Tomcat을 각각 컨테이너로 운영한다면, 다음과 같은 장점이 있습니다.

  • 일관성:
    개발 환경과 운영 환경의 차이를 줄일 수 있습니다.
  • 유연성:
    컨테이너 단위로 손쉽게 배포 및 스케일 아웃할 수 있습니다.
  • 효율성:
    리소스 사용 최적화와 빠른 배포가 가능합니다.

웹 서비스 구현 기술 스택

프로젝트의 서비스 부분은 상대적으로 가장 익숙한 환경인 Spring Boot와 React를 활용할 예정입니다.
이 조합은 백엔드와 프론트엔드 모두 빠르게 개발할 수 있는 강력한 도구임은 물론,
다양한 커뮤니티 자료와 템플릿 덕분에 초반 개발 부담을 줄이는 데 도움이 됩니다.

무료 웹 템플릿, 어디서 구하지?

프론트엔드 쪽은 전문성이 깊지 않기 때문에, 무료로 사용할 수 있는 웹 템플릿 제공 사이트가 있다면 큰 도움이 될 것 같습니다.
우선은, 아래의 사이트를 참고할 예정이고 다음에 무료 리소스 관련 정리를 추가로 하려합니다.

  • Start Bootstrap:
    Bootstrap 기반의 다양한 무료 템플릿을 제공하여, 빠른 프로토타이핑에 유용합니다.
  • HTML5 UP:
    현대적이고 세련된 디자인의 템플릿들을 무료로 제공합니다.
  • Colorlib:
    여러 가지 카테고리의 무료 HTML 템플릿을 다운로드할 수 있습니다.
  • FreeHTML5.co:
    다양한 레이아웃과 디자인의 템플릿을 무료로 제공합니다.

이 외에도 여러 무료 리소스들이 있으니, 자신의 프로젝트 스타일에 맞는 템플릿을 찾아보시면 좋겠습니다.

CI/CD와 GitHub를 통한 배포 전략

초기에는 GitLab을 통한 CI/CD 구축을 고려했지만, 서버 리소스 사용량이 예상보다 많아 클라우드 환경에 적합하지 않을 수 있다는 판단 하에, 개인 GitHub 저장소를 통해 코드를 관리하고 clone하여 배포하는 방식을 택할 예정입니다.

이 방식은 다음과 같은 이점이 있습니다.

  • 경량화:
    클라우드 자원의 효율적 사용이 가능합니다.
  • 유연성:
    개인 저장소를 통해 손쉽게 코드 배포 및 버전 관리를 할 수 있습니다.
  • 확장성:
    추후에 필요시 다른 CI/CD 도구로의 전환도 고려할 수 있습니다.

앞으로의 계획

이번 글에서는 전체 프로젝트의 개요와 주요 목표, 그리고 사용 기술 스택에 대해 소개드렸습니다.
앞으로는 각 구성 요소에 대해 더 구체적인 내용과 설정 방법, 배포 전략 등을 하나씩 상세하게 다루는 글들을 연재할 계획입니다.

  1. 인프라 설정: GCP/Azure의 무료 티어 VM 구축 및 Docker 설치
  2. 컨테이너 구성: nginx와 tomcat Docker 컨테이너 구성 방법(혹은 Jenkins와 같은 CI도구까지)
  3. 웹 서비스 개발: Spring Boot와 React를 이용한 기본 서비스 구현
  4. CI/CD 파이프라인 구축: GitHub를 활용한 자동화 배포 전략

프로젝트 진행 과정에서 얻은 경험과 팁들을 공유하면서, 비슷한 고민을 하고 계신 분들께 도움이 될 수 있기를 바랍니다.

도커(Docker)는 컨테이너 기반 가상화 기술로, 개발 환경을 구축하고 애플리케이션을 배포하는 데 필수적인 도구입니다. 도커를 사용하려면 여러 가지 명령어를 익혀야 하며, 특히 이미지 관리, 컨테이너 실행, 빌드 및 시스템 관리 관련 명령어는 실무에서 자주 사용됩니다.

이 글에서는 도커를 사용할 때 반드시 알아야 할 주요 명령어들을 정리하고, docker run 명령어의 다양한 옵션까지 함께 살펴보겠습니다.

1. 이미지 관련 명령어

도커의 이미지는 컨테이너를 실행하는 데 필요한 모든 요소(코드, 런타임, 라이브러리 등)를 포함하고 있습니다.

  • 이미지 목록 확인:
    docker images
    docker image ls
  • 이미지 검색:
    docker search <이미지 이름>
  • 이미지 다운로드(Pull):
    docker pull <이미지명:태그>
  • 이미지 삭제:
    docker rmi <이미지 ID 또는 이름>
  • 사용하지 않는 이미지 정리:
    docker image prune

2. 컨테이너 관련 명령어

도커 컨테이너는 실행 중인 애플리케이션의 인스턴스입니다. 컨테이너를 생성, 실행, 중지하는 명령어들을 살펴봅니다.

  • 컨테이너 생성 및 실행:
    docker run <옵션> <이미지명>
  • 실행 중인 컨테이너 목록 확인:
    docker ps
  • 모든 컨테이너 목록(중지된 컨테이너 포함) 확인:
    docker ps -a
  • 컨테이너 중지:
    docker stop <컨테이너 ID>
  • 컨테이너 시작:
    docker start <컨테이너 ID>
  • 컨테이너 재시작:
    docker restart <컨테이너 ID>
  • 컨테이너 삭제:
    docker rm <컨테이너 ID>

3. docker run의 주요 옵션 정리

docker run 명령어는 컨테이너를 실행할 때 사용하는 가장 중요한 명령어 중 하나입니다. 다양한 옵션을 활용하면 컨테이너 실행 방식을 세밀하게 제어할 수 있습니다.

 

-d 백그라운드에서 컨테이너 실행 (detached mode)
--name <이름> 컨테이너에 사용자 정의 이름 지정
-p <호스트 포트>:<컨테이너 포트> 컨테이너의 포트를 호스트에 바인딩
-v <호스트 디렉터리>:<컨테이너 디렉터리> 볼륨을 마운트하여 데이터 유지
--rm 컨테이너 종료 시 자동 삭제
-e <환경변수>=<값> 컨테이너 내부에서 사용할 환경변수 설정
--network <네트워크명> 특정 네트워크에 컨테이너 연결
--memory <메모리 크기> 컨테이너의 메모리 사용량 제한
--cpus <CPU 개수> 컨테이너의 CPU 사용량 제한

4. 빌드 및 기타 명령어

  • Dockerfile을 사용해 이미지 빌드:
    docker build -t <이미지명:태그> <Dockerfile 경로>
  • 컨테이너를 이미지로 저장:
    docker commit <컨테이너 이름> <새 이미지명>
  • 도커 버전 확인:
    docker version
  • 도커 시스템 정보 확인:
    docker info

마무리

위에서 정리한 명령어들은 도커를 사용할 때 가장 기본적이면서도 필수적인 기능들입니다. 컨테이너 환경을 더욱 효율적으로 관리하려면 각 명령어의 다양한 옵션을 이해하고 활용하는 것이 중요합니다.

다음 글에서는 Docker Pointainer 같은 GUI 툴 활용법메모리 제한, 네트워크 설정 등 컨테이너 최적화 기법을 다뤄보겠습니다.

1. 개요

GitLab CE(Community Edition)는 Git 리포지토리 관리 및 CI/CD 기능을 제공하는 강력한 도구입니다. Ubuntu 22.04에서 Docker를 사용하여 최신 GitLab CE를 설치하고, root 계정의 비밀번호를 초기화하는 과정을 정리하겠습니다.

2. GitLab CE Docker 컨테이너 설치

2.1. Docker 설치 (미설치 시)

 

 

2.2. GitLab CE 컨테이너 실행

아래 명령어를 실행하여 최신 GitLab CE를 컨테이너로 배포합니다.

docker run --detach \ 
--hostname gitlab.example.com \
--publish 80:80
--publish 443:443
--publish 2222:22 \
--name gitlab \
--restart always \
--volume /data/gitlab/config:/etc/gitlab \
--volume /data/gitlab/logs:/var/log/gitlab \
--volume /data/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest
 

명령어 설명:

  • --hostname gitlab.example.com → GitLab의 도메인 지정 (변경 가능)
  • --publish 80:80, 443:443, 2222:22 → HTTP, HTTPS, SSH 포트 설정
  • --name gitlab → 컨테이너 이름을 gitlab으로 설정
  • --restart always → 서버 재부팅 시 자동 시작
  • /data/gitlab/config, /data/gitlab/logs, /data/gitlab/data → 데이터 유지용 볼륨 설정

컨테이너 실행 상태를 확인합니다.

docker ps -a

3. GitLab root 계정 비밀번호 초기화

GitLab 설치 후, root 계정의 초기 비밀번호를 찾거나 변경해야 합니다.

3.1. 초기 비밀번호 확인

설치 후 GitLab은 /etc/gitlab/initial_root_password에 임시 비밀번호를 저장합니다.

sudo cat /srv/gitlab/config/initial_root_password
 

위 파일이 존재한다면, 해당 비밀번호를 사용하여 로그인합니다.

3.2. 비밀번호 재설정 (초기 비밀번호 분실 시)

root 계정의 비밀번호를 초기화하려면 다음 단계를 수행합니다.

  1. GitLab 컨테이너에 접속
     
    docker exec -it gitlab bash
  2. GitLab Rails 콘솔 실행
     
    gitlab-rails console -e production
  3. oot 계정 비밀번호 변경
    user = User.find_by(username: 'root')
    user.password = '새로운비밀번호'
    user.password_confirmation = '새로운비밀번호'
    user.save!
  4. 콘솔 종료 후 컨테이너 재시작
    exit
    docker restart gitlab

4. GitLab 접속 및 초기 설정

설치가 완료되면 웹 브라우저에서 GitLab에 접속합니다.(http://<서버IP>)

 

로그인 후 사용자 계정을 추가하고 기본 설정을 진행하면 GitLab을 사용할 준비가 완료됩니다.

처음엔 그냥 GCP VM에 Docker를 설치하고, GitLab까지 올리면 끝날 줄 알았다. 하지만 예상과 다르게 메모리 부족, 디스크 부족이라는 현실이 기다리고 있었다. 겨우 해결했다고 생각했는데, VM을 재부팅하니 NAS 마운트가 풀려있었다...

이번 글에서는 GCP VM에서 메모리를 증설하고, 디스크를 마운트하는 과정 그리고 NAS 마운트를 부팅 시에도 유지하는 방법을 시행착오와 함께 정리해보려고 한다.


1. GCP VM에서 Docker & GitLab 설치 후 자원 부족 문제

GitLab 설치 후 메모리 부족 발생

GitLab을 설치한 후 실행하는데, OOM(Out of Memory) 오류가 발생했다.
로그를 확인해보니 메모리가 부족해서 프로세스가 종료되는 상황이었다.

(VM에 접속이 안되던 경우가 잦았는데 메모리 부족이 원인이었던듯..)

해결: VM 메모리 증설

메모리를 늘리려면 GCP에서 인스턴스 유형을 변경해야 한다.
GCP 콘솔에서 다음 경로로 이동했다.

Compute Engine → VM 인스턴스 → 해당 VM 클릭 → 수정

여기서 머신 유형을 업그레이드하고, 메모리를 늘린 뒤 저장하면 끝!
하지만, VM을 멈추고 변경해야 하는 점을 기억하자.

터미널에서 직접 변경하려면 다음 명령어를 사용할 수도 있다.

gcloud compute instances set-machine-type [VM_NAME] --machine-type=e2-standard-4

 

이제 다시 실행해보니 GitLab이 정상적으로 동작했다.


2. 디스크 부족 해결: 새로운 디스크 추가 후 마운트

GitLab이 정상 동작하는 듯했지만, 이번에는 디스크 용량 부족 문제가 터졌다.

추가로 설치할 것이 많아서, 추가 디스크를 연결하기로 했다.

새로운 디스크 생성 및 VM에 연결

  1. GCP 콘솔에서 Compute Engine → 스토리지 → 디스크 → 새 디스크 생성
  2. 기존 VM과 같은 존(zone) 선택
  3. 적절한 크기(예: 100GB) 설정 후 저장

이제 이 디스크를 VM에 마운트해야 한다.

 
lsblk # 새 디스크 확인
sudo mkfs.xfs /dev/sdb # 파일 시스템 생성
sudo mkdir /data/gitlab_data # 마운트할 폴더 생성
sudo mount /dev/sdb /data/gitlab_data # 디스크 마운트

3. NAS 마운트 유지하기 (재부팅 후에도 유지되게 설정)

디스크까지 마운트하고 나서 안심했지만, VM을 재기동하니 NAS 마운트가 풀려 있었다.
GitLab 데이터 저장을 위해 NAS를 연결했는데, 부팅 후 다시 마운트해야 하는 문제가 발생했다.

수동 NAS 마운트 방법

 
sudo mount /dev/sdb /data/gitlab_data # 디스크 마운트

해결: /etc/fstab에 NAS 마운트 추가

자동 마운트를 위해 /etc/fstab에 다음 내용을 추가했다.

sudo blkid #디스크 UUID 확인
nano /etc/fstab
UUID=0c0216-****************-************** /data xfs default 0 2
sudo mount -a # 설정적용확인
 

사용자마다 /etc/fstab 내용은 다를 수 있다. 기본으로 입력되어 있는 정보들은 잘 못 건드리면 부팅이 안될 수도 있으니 건드리지 말고, 마지막 줄에 mount 하고자 하는 내용을 입력하면 된다.

 

마지막에 숫자 0 2 의 의미는 각각 dump 생성 여부 / fsck 실행 순서를 나타내는데, 잘 모르겠다면 0, 2 로 셋팅하면 되는거 같다.


마무리

이번 삽질(?)을 통해 다음과 같은 교훈을 얻었다.

  1. GitLab은 메모리를 많이 먹으므로 충분한 메모리를 확보할 것.(비용을 고려하면,  다른 형상관리 및 CI/CD를 사용하는것도..)
  2. 디스크가 부족하면 VM에 새로운 디스크를 추가하고 자동 마운트를 설정할 것.
  3. NAS 마운트가 풀리는 문제는 /etc/fstab에 옵션을 추가해 해결할 것.

이제 GCP에서 GitLab을 안정적으로 운영할 수 있게 되었다.
혹시라도 같은 문제를 겪는 분들에게 도움이 되었으면 좋겠다!

이번 글에서는 GCP VM을 생성하고 Docker를 설치하는 과정을 정리해보려고 한다.


1. GCP에서 VM 인스턴스 생성

먼저, GCP 콘솔에서 새로운 VM을 생성한다.

  • Compute Engine → VM 인스턴스 → 새 인스턴스 만들기
  • Ubuntu LTS 버전 선택 (Ubuntu 22.04 사용)
  • 방화벽에서 HTTP, HTTPS 트래픽 허용 체크

설정을 마치고 생성 버튼을 누르면 VM이 만들어진다.


2. SSH로 접속하기

VM이 생성되면 SSH로 접속해야 한다. GCP 콘솔에서 바로 연결할 수도 있고, 로컬 터미널에서 SSH를 사용할 수도 있다.

gcloud compute ssh [VM_NAME] --zone=[ZONE]
 
또는, 공개 키가 등록된 경우 일반 SSH로 접속할 수도 있다.
ssh -i ~/.ssh/id_rsa [USER]@[VM_EXTERNAL_IP]

접속 후 바로 업데이트부터 해준다.

sudo apt update && sudo apt upgrade -y

3. Docker 설치

이제 Docker를 설치해보자. 공식 문서를 따라 하면 쉽게 될 줄 알았지만, 몇 가지 추가 설정이 필요했다.

1) Docker 패키지 설치

sudo apt install -y docker.io

 

2) 서비스 시작 및 활성화

sudo systemctl start docker sudo systemctl enable docker

 

3) 현재 사용자에게 Docker 권한 부여

Docker 명령어를 실행할 때마다 sudo를 붙이기 귀찮다면 현재 사용자를 docker 그룹에 추가하자.

sudo usermod -aG docker $USER

변경 사항을 적용하려면 로그아웃 후 다시 로그인하거나, 다음 명령어를 실행한다.

newgrp docker

이제 docker ps 같은 명령어를 sudo 없이 사용할 수 있다.


4. Docker 정상 작동 확인

Docker가 정상적으로 설치되었는지 확인해보자.

docker --version
 

 


마무리

GCP에서 VM을 생성하고 Docker를 설치하는 과정은 간단해 보이지만, 직접 해보면 예상치 못한 문제들이 발생할 수 있다. 다음에는 VM에 NAS를 mount하는 방법과 Docker 명령어를 정리해보도록 하겠다.

+ Recent posts