Ssoon
3주차 - Jenkins CI/ArgoCD + K8S : 실습환경 본문
CloudNet@ 가시다님이 진행하는 CI/CD 맛보기 스터디
✅ 실습환경
🧿 Jenkins, gogs 컨테이너 기동
- docker-compose.yaml
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins
restart: unless-stopped
networks:
- cicd-network
ports:
- "8080:8080"
- "50000:50000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- jenkins_home:/var/jenkins_home
gogs:
container_name: gogs
image: gogs/gogs
restart: unless-stopped
networks:
- cicd-network
ports:
- "10022:22"
- "3000:3000"
volumes:
- gogs-data:/data
volumes:
jenkins_home:
gogs-data:
networks:
cicd-network:
driver: bridge
- Docker Compose를 사용하여 두 개의 컨테이너(gogs, jenkins)를 실행한 결과를 확인합니다.
[ssoon@localhost cicd-labs]$ docker compose up -d
[+] Running 2/2
✔ Container gogs Started 0.8s
✔ Container jenkins Started
[ssoon@localhost cicd-labs]$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
gogs gogs/gogs "/app/gogs/docker/st…" gogs 13 days ago Up 28 seconds (health: starting) 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:10022->22/tcp, [::]:10022->22/tcp
jenkins jenkins/jenkins "/usr/bin/tini -- /u…" jenkins 13 days ago Up 28 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp
🧿 Jenkins 컨테이너 초기 설정
- Jenkins 초기 암호를 확인합니다.
[ssoon@localhost cicd-labs]$ docker compose exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
33557ec3fb1d4c0092faed46fa200cb8
- 계정 및 암호를 입력합니다.
- Jenkins URL를 설정합니다.
🧿 Jenkins 컨테이너에서 호스트에 도커 데몬 사용 설정 (Docker-out-of-Docker)
- Jenkins 컨테이너 내부에 도커 실행 파일 설치
- docker compose exec --privileged -u root jenkins bash:
- Jenkins 컨테이너 내부에서 명령어를 실행하기 위해 사용됩니다.
- --privileged: 컨테이너가 호스트와 유사한 권한을 가지도록 설정합니다. 이를 통해 Docker CLI 등을 설치할 수 있습니다.
- -u root: 컨테이너 내부에서 root 사용자로 실행합니다.
- jenkins: 명령을 실행할 컨테이너 이름입니다.
- bash: 컨테이너 내부에서 Bash 쉘을 실행합니다.
[ssoon@localhost cicd-labs]$ docker compose exec --privileged -u root jenkins bash
- Docker 패키지를 신뢰할 수 있는지 검증하기 위해 Docker 공식 GPG 키를 다운로드합니다.
- 파일은 /etc/apt/keyrings/docker.asc에 저장됩니다.
root@9afd0ab27f06:/# curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
- 키 파일의 읽기 권한을 모든 사용자에게 부여합니다.
root@9afd0ab27f06:/# chmod a+r /etc/apt/keyrings/docker.asc
- 새로운 APT 저장소를 추가합니다.
- dpkg --print-architecture: 현재 시스템의 CPU 아키텍처를 확인 (amd64, arm64, 등).
- $(. /etc/os-release && echo "$VERSION_CODENAME"): 현재 OS의 버전 코드네임(예: bullseye, buster)을 확인.
- 저장소 URL: Docker 공식 저장소(https://download.docker.com/linux/debian).
- 추가된 저장소 정보는 /etc/apt/sources.list.d/docker.list에 저장됩니다.
root@9afd0ab27f06:/# echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
- apt-get update: 패키지 목록을 최신 상태로 업데이트합니다.
- apt install: 필요한 패키지를 설치합니다.
- docker-ce-cli: Docker 명령줄 인터페이스 (컨테이너 제어용).
- curl: HTTP 요청을 전송하는 도구.
- tree: 디렉토리 구조를 트리 형식으로 출력.
- jq: JSON 데이터를 처리하는 CLI 도구.
- yq: YAML 데이터를 처리하는 CLI 도구.
root@9afd0ab27f06:/# apt-get update && apt install docker-ce-cli curl tree jq yq -y
- jenkins 사용자가 Docker 소켓에 접근할 수 있도록 설정합니다.
root@9afd0ab27f06:/# groupadd -g 2000 -f docker
root@9afd0ab27f06:/# chgrp docker /var/run/docker.sock
root@9afd0ab27f06:/# ls -l /var/run/docker.sock
srw-rw----. 1 root docker 0 Dec 16 2024 /var/run/docker.sock
root@9afd0ab27f06:/# usermod -aG docker jenkins
root@9afd0ab27f06:/# cat /etc/group | grep docker
docker:x:2000:jenkins
- 사용자를 Docker 그룹에 추가합니다.
[ssoon@localhost cicd-labs]$ sudo usermod -aG docker $USER
[ssoon@localhost cicd-labs]$ newgrp docker
🧿 Gogs 컨테이너 초기 설정 : Repo(Private) - dev-app , ops-deploy
- 데이터베이스 유형 : SQLite3
- 애플리케이션 URL : http://<자신의 PC IP>:3000/
- 기본 브랜치 : main
- 관리자 계정 설정 클릭 : 이름(devops), 비밀번호(qwe123), 이메일 입력
- Token을 생성합니다.
- 2eb64d2d3e338b6d326d3d094b9ea242ab83f744
- New Repository 1 : 개발팀용
- Repository Name : dev-app
- Visibility : (Check) This repository is Private
- .gitignore : Python
- Readme : Default → (Check) initialize this repository with selected files and template
- New Repository 2 : 데브옵스팀용
- Repository Name : ops-deploy
- Visibility : (Check) This repository is Private
- Readme : Default → (Check) initialize this repository with selected files and template
🧿 Gogs 실습을 위한 저장소 설정 : 호스트에서 직접 git 작업
- Git은 Gogs 서버에 접속하여 devops라는 조직/사용자가 관리하는 dev-app 리포지토리를 찾습니다.
- 리포지토리의 모든 내용을 사용자의 로컬 디렉토리에 복제합니다.
- 복제된 디렉토리는 **dev-app/**이라는 폴더로 생성됩니다.
[ssoon@localhost cicd-labs]$ git clone http://192.168.56.105:3000/devops/dev-app.git
'dev-app'에 복제합니다...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
오브젝트 묶음 푸는 중: 100% (4/4), 694 bytes | 694.00 KiB/s, 완료.
- user.name과 user.email: 커밋 기록에 표시될 사용자 정보 설정.
- init.defaultBranch: 새 리포지토리의 기본 브랜치 이름을 main으로 설정.
- credential.helper store: 인증 정보를 저장해 작업을 편리하게 만듦.
[ssoon@localhost dev-app]$ git config user.name "devops"
[ssoon@localhost dev-app]$ git config user.email "devops@example.com"
[ssoon@localhost dev-app]$ git config init.defaultBranch main
[ssoon@localhost dev-app]$ git config credential.helper store
- 현재 브랜치는 main입니다.
- 리포지토리는 Gogs 서버(192.168.56.105:3000)에 있는 dev-app 원격 저장소와 연결되어 있습니다.
[ssoon@localhost dev-app]$ git branch
* main
[ssoon@localhost dev-app]$ git remote -v
origin http://192.168.56.105:3000/devops/dev-app.git (fetch)
origin http://192.168.56.105:3000/devops/dev-app.git (push)
- server.py
- 클라이언트가 서버에 접속하면:
- 현재 시간(The time is...)과
- 서버 호스트 이름(Server hostname...)을 반환.
from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
from datetime import datetime
import socket
class RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
now = datetime.now()
hostname = socket.gethostname()
response_string = now.strftime("The time is %-I:%M:%S %p, VERSION 0.0.1\n")
response_string += f"Server hostname: {hostname}\n"
self.wfile.write(bytes(response_string, "utf-8"))
def startServer():
try:
server = ThreadingHTTPServer(('', 80), RequestHandler)
print("Listening on " + ":".join(map(str, server.server_address)))
server.serve_forever()
except KeyboardInterrupt:
server.shutdown()
if __name__ == "__main__":
startServer()
- Dockerfile
FROM python:3.12
ENV PYTHONUNBUFFERED 1
COPY . /app
WORKDIR /app
CMD python3 server.py
- VERSION
0.0.1
- 새 파일 3개(Dockerfile, VERSION, server.py)가 커밋 및 원격 저장소에 업로드합니다.
[ssoon@localhost dev-app]$ git status
현재 브랜치 main
브랜치가 'origin/main'에 맞게 업데이트된 상태입니다.
추적하지 않는 파일:
(커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
Dockerfile
VERSION
server.py
커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "git
add"를 사용하십시오)
[ssoon@localhost dev-app]$ git add .
[ssoon@localhost dev-app]$ git commit -m "Add dev-app"
[main d89b73e] Add dev-app
3 files changed, 32 insertions(+)
create mode 100644 Dockerfile
create mode 100644 VERSION
create mode 100644 server.py
[ssoon@localhost dev-app]$ git push -u origin main
오브젝트 나열하는 중: 6, 완료.
오브젝트 개수 세는 중: 100% (6/6), 완료.
Delta compression using up to 4 threads
오브젝트 압축하는 중: 100% (4/4), 완료.
오브젝트 쓰는 중: 100% (5/5), 905 bytes | 905.00 KiB/s, 완료.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To http://192.168.56.105:3000/devops/dev-app.git
d86af95..d89b73e main -> main
branch 'main' set up to track 'origin/main'.
- Gogs Repo 에서 확인합니다.
🧿 자신의 도커 허브 계정에 dev-app (Private) repo 생성, (옵션) Token 발급
'CICD 맛보기' 카테고리의 다른 글
3주차 - Jenkins CI/ArgoCD + K8S : Jenkins CI/CD + K8S(Kind) (0) | 2024.12.16 |
---|---|
3주차 - Jenkins CI/ArgoCD + K8S : Jenkins CI + K8S(Kind) (2) | 2024.12.16 |
2주 : GitHub Actions CI/CD : 2 (1) | 2024.12.12 |
2주 : GitHub Actions CI/CD : 1 (0) | 2024.12.11 |
1주 : Jenkins CI/CD + Docker : 4 (2) | 2024.12.05 |
Comments