Docker 컨테이너에 GitLab 설치하기

Tier: Free, Premium, Ultimate Offering: Self-Managed

Docker 컨테이너에 GitLab을 설치하려면 Docker Compose, Docker Engine 또는 Docker Swarm 모드를 사용하십시오.

전제 조건:

  • 도커 설치가 있어야 합니다(Docker installation 참조) Docker for Windows가 아닌 동작하는 도커 설치가 있어야 합니다. Docker for Windows는 이미지가 볼륨 권한과 잠재적으로 다른 알려진 문제와 호환성 문제가 있습니다. Docker for Windows에서 실행하려는 경우 getting help page를 참조하십시오. 이 페이지에는 커뮤니티 리소스(예: IRC 또는 포럼)로 이동하여 다른 사용자로부터 도움을 받을 수 있는 링크가 있습니다.
  • Postfix 또는 Sendmail과 같은 메일 전송 에이전트(MTA)가 있어야 합니다. GitLab 이미지에는 MTA가 포함되어 있지 않습니다. 별도의 컨테이너에 MTA를 설치할 수 있습니다. GitLab과 동일한 컨테이너에 MTA를 설치할 수는 있지만, 업그레이드나 재시작 후에 MTA를 다시 설치해야 할 수 있습니다.
  • GitLab 도커 이미지를 Kubernetes에 배포할 계획이 없어야 합니다. GitLab을 Kubernetes에 배포하려면 GitLab Helm Chart 또는 GitLab Operator를 사용하십시오.
  • 도커 설치에 대해 유효한 외부 접근 가능한 호스트 이름이 있어야 합니다. localhost를 사용하지 마십시오.

SSH 포트 구성

기본적으로 GitLab은 Git과 SSH를 사용하는 데 포트 22를 사용합니다. 포트 22를 사용하려면이 섹션을 건너 뜁니다.

다른 포트를 사용하려면 다음을 수행할 수 있습니다.

  • 서버의 SSH 포트를 변경합니다(권장). 그러면 SSH 클론 URL에 새 포트 번호가 필요하지 않습니다:

    ssh://git@gitlab.example.com/user/project.git
    
  • 설치 후 GitLab Shell SSH 포트 변경을 수행할 수 있습니다. 그러면 SSH 클론 URL에 구성된 포트 번호가 포함됩니다:

    ssh://git@gitlab.example.com:<portNumber>/user/project.git
    

서버의 SSH 포트를 변경하려면:

  1. 편집기로 /etc/ssh/sshd_config를 열고 SSH 포트를 변경합니다:

    Port = 2424
    
  2. 파일을 저장하고 SSH 서비스를 다시 시작합니다:

    sudo systemctl restart ssh
    
  3. SSH로 연결할 수 있는지 확인합니다. 새 터미널 세션을 열고 새 포트를 사용하여 서버에 SSH로 연결합니다.

볼륨용 디렉터리 만들기

구성 파일, 로그 및 데이터 파일을 저장할 디렉터리를 만듭니다. 디렉터리는 사용자의 홈 디렉터리(예: ~/gitlab-docker) 또는 /srv/gitlab과 같이 사용할 수 있습니다.

  1. 디렉터리를 만듭니다:

    sudo mkdir -p /srv/gitlab
    
  2. root가 아닌 사용자로 Docker를 실행하는 경우, 새 디렉터리에 대한 사용 권한을 해당 사용자에게 부여합니다.

  3. 새 환경 변수 $GITLAB_HOME를 구성하여 만든 디렉터리의 경로를 설정합니다:

    export GITLAB_HOME=/srv/gitlab
    
  4. 원하는 경우 GITLAB_HOME 환경 변수를 쉘의 프로필에 추가하여 모든 후속 터미널 세션에 적용할 수 있습니다:

    • Bash: ~/.bash_profile
    • ZSH: ~/.zshrc

GitLab 컨테이너는 영구 데이터를 저장하기 위해 호스트 마운트된 볼륨을 사용합니다:

로컬 위치 컨테이너 위치 사용법
$GITLAB_HOME/data /var/opt/gitlab 어플리케이션 데이터 저장.
$GITLAB_HOME/logs /var/log/gitlab 로그 저장.
$GITLAB_HOME/config /etc/gitlab GitLab 구성 파일 저장.

