본문 바로가기
기술 공부/DevOps

Rocky Linux 기반 GitLab Docker 설치하기

by soy-ul 2026. 1. 24.
반응형
시리즈 : GitLab + Terraform + Ansible 으로 VM 프로비저닝 자동화하기 

1. [Rocky Linux 기반 GitLab Docker 설치하기] 
2. [Terraform 기초 - Docker Provider로 배우기] 
3. [GitLab Runner + Terraform으로 VM 자동 프로비저닝]
4. [Terraform 디스크 문제와 xe 명령어 전환] (예정)
5. [GitHub vs GitLab CI/CD 실전 비교] (예정)

🔹 들어가며

좋은 기회로 팀 내 리소스 자동화 툴을 생성하는 사이드 프로젝트를 진행하게 되었습니다.

본격적인 프로덕션 환경을 구축하기 전에, Docker 기반 테스트 환경에서 GitLab 구성한 내용들을 정리해보았습니다. 

 

🔹 GitLab vs GitHub

구분 GitLab GitHub
온프레미스 비용 CE 무료 Enterprise Server 유료
Self-Hosted 무료로 가능 유료 라이선스 필요
CI/CD GitLab CI 내장 GitHub Actions 내장
Runner Self-hosted 가능 Self-hosted 가능

 

왜 Docker로 테스트하는가?

  • 빠른 구축/철거: 실험 후 완전히 제거하고 재시작 가능
  • 격리된 환경: 호스트 시스템에 영향 없이 설정 테스트
  • 구성 문서화: docker-compose.yml이 설치 문서 역할

 

🔹 설치 과정

환경

  • 서버: Rocky Linux 9.7 
  • Docker: 29.1.5
  • Docker Compose: 5.0.2

작업 순서

1. Docker 설치

# 기존 컨테이너 런타임 제거 (Podman 등)
sudo dnf remove -y podman runc

# Docker 공식 저장소 추가 및 설치
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 서비스 시작
sudo systemctl start docker
sudo systemctl enable docker

 

2. GitLab 구성

# 데이터 디렉토리 생성
sudo mkdir -p /home/gitlab/{config,logs,data}

# docker-compose.yml 구성정보
cat /home/gitlab/docker-compose.yml
services:
  gitlab:
    image: gitlab/gitlab-ce:latest #현 gitlab 최신 이미지 설치
    container_name: gitlab
    restart: always #컨테이너 자동 재시작 설정
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://[IP]' # IP정보 가림처리
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        # 메모리 최적화
        puma['worker_processes'] = 2
        sidekiq['concurrency'] = 10
        prometheus_monitoring['enable'] = false
    ports: # 호스트 포트 포워딩
      - '80:80'
      - '443:443'
      - '2222:22'
    volumes: #호스트 볼륨 연결
      - '/home/gitlab/config:/etc/gitlab'
      - '/home/gitlab/logs:/var/log/gitlab'
      - '/home/gitlab/data:/var/opt/gitlab'
    shm_size: '256m'

 

 

주요 설정:

  • gitlab_shell_ssh_port: 호스트 SSH(22)와 충돌 방지
  • puma/sidekiq: 테스트 환경이므로 최소 리소스 설정
  • prometheus: 모니터링 비활성화로 메모리 절약
  • puma 역할: GitLab의 웹 애플리케이션 서버. 사용자의 HTTP 요청을 처리 (웹 페이지 로딩, API 호출 등)
    • worker_processes(동시 요청을 처리할 수 있는 프로세스 개수) 2으로 제한. 기본 설정값은 4
    • 사용자 수에 따른 파라미터 조정 필요.
  • sidekiq 역할: GitLab의 백그라운드 작업 처리 엔진
    • concurrency(동시에 처리할 수 있는 백그라운드 작업 수) 10으로 제한. 기본 설정값은 25

 

3. 방화벽 설정 및 시작

# 방화벽 포트 오픈
sudo firewall-cmd --permanent --add-port={80,443,2222}/tcp
sudo firewall-cmd --reload

# GitLab 시작
cd /home/gitlab
docker compose up -d

# 상태 확인 (3~5분 소요, healthy 될 때까지 대기)
docker ps

 

4. 초기 비밀번호 확인

# root 계정 초기 비밀번호 확인 (24시간 후 삭제됨)
docker exec gitlab cat /etc/gitlab/initial_root_password | grep Password:

GitLab은 처음 실행 시 root 계정의 임시 비밀번호를 자동 생성합니다.

초기 패스워드는 24시간 후 자동 삭제되며, 로그인 후 반드시 비밀번호 변경이 필요합니다. 

 

5. 접속 및 로그인

  • URL: http://[IP]
  • 계정: root
  • 비밀번호: (위에서 확인한 값)

🔹 검증

# 컨테이너 상태
$ docker ps
CONTAINER ID   IMAGE                     COMMAND                   CREATED        STATUS                  PORTS                                                                                                                   NAMES
619244202fd8   gitlab/gitlab-ce:latest   "/assets/init-contai…"   19 hours ago   Up 19 hours (healthy)   0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp, 0.0.0.0:2222->22/tcp, [::]:2222->22/tcp   gitlab

# 컨테이너 리소스 사용량
$ docker stats gitlab --no-stream
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O         BLOCK I/O        PIDS
619244202fd8   gitlab    0.34%     3.518GiB / 31.08GiB   11.32%    423kB / 449kB   5.28MB / 2.7GB   205

# GitLab 서비스 상태
# 호스트 서버에서 확인
$ docker exec gitlab gitlab-ctl status
or
#컨테이너 접속 후 확인
$ docker exec -it [container_id] bash
$ gitlab-ctl status
run: gitaly: (pid 1184) 66745s; run: log: (pid 548) 66847s
run: gitlab-kas: (pid 804) 66836s; run: log: (pid 820) 66835s
run: gitlab-workhorse: (pid 1157) 66746s; run: log: (pid 958) 66770s
run: logrotate: (pid 13992) 2060s; run: log: (pid 497) 66857s
run: nginx: (pid 1173) 66746s; run: log: (pid 1064) 66763s
run: postgresql: (pid 572) 66842s; run: log: (pid 782) 66839s
run: puma: (pid 875) 66784s; run: log: (pid 889) 66781s
run: redis: (pid 500) 66854s; run: log: (pid 509) 66853s
run: sidekiq: (pid 896) 66778s; run: log: (pid 918) 66775s
run: sshd: (pid 40) 66866s; run: log: (pid 39) 66866s

모든 서비스가 run 상태여야 정상입니다.

 

🔹 트러블슈팅

 

메모리 부족 시:

docker exec gitlab vi /etc/gitlab/gitlab.rb
# puma['worker_processes'] = 1
# sidekiq['concurrency'] = 5

docker exec gitlab gitlab-ctl reconfigure
docker restart gitlab

 

 

초기 비밀번호 분실 시:

#gitlab 콘솔 접속
sudo gitlab-rails console

#비밀번호 변경할 ID(root) 찾기
user = User.find_by_username [변경할 사용자ID]

gitlab(prod)> new_password='new_password'
=> "new_password"

gitlab(prod)> user.password=new_password
=> "new_password"
gitlab(prod)> user.password_confirmation=new_password
=> "new_password"

#설정 저장
gitlab(prod)> user.save!
=> true

위처럼 gitlab CLI 명령어로 변경하거나, 기존 패스워드를 입력하여 웹페이지에서 패스워드를 변경할 수 있다. 

 

 

🔹 다음 계획

  • Terraform/Ansible 연동
  • GitLab Runner 설치 (미정)

🔹 마치며

이번에도 Docker Hub를 통해 손쉽게 GitLab 테스트 환경을 구축할 수 있어 좋았습니다. GitHub는 몇 번 테스트를 해보았지만 GitLab은 처음이라, 이 두 서비스의 공통점과 차이점은 어떤것이 있을지 시간을 들여 알아가는 것도 재미있을 것 같습니다.

다음 편에서는 Terraform, Ansible을 CI/CD 파이프라인에 추가하여 서비스 간 연동이 어떻게 되는지 공부한 내용들을 정리해보겠습니다.


 

다음 글 :  [Terraform 기초 - Docker Provider로 배우기

 

 

감사합니다! 

반응형