본문 바로가기
서버

Docker를 이용한 사내 GitLab 설치하기

by wwns 2023. 2. 3.
반응형

프로젝트를 진행하면서 외부에 공개되면 안 되는 소스 코드를 어떻게 관리할지 고민하다 도커 이미지로 GitLab을 사내 서버에 띄워서 사용하면, private 하게 프로젝트를 관리할 수 있다고 하여 세팅을 하게 되었고, 일련의 과정이기 때문에 문서화하여 사내에 공유하고 나는 블로그로 기록을 남기기로 했다.

 

  • 서버는 Ubuntu 22.04 LTS를 사용하였다.

도커 공식 문서를 참고하여 작성하였습니다.

 

사전 작업

  • 도커를 설치하기 전에 진행

출처: https://docs.docker.com/desktop/install/ubuntu/

  1.  gnome-terminal을 설치
  2. 이전에 docker desktop이 설치되어있을 수 있으므로 삭제(설치한 적이 없다면 생략해도 좋다)

초기 Repository 세팅

출처: https://docs.docker.com/desktop/install/ubuntu/

  1. apt-get 업데이트 및 HTTP 패키지 설치
  2. GPG 키 및 저장소 추가
  3. 커맨드를 통해 repository set up

도커 엔진 설치

출처: https://docs.docker.com/desktop/install/ubuntu/

  1. apt 패키지 업데이트를 한다. (위의 도커 세팅을 진행했으면 다시 update를 진행해야 설치가 제대로 됨)
  2. Latest 버전의 docker 엔진을 설치 혹은 특정 버전을 설치할 수 있음 ( 공식 문서 참고 )
sudo docker login

   3. docker hub 계정으로 로그인

sudo docker run --rm hello-world

   4. hello-world라는 도커 이미지를 시험 실행, --rm 옵션을 줘서 이미지가 실행되고 바로 삭제될 수 있도록 하여 테스트

docker version    // docker 설치 및 버전 확인
dpcker compose version    // docker compose 설치 및 버전 확인

여기까지 진행하면 서버에 Docker 엔진을 설치 완료하였다. 이제 GitLab 도커 이미지를 pull 하여 실행한다면 사내 서버에서만 접속 가능한 private 한 프로젝트 관리가 가능해질 것..


Docker 컨테이너로 GitLab 설치하기

사전 설정

GitLab은 기본적으로 80, 443, 22 포트를 사용하는데, 사용하는 서버에서 프로젝트를 직접 띄워 유틸리티 서버를 제공할 수도 있고, Jenkins 빌드 서버로도 사용할 수 있기 때문에 포트를 변경해서 사용한다. 하지만, 사용자의 편의를 위해 Nginx Reverse proxy를 통해 분산처리 하도록 할 계획

Nginx 설치

sudo apt-get install nginx
sudo vi /etc/nginx/sites-enabled/gitlab.conf // 아래의 형식으로 자신의 환경에 맞게 수정
server {
	    listen 80;
	    server_name gitlab.example.com;  # 원하는 도메인 설정 우리는 ip로 접근하게 됨
	 
	    return 301 https://$host$request_uri;
	}
	  
	server {
	    listen 443 ssl http2;
	    server_name gitlab.example.com;
	 
	    root html;
	 
	    server_tokens off;
	    fastcgi_hide_header X-Powered-By;
	 
	    charset utf-8;
	    location = /favicon.ico { access_log off; log_not_found off; }
	    location = /robots.txt  { access_log off; log_not_found off; }
	    ##access_log off;
	    access_log /var/log/nginx/gitab-access.log combined;
	    error_log  /var/log/nginx/gitlab-error.log error;
	    sendfile off;
	    client_max_body_size 100m;
	 
	    # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
	    proxy_http_version 1.1;
	 
	    # Remove the Connection header if the client sends it,
	    # it could be close to close a keepalive connection
	    proxy_set_header Connection "";
	 
	    location / {       
	        proxy_pass   http://127.0.0.1:9080;
	 
	        proxy_set_header        Host                    $host;
	        proxy_set_header        X-Real-IP               $remote_addr;
	        proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;
	        proxy_set_header        X-Forwarded-Proto       $scheme;
	 
	        ## prevent 504 timeout. default 60s;
	        proxy_connect_timeout       90;
	        proxy_send_timeout          90;
	        proxy_read_timeout          90;
	        send_timeout                90;
	 
	    }
	    location ~ /\.git {
	        deny all;
	    }
	 
	    ### Dropping SSLv3, ref: POODLE
	    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
	 
	    ### HSTS(HTTP Strict Transport Security)
	    # add_header Strict-Transport-Security "max-age=86400; includeSubdomains; preload";
	 
	    ssl_certificate     /etc/pki/tls/certs/example.com.crt;
	    ssl_certificate_key /etc/pki/tls/private/example.com.key;
	 
	}