사용할 GitLab 버전 및 에디션 찾기

운영 환경에서는 배포를 특정 GitLab 버전으로 고정해야 합니다. 사용 가능한 버전을 검토하고 도커 태그 페이지에서 사용할 버전을 선택하십시오:

태그 이름은 다음과 같은 내용을 포함합니다:

gitlab/gitlab-ee:<version>-ee.0

여기서 <version>은 GitLab 버전입니다. 예를 들어 16.5.3와 같습니다. 버전 이름은 항상 <major>.<minor>.<patch>를 포함합니다.

테스트 목적으로 latest 태그를 사용할 수도 있습니다. 예를 들어 gitlab/gitlab-ee:latest는 최신 안정 버전을 가리킵니다.

다음 예는 안정적인 Enterprise Edition 버전을 사용합니다. 릴리스 캔디데이트(RC) 또는 nightly 이미지를 사용하려면 gitlab/gitlab-ee:rc 또는 gitlab/gitlab-ee:nightly를 대신 사용하십시오.

Community Edition을 설치하려면 eece로 바꿉니다.

설치

Docker Compose를 사용하여 GitLab 설치하기는 다음과 같이 실행할 수 있습니다:

Docker Compose를 사용하여 GitLab 설치

Docker Compose를 사용하면 Docker 기반의 GitLab 설치를 구성하고 업그레이드할 수 있습니다:

  1. Docker Compose 설치를 수행합니다.
  2. docker-compose.yml 파일을 만듭니다. 예:

    version: '3.6'
    services:
      gitlab:
        image: gitlab/gitlab-ee:<version>-ee.0
        container_name: gitlab
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            # 여기에 다른 gitlab.rb 구성을 추가하세요. 각각을 개별 라인에 추가합니다.
            external_url 'https://gitlab.example.com'
        ports:
          - '80:80'
          - '443:443'
          - '22:22'
        volumes:
          - '$GITLAB_HOME/config:/etc/gitlab'
          - '$GITLAB_HOME/logs:/var/log/gitlab'
          - '$GITLAB_HOME/data:/var/opt/gitlab'
        shm_size: '256m'
    

    참고: GITLAB_OMNIBUS_CONFIG 변수가 작동하는 방법은 Pre-configure Docker container 섹션을 읽으십시오.

    여기 또 다른 docker-compose.yml 예가 있습니다. 여기서 GitLab이 사용자 지정 HTTP 및 SSH 포트에서 실행됩니다. GITLAB_OMNIBUS_CONFIG 변수가 ports 섹션과 일치함을 주목하세요:

    version: '3.6'
    services:
      gitlab:
        image: gitlab/gitlab-ee:<version>-ee.0
        container_name: gitlab
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            external_url 'http://gitlab.example.com:8929'
            gitlab_rails['gitlab_shell_ssh_port'] = 2424
        ports:
          - '8929:8929'
          - '443:443'
          - '2424:22'
        volumes:
          - '$GITLAB_HOME/config:/etc/gitlab'
          - '$GITLAB_HOME/logs:/var/log/gitlab'
          - '$GITLAB_HOME/data:/var/opt/gitlab'
        shm_size: '256m'
    

    이 구성은 --publish 8929:8929 --publish 2424:22를 사용하는 것과 같습니다.

  3. docker-compose.yml과 동일한 디렉터리에서 GitLab을 시작합니다:

    docker compose up -d
    

Docker Engine를 사용하여 GitLab 설치

