LLM

[Docker]Docker build/run/push/Kubernetes

낑낑이 2025. 8. 12. 20:49

1.Ubuntu에서 파일다운받기

curl -O https://storage.skala-ai.com/storage/edu/code/ywyi/250721/my-first-app.tar

 

tar파일을 다운받으면 빨간색 tar파일이 생성된다

 

2.압축해제

tar -xvf my-first-app.tar


1.

#default.conf

server {
    listen 80;
   
    # 정적 파일 서빙
    location /sk000 {
        alias /usr/share/nginx/html/;
        index main.html index.html;
        try_files $uri $uri/ /default.html;

        # 모든 파일(HTML, CSS, JS, 미디어)에 적용
        expires -1;
        add_header Cache-Control "no-store, no-cache, must-revalidate";
        add_header Pragma "no-cache";
       
    }
}

라인별 의미

  • listen 80;
    서버가 80 포트(HTTP) 로 요청을 받음.
  • location /sk000 { ... }
    URL이 /sk000로 시작하는 요청을 이 블록에서 처리.
    예) /sk000/app.js, /sk000/, /sk000/foo/bar
  • alias /usr/share/nginx/html/;
    alias는 location 접두어를 이 경로로 치환해서 파일을 찾음.
    즉 /sk000/app.js → /usr/share/nginx/html/app.js 를 읽음.
  • 팁: location이 /sk000라면 보통 /sk000/처럼 슬래시를 붙이는 게 안전해요(아래 참고).
  • index main.html index.html;
    디렉토리 요청일 때 기본 문서로 main.html → 없으면 index.html을 찾음.
    예) /sk000/ → /usr/share/nginx/html/main.html 없으면 index.html.
  • try_files $uri $uri/ /default.html;
    1. 요청한 정확한 파일 시도 ($uri)
    2. 디렉토리로도 시도 ($uri/) → 디렉토리면 위의 index 규칙 적용
    3. 둘 다 없으면 /default.html로 내부 리다이렉트 (SPA fallback 같은 용도)
    주의: /default.html은 서버 루트 기준 절대경로예요.
    만약 default.html이 alias 폴더에 있다면 **/sk000/default.html**로 쓰는 게 안전합니다.
  • expires -1;
    Expires 헤더를 과거 시점으로 설정해 캐시 사용 안 함 의미.
  • add_header Cache-Control "no-store, no-cache, must-revalidate";
    브라우저 캐시를 막기 위한 강한 지시. 개발 중 변경사항 즉시 반영할 때 유용.
  • add_header Pragma "no-cache";
    HTTP/1.0 호환용 추가 비캐시 지시.

라고 지피티가 이야기했는데 일단 중요한건, 내가 알고있는건

        index main.html index.html;

여기있는 index를 수정해야, docker가 어느 파일을 참조할지 알려주기때문에, 해당 줄을 수정해야한다

이처럼 파일을 수정해줘야한다


2.

#DockerFile

# nginx 기반 이미지 사용
FROM nginx:alpine

# 기본 nginx 설정 파일 제거

# 커스텀 nginx 설정 파일 복사
COPY default.conf /etc/nginx/conf.d/   #로컬에 있는 파일을 컨테이너에 복사하겠다는것. defalut.conf파일을 복사한다

# nginx 포트 노출
EXPOSE 80

# nginx 실행 (기본 CMD가 이미 설정되어 있음)
CMD ["nginx", "-g", "daemon off;"]

라인별 설명

  • FROM nginx:alpine
    가벼운 Alpine 리눅스 기반의 공식 Nginx 이미지를 사용합니다.
  • COPY default.conf /etc/nginx/conf.d/
    당신의 커스텀 서버 설정(default.conf)을 Nginx의 conf.d 폴더에 넣습니다.
    • 동일 파일명(default.conf)이면 기존 것을 덮어씌우는 효과가 나지만,
    • 다른 이름이라면 기존 /etc/nginx/conf.d/default.conf와 포트 충돌이 날 수 있어요(두 server가 listen 80).
  • EXPOSE 80
    컨테이너가 80 포트로 서비스한다는 “메타정보”(실제 포트 개방은 -p 옵션으로 매핑).
  • CMD ["nginx", "-g", "daemon off;"]
    포그라운드로 Nginx 실행.
    사실 공식 이미지 기본 CMD와 동일해서 이 줄은 생략해도 됩니다.

 

Docker Image를 Build하고 Run 시킬때, 어느 경로를 통해서 Build하고 Run시킬껀지 명시해야한다

어떤 파일을 사용할건지 default.conf 파일에서 명시하였으므로, (html 파일은 사진이 많아서 하나의 폴더로 묶었똥)

COPY html/ /sur/share/nginx/html 

              (내가 사용할 파일)          /        Docker에서 지정한 경로


3.

docker build -t my-nginx:1.0 .

# 1) 현재 폴더(.)를 빌드 컨텍스트로 해서 이미지 생성

 

-이걸 실행시키는 디렉토리 안에 Docker file이 존재해야한다

docker run --rm -p 8080:80 --name my-nginx my-nginx:1.0

--rm을 해주게 되면 docker run을 해주고, 실행을 취소하면 container에서도 삭제하겠다는 의미에 해당한다

이후 해당 주소로 들어가면

http://localhost:8080/sk106/

내 홈페이지가 로컬에서 동작하는 것을 확인할 수 있다.

주소를 저렇게 해주는 이유는 docker-build.sh에 이와같이 선언했기 때문이다


docker push 방법1