설정 후 nginx 재실행

sudo systemctl enable nginx
sudo systemctl restart nginx

도커 GitLab 이미지 설치 하기

사전 작업

 

GitLab 컨테이너를 띄울 경우 컨테이너를 종료하고 재실행 혹은 삭제를 하게 되면 계정, 저장소 등이 모두 날라간다.

따라서 이에 대한 백업 파일들을 지정하고 volume 옵션을 통해 데이터를 백업하고 재실행 시 mount 할 수 있도록 해야 한다.

sudo mkdir -p /var/gitlab/{data,logs,config}
// gitlab 루트 디렉토리 설정
export GITLAB_HOME=/var/gitlab

gitlab docker 이미지를 불러와 실행

sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 80:80 --publish 10022:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  gitlab/gitlab-ee:latest

설정한 hostname으로 접속을 시도하면 깃랩 로그인 화면이 나타난다.

깃랩 로그인 화면

하지만 우린 계정이 없고, 컨테이너를 띄울 때 ssh 포트 변경에 대한 처리를 docker gitlab 컨테이너에 접속해서 처리를 해줘야 하며, 계정에 관한 설정도 컨테이너에 접속해서 할 수 있다.

 


GitLab 컨테이너에 접속하여 계정 및 포트 설정

root 계정에 대한 초기 비밀번호는  cat /etc/gitlab/initial_root_password 명령어 볼 수 있으며 접속 가능하다. 하지만 24시간이 지나면 이 파일이 삭제된다고 하니 새로 비밀번호를 설정하는 것이 좋을 것 같다.

 

1. 도커 컨테이너에 접속

sudo docker exec -it <docker container id> /bin/bash

2. /etc/gitlab/gitlab.rb에서 ssh 포트를 변경한 값으로 변경

sudo vi /etc/gitlab/gitlab.rb       // gitlab_rails['gitlab_shell_ssh_port'] = 10022
gitlab-ctl reconfigure // gitlab 재실행

3. root 계정 비밀번호 변경을 위해 명령어 입력

gitlab-rails console -e production

4. 아래와 같은 console로 접속이 됐다면 Root user를 불러와 비밀번호를 설정한다.

user = User.where(id: 1).first

user.password='변경할비밀번호'

user.password_confirmation='변경할비밀번호'

user.save

5. Gitlab에 돌아와 회원가입 신청 (내 계정)

6. GitLab에 root 계정으로 접속

회원가입 요청이 들어온 회원 계정을 수락

 


정리

  • 도커를 설치하기 전에 사전 세팅이 필요
  • 도커 컨테이너에 대한 포트 변경이 가능하기 때문에 Nginx reverse proxy를 통해 다중 컨테이너를 관리하기 좋을 것 같다.
  • GitLab을 도커 컨테이너로 띄울 시 volume을 지정하여 데이터를 백업 및 복구가 가능하다

추가

도커 이미지를 하나씩 실행하고 껐다 켰다 하게 되면 여러모로 불편하다, 이미지를 껏다 켜야 하며 컨테이너를 여러 개 띄우게 된다면? 포트 변경 및 여러 설정들을 다 저장해 두고 사용해야 할 것이다.

 

이렇게 다중 컨테이너를 관리하기 위해서 Docker Compose라는 기술이 있는데 yml 파일을 통해 컨테이너 설정을 하고 한 번에 여러 컨테이너를 띄울 수 있다.

 

이 글에 이어서 Docker Compose로 GitLab을 띄우는 과정을 작성할 것이며 실제로 컨테이너를 다시 실행했을 때 데이터가 잘 Mount 되는지 확인해 보도록 할 예정이다.

 

 

 

오랜만에 Docker를 사용하면서 정말 강력한 기술임을 깨달았다.. 몇 년 전에 대충 배웠을 땐 이게 좋은 건진 알겠는데 손은 안 갔었다..ㅋㅋ 앞으로 Dokcer를 이용할 일이 많을 것 같다. 어떤 것을 관리하든 도커로 관리하면 정말 편할 것 같다.

반응형