대안으로 Docker 엔진을 사용하여 GitLab를 설치할 수 있습니다.

  1. GITLAB_HOME 변수를 설정한 경우, 디렉토리를 조정하여 요구 사항에 맞게 실행하여 이미지를 실행합니다:

    • SELinux를 사용하지 않는 경우, 다음 명령을 실행합니다:

      sudo docker run --detach \
        --hostname gitlab.example.com \
        --env GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.example.com'" \
        --publish 443:443 --publish 80:80 --publish 22: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 \
        --shm-size 256m \
        gitlab/gitlab-ee:<버전>-ee.0
      

      이 명령은 GitLab 컨테이너를 다운로드하고 시작하며 게재된 포트를 통해 SSH, HTTP 및 HTTPS에 액세스할 수 있습니다. 모든 GitLab 데이터는 $GITLAB_HOME의 하위 디렉토리에 저장됩니다. 컨테이너는 시스템 재부팅 후 자동으로 다시 시작됩니다.

    • SELinux를 사용하는 경우, 대신 다음을 실행합니다:

       sudo docker run --detach \
         --hostname gitlab.example.com \
         --env GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.example.com'" \
         --publish 443:443 --publish 80:80 --publish 22:22 \
         --name gitlab \
         --restart always \
         --volume $GITLAB_HOME/config:/etc/gitlab:Z \
         --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
         --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
         --shm-size 256m \
         gitlab/gitlab-ee:<버전>-ee.0
      

      이 명령은 도커 프로세스가 마운트된 볼륨에서 구성 파일을 만들 권한을 충분히 부여합니다.

  2. Kerberos 통합을 사용하는 경우, Kerberos 포트도 게재해야 합니다(예: --publish 8443:8443). 이를 하지 않으면 Kerberos와 관련된 Git 작업이 실패합니다. 초기화 프로세스는 오랜 시간이 걸릴 수 있습니다. 이 프로세스는 다음으로 추적할 수 있습니다:

    sudo docker logs -f gitlab
    

    컨테이너를 시작한 후에 gitlab.example.com을 방문할 수 있습니다. Docker 컨테이너가 쿼리에 응답하기까지 시간이 걸릴 수 있습니다.

  3. GitLab URL을 방문하고 다음 명령에서 root 사용자로 로그인합니다.

    sudo docker exec -it gitlab grep 'Password:' 
    /etc/gitlab/initial_root_password
    

참고: 비밀번호 파일은 24시간 후 첫 번째 컨테이너 재시작 시 자동으로 삭제됩니다.

Docker Swarm 모드를 사용하여 GitLab 설치

Docker Swarm 모드를 사용하면 Docker로 스웜 클러스터에 GitLab 설치를 구성하고 배포할 수 있습니다.

스웜 모드에서는 Docker SecretsDocker 구성을 활용하여 GitLab 인스턴스를 효율적이고 안전하게 배포할 수 있습니다. Secrets를 사용하여 초기 루트 암호를 환경 변수로 노출시키지 않고 안전하게 전달할 수 있습니다. 구성을 사용하면 GitLab 이미지를 가능한 일반적으로 유지할 수 있습니다.

다음은 Secrets와 구성을 사용하여 네 개의 러너를 포함하여 GitLab를 스택으로 배포하는 예입니다:

  1. Docker 스웜을 설정.
  2. docker-compose.yml 파일을 만듭니다.

    version: "3.6"
    services:
      gitlab:
        image: gitlab/gitlab-ee:<버전>-ee.0
        container_name: gitlab
        restart: always
        hostname: 'gitlab.example.com'
        ports:
          - "22:22"
          - "80:80"
          - "443:443"
        volumes:
          - $GITLAB_HOME/data:/var/opt/gitlab
          - $GITLAB_HOME/logs:/var/log/gitlab
          - $GITLAB_HOME/config:/etc/gitlab
        shm_size: '256m'
        environment:
          GITLAB_OMNIBUS_CONFIG: "from_file('/omnibus_config.rb')"
        configs:
          - source: gitlab
            target: /omnibus_config.rb
        secrets:
          - gitlab_root_password
      gitlab-runner:
        image: gitlab/gitlab-runner:alpine
        deploy:
          mode: replicated
          replicas: 4
    configs:
      gitlab:
        file: ./gitlab.rb
    secrets:
      gitlab_root_password:
        file: ./root_password.txt
    

    복잡성을 줄이기 위해 위의 예에서는 network 구성을 제외했습니다. 공식 Compose 파일 참조에서 더 많은 정보를 찾을 수 있습니다.

  3. gitlab.rb 파일을 만듭니다.

    external_url 'https://my.domain.com/'
    gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password').gsub("\n", "")
    
  4. 비밀번호를 포함한 root_password.txt 파일을 만듭니다.

    MySuperSecretAndSecurePassw0rd!
    
  5. docker-compose.yml 파일이 있는 동일한 디렉토리에 있는지 확인하고 다음을 실행합니다:

    docker stack deploy --compose-file docker-compose.yml mystack
    

Docker를 설치한 후, GitLab 인스턴스를 구성해야 합니다.