기본 공식: docker tage 원래파일이름   바꿀파일이름

 

Container를 보면 my-nginx가 실행되는 것을 볼 수 있고, 잘 동작하는 것을 확인했으니, 이후에 Docker push를 해줘야한다

Docker build만 하여서 image를 생성하고 run을 통해 내 로컬에서 동작하는 것을 확인하였으므로,

해당 이미지를 배포하기 위해서 docker push가 필요하다

docker-push.sh를 보게되면 이와같이 되어있따

docker tag를 통해 my-nginx파일 이름을 바꿔줘야한다


root@BOOK-8FCGNUSNRC:~/my-first-app# ./docker-push.sh
Login Succeeded
Error response from daemon: No such image: sk106-posts-get.amd64:1.0
The push refers to repository [amdp-registry.skala-ai.com/skala25a/sk106-posts-get.amd64]
An image does not exist locally with the tag: amdp-registry.skala-ai.com/skala25a/sk106-posts-get.amd64

 

이렇게 뜨는데 image이름을 sk106-posts-get.amd64:1.0 이라는 것을 기대하고 ./docker-push.sh를 사용하여 해당 image를 변경하는거네요

docker tag my-nginx:1.0 sk106-posts-get.amd64:1.0

root@BOOK-8FCGNUSNRC:~/my-first-app# docker tag my-nginx:1.0 sk106-posts-get.amd64:1.0

실행하게되면 my-nginx라는 폴더명이 바뀌며 복사되는것을 볼 수 있습니당

my-nginx                                                              1.0       e1687f881a82   4 hours ago    103MB
sk106-posts-get.amd64                                       1.0       e1687f881a82   4 hours ago    103MB

 

./docker-push.sh

root@BOOK-8FCGNUSNRC:~/my-first-app# ./docker-push.sh
Login Succeeded
The push refers to repository [amdp-registry.skala-ai.com/skala25a/sk106-posts-get.amd64]
91a4c2e47294: Layer already exists
8e063bc0707a: Layer already exists
57fb2e22a07a: Layer already exists
c38bee0b0d28: Layer already exists
26081059fc81: Layer already exists
daa8ffa7606a: Layer already exists
95a6190cfaec: Layer already exists
430a7aa99a19: Layer already exists
77a17eed5d29: Layer already exists
418dccb7d85a: Layer already exists
1.0: digest: sha256:641632dcb68f48744187a687648217cb78cb02204d2cc838e8a39f865ca4b230 size: 2408

 

저는 이전에 이미 push를 해놔서 이렇게 뜨는데 처음 실행시키면 막 화살표 뜨면서 다운됩니다 


docker push 방법2

이름바꿔주기

기본 공식: docker tage 원래파일이름   바꿀파일이름

docker tag my-nginx:1.0 sk106/my-nginx:1.0 

 

 

docker tag sk106/my-nginx:1.0 amdp-registry.skala-ai.com/skala25a/sk106-posts-get.amd64:1.0

이렇게하면 이제 kuber와 연결시킬 준비 끄읏


Deploy

deploy폴더로 이동하면 이와같이 파일들이 있당

1.deploy.yaml파일

Kubernetes Deployment 매니페스트이다
쉽게 말하면 “쿠버네티스가 어떤 컨테이너를 몇 개 띄우고, 어떻게 관리할지를 정의하는 설계도”입니다.

 

  • skala-practice 네임스페이스에 배포됨.
  • **sk106-posts-get**라는 앱을 Pod 1개로 실행함.
  • 컨테이너는 amdp-registry.skala-ai.com/skala25a/sk106-posts-get.amd64:1.0 이미지를 사용.
    • 이건 사설 레지스트리에 있는 이미지라, Pull 권한이 필요함.
  • 항상 최신 이미지를 다시 Pull하도록 (imagePullPolicy: Always) 설정됨.
  • Prometheus가 모니터링할 수 있도록 메타데이터(annotations) 를 달아둠.
    • scrape: true → 모니터링 대상
    • port: 8080 → 수집할 포트
    • path: /prometheus → 수집 경로
  • update: update1000 → 이 값만 바꿔도 Deployment 롤링 업데이트를 강제로 유도할 수 있음.
  • 쿠버네티스가 파드 상태를 감시해서 죽으면 다시 띄움.

 

1.

kubectl apply -f deploy.yaml

root@BOOK-8FCGNUSNRC:~/my-first-app/deploy# kubectl apply -f deploy.yaml
deployment.apps/sk106-posts-get created

2.

kubectl apply -f service.yaml

root@BOOK-8FCGNUSNRC:~/my-first-app/deploy# kubectl apply -f service.yaml
service/sk106-posts-get unchanged

 

솔지기 뭔파일인지 모르겠음

 

 

3.

kubectl get pods -n skala-practice

나는 106으로 만들어서 내꺼를 찾아서

4.

kubectl port-forward pod/sk106-posts-get-68ccf5b996-9zd2f 8080:80

 

이렇게하고 

https://frontend.skala25a.project.skala-ai.com/sk106/

 

나의 프로필

 

frontend.skala25a.project.skala-ai.com

다른 사람도 내 파일에 접속할수 있는 환경 구축 완룡~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

'LLM' 카테고리의 다른 글

[Kubernetes,K8s]쿠버네티스2  (3) 2025.08.14
[Kubernetes,K8s]쿠버네티스  (5) 2025.08.13
[7]JavaScript  (7) 2025.08.11
[6]CSS  (3) 2025.08.11
[5]HTML  (3) 2025.08.08