티스토리 뷰
GitLab 컨테이너 실행
GitLab은 서버에 설치해서 사용할 수 있는 git 클라이언트 어플리케이션입니다.
상용버전인 gitlab-EE (Enterprise Edition) 와 무료버전인 gitlab-CE (Community Edition)을 제공하고 있습니다.
gitlab CE를 도커로 설치하는 법에 대해서 정리해 보겠습니다.
GitLab에서는 공식적으로 도커이미지를 제공하고 있기때문에 바로 pull 해서 사용가능합니다.
- Docker Hub 주소 : https://hub.docker.com/r/gitlab/gitlab-ce/
- GitLab Docker 메뉴얼 : https://docs.gitlab.com/omnibus/docker/
원활한 진행을 위해 atom 편집기를 설치하고 실행 권한을 변경합니다.
#atom 실행 권한 변경
sudo chown -R hyper:hyper /home/hyper/.atom
서버용으로 설치
docker-compose 파일 작성
서버에 띄워서 사용하기 위해서는 GitLab에 사용할 url 값을 전달해주어야 합니다.
이를 쉽게 하기 위해서 docker-compose를 사용합니다.
우선, yaml 포맷의 docker-compose 파일을 만듭니다.
# docker-compose.gitlab 파일 작성
atom /opt/gopath/src/gitlab/docker-compose.gitlab.yml
그리고 다음 내용을 입력합니다.
gitlab:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: '<자신의 IP 주소>'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://<자신의 IP 주소>'
ports:
- '9090:80'
- '443:443'
- '22:22'
volumes:
- '/srv/gitlab/config:/etc/gitlab'
- '/srv/gitlab/logs:/var/log/gitlab'
- '/srv/gitlab/data:/var/opt/gitlab'
environment 부분이 바로 GitLab image가 빌드될때 사용될 external_url 값을 지정해 주게 됩니다.
그리고 container의 80포트를 host의 9090과 연동시켰습니다.
Jenkins에서 8080 포트를 쓸 예정이기 때문에 GitLab은 9090 포트로 지정해 주었습니다.
hostname과 external_url에는 자신의 IP 주소를 작성합니다. (주소를 사용하려면 도메인 값이 필요)
이제 docker-compose로 image를 띄워보겠습니다.
#docker-compose로 컨테이너 실행
docker-compose -f /opt/gopath/src/gitlab/docker-compose.gitlab.yml up
proxy 세팅
이제 proxy 세팅을 진행할 차례입니다.
nginx를 사용해 proxy 세팅을 할 것이므로 우선 nginx를 설치합니다.
#nginx 설치(proxy 설정을 위해서..)
sudo apt-get install nginx-full
그런 다음 nginx의 conf.d폴더에 gitlab.conf 파일을 하나 만들고 서버를 추가하도록 하겠습니다.
conf.d폴더의 위치는 /etc/nginx/conf.d 입니다.
conf.d폴더에 gitlab.conf 라는 파일을 생성한 뒤 아래의 설정을 입력합니다.
#proxy 세팅
sudo atom /etc/nginx/conf.d/gitlab.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name <자신의 IP 주소>;
# Load configuration files for the default server block.
location / {
proxy_pass http://localhost:9090;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server_name에는 자신의 IP 주소를 입력하고, proxy_pass에는 9090 포트를 설정합니다. (Docker 컨테이너를 호스트의 9090 포트에 매핑시켰기 때문)
이 설정은 <자신의 IP 주소>로 들어오는 요청을 localhost:9090
으로 보내는 설정입니다.
이제 nginx를 재시작하면 <자신의 IP 주소>로 GitLab이 설치된 것을 보실 수 있습니다.
#nginx 재시작
systemctl restart nginx
-----------------------------------------------------------------------------------------------에러 수정--------------------------------------------------------------------------------------------------------
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
만약 nginx 구동에 오류가 발생할 경우에는 다음과 같이 처리합니다. (포트 문제 발생)
sudo atom /etc/nginx/sites-enabled/default
default 파일의 17, 18번째 줄을 주석 처리합니다.
#listen 80 default_server;
#listen [::]:80 default_server;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
admin 계정의 Username은 root
입니다. 비밀번호는 사이트 초기 진입 시에 생성한 비밀번호입니다. (8자리 이상)
Jenkins 컨테이너 실행
docker run jenkins
현재 젠킨스는 도커 허브에서 공식적으로 도커 이미지를 지원하고 있습니다. (https://hub.docker.com/_/jenkins/ -> 2020.06.23 현재 deprecated 됨. https://hub.docker.com/r/jenkins/jenkins로 수정.)
그래서 간단히 pull 하는 것으로 이미지를 가져올 수 있습니다.
다음과 같은 명령어로 간단하게 8080 포트로 젠킨스를 구동 시킬 수 있습니다.
※ 이미지명이 jenkins에서 jenkins/jenkins로 수정됨!!!
#jenkins 컨테이너 실행
docker run -v /var/run/docker.sock:/var/run/docker.sock -v /srv/jenkins/home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --name=jenkins jenkins/jenkins
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[Error 1] 권한 설정 문제
touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
위와 같은 에러가 발생할 경우 /srv/jenkins/home의 퍼미션을 jenkins 유저가 접근할 수 있도록 권한 설정을 잡아줘야 합니다.
#실행 권한 변경
sudo chown -R 1000:1000 /srv/jenkins/home/
[Error 2] 이미 사용되고 있다는 에러
docker: Error response from daemon: Conflict. The container name "/jenkins" is already in use by container "e72b755ef4d6dfe0312d57e6f9fc363e4688f9327b6207d80ac6ae2fc50a7e07". You have to remove (or rename) that container to be able to reuse that name.
docker ps -a
stop, rm하고 다시 컨테이너를 실행해주면 된다.
docker stop jenkins
docker rm jenkins
docker run -v /var/run/docker.sock:/var/run/docker.sock -v /srv/jenkins/home:/var/jenkins_home -p 8080:8080 -p 50000:50000 --name=jenkins jenkins/jenkins
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Jenkins 초기 설정
처음 젠킨스를 구동시킨 뒤 터미널을 보시면 아래와 같은 로그를 볼 수 있습니다.
이는 처음 젠킨스를 구동시킬때 필요한 암호 입니다. 드레그 엔 카피 해 놓겠습니다.
이제 localhost:8080 (또는 젠킨스를 구동시킨 도메인과 포트)로 접속하게 되면 방금 카피한 암호를 복붙하라는 화면이 나옵니다.
입력창에 암호를 붙여넣기 합니다.
다음에 보시게 될 화면은 플러그인 설치 관련 페이지 입니다.
왼쪽은 권장하는 모든 플러그인을 설치하는 옵션이고 오른쪽은 선택설치 옵션입니다.
권장 플러그인을 모두 설치하도록 하겠습니다.
이와 같이 모든 플러그인들이 하나씩 설치되는 것을 볼 수 있습니다.
설치가 완료되면 유저 ID와 패스워드 설정페이지로 넘어갑니다.
- Username : admin
- Password : adminpw
- Full name : admin
- E-mail address : mylim109@nongshim.co.kr
위와 같이 입력한 뒤 Save and Finnish
버튼을 클릭해 다음 페이지로 넘어가겠습니다.
초기 설정이 완료되었습니다!
Jenkins 추가 설정
Host의 docker 소켓을 Jenkins 컨테이너와 연동
우선, 구동 중인 jenkins 컨테이너를 중지시키고 host의 Docker 소켓과 연동하도록 하겠습니다.
#기존에 구동중인 Jenkins 컨테이너 중지 및 삭제
docker stop jenkins
docker rm jenkins
#host의 docker.sock과 container의 연동
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /srv/jenkins/home:/var/jenkins_home \
-p 8080:8080 \
-p 50000:50000 \
--name=jenkins \
jenkins/jenkins
Jenkins 컨테이너에 docker binary 설치
실행 중인 jenkins 컨테이너에 root 유저로 접속합니다.
#jenkins 컨테이너에 접속
docker exec -it -u 0 jenkins bash
접속이 완료되면 아래와 같이 root 유저와 컨테이너 id를 확인할 수 있습니다.
이제 docker binary를 다운받도록 하겠습니다.
현재 최신 버전인 17.05.0-ce 를 다운받도록 하겠습니다.
#jenkins 컨테이너에 docker binary 설치
wget https://get.docker.com/builds/Linux/x86_64/docker-17.05.0-ce.tgz
#tar로 압축 해제
tar xvfz docker-17.05.0-ce.tgz
#docker 폴더 안에 docker binary 파일을 /usr/bin/에 복사
cp ./docker/docker /usr/bin/
#컨테이너 접속 종료
exit
퍼미션 설정
도커 컨테이너 내부에서 Jenkins는 jenkins 유저로 실행됩니다. 이제 jenkins 유저가 docker.sock에 접근할 수 있도록 퍼미션을 잡아줘야 합니다.
먼저 docker.sock파일은 host 에서 root유저와 docker 그룹으로 owner가 설정되어 있습니다. jenkins가 docker.sock파일에 접근하기 위해서는 docker group에 포함시켜 줘야 합니다.
우선 호스트에서 docker group의 gid를 확인해보겠습니다.
#docker group의 퍼미션 설정값 확인
cat /etc/group | grep docker
이제 다시 docker exec 커멘드를 통해 컨테이너로 접속하겠습니다.
#jenkins 컨테이너에 접속
docker exec -it -u 0 jenkins bash
#docker 그룹을 생성하고 gid를 999로 설정
groupadd -g 999 docker
#그룹이 잘 생성되었는지 확인
cat /etc/group | grep docker
#jenkins 유저를 docker group에 추가
#usermod -aG docker jenkins
#hyper 유저 추가
adduser hyper
#hyper 유저를 docker group에 추가
usermod -aG docker hyper
#컨테이너 접속 종료
exit
이제 Jenkins가 docker 커멘드를 사용할 수 있는 준비가 다 되었습니다.
GitLab과 Jenkins 연동을 위해 jenkins를 다시 시작합니다.
docker restart jenkins
GitLab과 Jenkins 연동
GitLab 설정
GitLab에 jenkins 계정 생성
먼저 jenkins가 gitlab의 프로젝트에 접근하기 위해 사용할 gitlab 유저를 만들도록 하겠습니다. 유저아이디는 편하게 jenkins로 만들어 줍니다.
방법은 두가지가 있는데 admin 유저가 admin-area에서 새로운 유저를 생성하는 방법과 로그아웃을 한 뒤 새로 등록하는 방법이 있습니다.
여기에서는 첫 번째 방법을 사용해 jenkins 계정을 생성해 보도록 하겠습니다.
GitLab에 root계정으로 로그인 한 뒤, Admin area
메뉴에 접속합니다.
New User
버튼을 누르고 이름, UserName, Email을 등록합니다.
하단의 Create User
버튼을 클릭하면 유저가 생성된 것을 확인할 수 있습니다.
우리는 SMTP 설정을 하지 않았기 때문에 비밀번호를 설정하기 위해 해당 유저의 Edit
페이지에 접속합니다.
이제 Password를 설정해줍니다. 간단하게 jenkinspass로 설정합니다.
설정이 완료되면 이제 jenkin 유저로 로그인합니다.
SSH Key 등록
먼저 아까 터미널의 jenkins container로 돌아가 보겠습니다.
아까는 root 유저로 접속을 했었는데 나와서 이젠 jenkins 유저로 접속하도록 하겠습니다.
# jenkins 유저로 jenkins 컨테이너 접속
docker exec -it -u jenkins jenkins bash
#ssh key 생성
ssh-keygen
#key 내용 출력 및 복사
cat ~/.ssh/id_rsa.pub
생성된 텍스트를 복사합니다.
이제 다시 GitLab으로 돌아갑니다.
jenkins 계정으로 로그인 한 후, 우측 상단 아이콘을 클릭하고 Setting
으로 들어갑니다.
Key 라고 적힌 텍스트 박스에 아까 복사한 값을 붙혀넣기 한뒤 Add Key
버튼을 누릅니다.
Jenkins 유저가 생성되었습니다!
이제 로그아웃한 뒤 다시 root 유저로 gitlab에 접속하세요!
참고 사이트
'개발도구 > DevOps' 카테고리의 다른 글
[DevOps] Jenkins를 이용한 자동 빌드 및 배포(2): Gradle 기반 Application 실행 (1) | 2018.07.13 |
---|
- Total
- Today
- Yesterday
- 코딩테스트
- 빅데이터
- codility
- Hyperledger Fabric
- 빅데이터 교육
- 하이퍼레저 인디
- 코딜리티
- docker
- 문제풀이
- Hyperledger Fabric v1.1
- 하이퍼레저 패브릭
- Private Data
- 코테
- 빅데이터 강의
- Blockchain
- Hyperledger Fabric v1.2
- 어서와 데이터는 처음이지
- 빅데이터 기초
- 암브로셔스
- 직딩잇템
- javascript
- Hyperledger Indy
- DOCs
- 블록 체인
- 알고리즘
- ambrosus
- 블록체인
- 기초 of 기초 데이터 개념
- ubuntu
- 하이퍼레저 페브릭
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |