본문 바로가기
서버, 인프라

[월 1만원으로 내 서비스 올리기] Docker + Jenkins, 서버에 직접 올려봤습니다 — Hetzner 실전 세팅 3편

by 요즘IT 2026. 5. 23.

Hetzner 서버에 Docker 설치하고 Jenkins 컨테이너로 띄우는 전 과정 실제 경험 기반으로 정리했어요. Ubuntu 26.04 기준, 삽질 포함.


이전 글:  [서버, 인프라] - Hetzner로 개인 서버 구성할 때 플랜 어떻게 골라야 해? 실제 삽질 기반 정리 2편


1편에서 Hetzner 서버 만들었고, 2편에서 플랜 골라서 Helsinki CX33으로 확정했잖아요.

이번엔 드디어 뭔가 올리는 단계예요.

Docker 설치하고, Jenkins를 컨테이너로 띄우는 것까지 해볼 거거든요.

근데 솔직히 말하면, 이게 생각보다 변수가 좀 있었어요. Ubuntu 26.04가 나온 지 얼마 안 됐다 보니까 Docker 레포 등록 방식도 조심해야 하고, Jenkins 타임존 설정도 예전 방식이 안 먹히더라고요. 그 부분까지 다 정리해놨으니까 그냥 따라오시면 돼요.


먼저, 왜 Docker로 올리냐면요

Jenkins를 서버에 직접 설치하는 방법도 있어요. apt로 설치하면 되거든요.

근데 저는 처음부터 Docker로 갔어요.

이유는 단순해요. 나중에 Nginx, Next.js, Spring Boot 다 Docker Compose로 묶을 건데, Jenkins만 직접 설치하면 관리 포인트가 두 갈래로 나뉘거든요. 그게 생각보다 귀찮아지더라고요.

한마디로 — 처음부터 Docker로 통일하면 나중에 편해요.


1단계 — Docker 설치 (Ubuntu 26.04 기준)

Ubuntu 26.04는 Resolute Raccoon이에요. 2026년 4월에 나온 따끈따끈한 LTS 버전이거든요.

근데 여기서 잠깐. Docker 공식 레포가 신버전에 바로 대응이 안 될 수 있어요. 그래서 순서대로 차근차근 해야 해요.

기존 충돌 패키지 제거

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
  sudo apt-get remove -y $pkg 2>/dev/null
done

처음 세팅하는 서버면 사실 없는 패키지들이라 에러 나도 그냥 넘어가면 돼요.

Docker 공식 GPG 키 + 레포 등록

sudo apt-get update
sudo apt-get install -y ca-certificates curl

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

Docker 설치

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

설치 확인

sudo docker run hello-world

Hello from Docker! 뜨면 완료예요.

sudo 없이 docker 쓰기 (선택)

sudo usermod -aG docker $USER
newgrp docker

이거 안 하면 매번 sudo docker ... 쳐야 하는데, 은근히 귀찮거든요.

docker run hello-world 실행 후
docker run hello-world 실행 후


2단계 — Jenkins 컨테이너 띄우기

여기서 포인트가 있어요.

Jenkins 기본 포트가 8080이거든요. 근데 나중에 Spring Boot도 올릴 거고, 포트 충돌 가능성이 있어서 저는 8090으로 바꿨어요.

-p 8090:8080 이 부분이 핵심이에요. 앞이 서버 외부 포트, 뒤가 컨테이너 내부 포트거든요.

Jenkins 데이터 디렉토리 생성

sudo mkdir -p /opt/jenkins_home
sudo chown -R 1000:1000 /opt/jenkins_home

이거 안 하면 권한 오류가 꽤 자주 나요. Jenkins 컨테이너 내부 UID가 1000이라서 맞춰주는 거거든요.

Jenkins 컨테이너 실행

docker run -d \
  --name jenkins \
  --restart unless-stopped \
  -p 8090:8080 \
  -p 50000:50000 \
  -v /opt/jenkins_home:/var/jenkins_home \
  -e JAVA_TOOL_OPTIONS="-Duser.timezone=Asia/Seoul" \
  jenkins/jenkins:lts

-v /opt/jenkins_home:/var/jenkins_home 이게 볼륨 마운트예요. 컨테이너가 날아가도 Jenkins 설정이랑 파이프라인 데이터가 서버에 남아요.

JAVA_TOOL_OPTIONS 환경변수는 타임존 설정인데, 이게 없으면 빌드 로그 시간이 UTC로 찍혀서 한국 시간이랑 9시간 차이 나거든요. 처음부터 넣어두는 게 편해요.

어? 근데 JAVA_OPTS로 넣으면 안 되나요? 저도 처음엔 JAVA_OPTS로 넣었는데 최신 Jenkins LTS에서 안 먹히더라고요. JAVA_TOOL_OPTIONS로 바꾸니까 바로 됐어요.

실행 확인

docker ps

jenkins 컨테이너 Up 상태면 정상이에요.


3단계 — Hetzner 방화벽 포트 열기

서버는 올라갔는데 접속이 안 되는 경우가 있어요.

Hetzner 방화벽에서 포트를 열어줘야 하거든요.

Hetzner 콘솔 → Firewalls → 해당 방화벽 → Rules → Add Rule

Hetzner Firewall Rule
Hetzner Firewall Rule

  • Direction: Inbound
  • Protocol: TCP
  • Port: 8090
  • Source IP: 0.0.0.0/0

저장하면 바로 적용돼요.


4단계 — Jenkins 초기 설정

브라우저에서 http://서버IP:8090 접속하면 Unlock Jenkins 화면이 나와요.

초기 비밀번호는 이 명령어로 확인해요.

docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

이 값 붙여넣고 Continue 누르면 플러그인 설치 화면 나오는데, Install suggested plugins 선택하면 돼요. 2~3분 기다리면 알아서 다 설치해줘요.

플러그인 설치 끝나면 관리자 계정 만들고, Jenkins URL 설정 화면에서 Save and Finish 누르면 대시보드 진입이에요.

jenkins 신규 설치
jenkins 신규 설치


5단계 — 추가 플러그인 설치

기본 플러그인만으로는 GitHub 연동이랑 Docker 빌드가 안 돼요.

Dashboard → Manage Jenkins → Plugins → Available plugins

여기서 아래 세 개 검색해서 체크하고 한 번에 Install 누르면 돼요.

  • GitHub Integration Plugin — Webhook 자동 트리거
  • Docker Pipeline — 파이프라인에서 Docker 빌드
  • SSH Agent Plugin — 서버 배포 시 SSH 연결

설치 후 Restart Jenkins when installation is complete 체크하고 기다리면 자동으로 재시작돼요.


6단계 — GitHub Credentials 등록

재시작 후 로그인하고, GitHub Personal Access Token 등록해야 해요.

Dashboard → Manage Jenkins → Credentials → System → Global credentials → Add Credentials

  • Kind: Username with password
  • Username: GitHub 아이디
  • Password: Personal Access Token
  • ID: github-credentials

GitHub Personal Access Token은 GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic) 에서 만들 수 있어요. 권한은 repo 전체랑 workflow 체크하면 충분해요.

토큰은 만들 때 딱 한 번만 보여주거든요. 복사해서 꼭 저장해두세요.


여기까지 하면 Jenkins 기본 세팅 완료예요

정리하면 이렇게 됐어요.

[Hetzner CX33 - Helsinki]
├── Jenkins 컨테이너    → 8090포트
└── Docker 설치 완료

다음 단계 예정
├── Nginx 컨테이너     → 80포트
├── Next.js 컨테이너   → 10000포트
└── Spring Boot 컨테이너 → 10081포트

결국 핵심은 Jenkins를 직접 설치하지 말고 컨테이너로 올리라는 거예요. 나중에 전체를 Docker Compose로 관리할 때 훨씬 깔끔하거든요.

다음 편에서는 GitHub 연동이랑 실제 CI/CD 파이프라인 구성까지 해볼게요. Jenkinsfile 작성하는 것도 같이 다룰 예정이에요.

 

다음 글: [서버, 인프라] - Next.js + Spring Boot, Hetzner 서버에 직접 올려봤습니다 — Docker Compose + Nginx 세팅 4편