728x90
반응형

무중단 배포란?

https://harmony-raccoon.tistory.com/157

 

[DevOps] 무중단 배포란?

무중단 배포란?무중단 배포(Zero-Downtime Deployment)는 서비스의 운영을 멈추지 않고도 새로운 기능을 배포하거나 기존 시스템을 업데이트 하는 방법을 의미합니다.무중단 배포의 핵심은 로드 밸런

harmony-raccoon.tistory.com

블루, 그린 배포란?

이전 버전과 새로운 버전의 서버를 공통 로드 밸런서 하에 동시에 운영하기 위해 두개의 독립적인 환경(블루 환경과 그린 환경)을 이용하는 전략입니다.

이 방식은 트래픽을 한번에 구버전에서 신버전으로 옮깁니다.

(현재 운영중인 버전을 Blue, 새롭게 배포할 환경을 Green이라고 가정합니다.)

Blue, Green Deployment

새로운 버젼인 Green 서버를 배포하고, 테스트까지 완료합니다.

만약, Green 서버가 문제가 없다면 로드 밸런서에서 Blue에 연결된 트래픽을 Green으로 한번에 변경합니다.

변경이 완료되면 Blue 서버를 모두 종료합니다.

Blue-Green 배포의 장점

  • 트래픽을 한번에 모두 새로운 버젼으로 옮기기 때문에 호환성 문제가 생기지 않습니다.
  • 서버 배포를 할 때 주로 사용됩니다.
  • 만약, 배포 중 문제가 발생 시 빠르게 롤백할 수 있습니다.

Blue-Green 배포의 단점

  • 실제 운용할 때 필요한 서버의 리소스의 2배가 필요합다.

참고 자료

https://www.samsungsds.com/kr/insights/1256264_4627.html

 

무중단 배포 아키텍처(Zero Downtime Deployment)- 글로벌 서비스 운영의 필수 요소 | 인사이트리포트 |

 

www.samsungsds.com

https://hstory0208.tistory.com/entry/%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC%EB%9E%80-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC-%EC%A0%84%EB%9E%B5%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

무중단 배포란? 무중단 배포 전략에 대해 알아보자.

무중단 배포란? 무중단 배포를 사용하지 않을 경우 실제 서비스를 서버 한대만을 사용해 운영한다고 가정해보자. 현재 서비스 중인 서비스는 application-V1을 배포한 서비스이다. 그런데 기능이 업

hstory0208.tistory.com

혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!

728x90
반응형

'DevOps > 무중단배포' 카테고리의 다른 글

[DevOps] 카나리 배포(Canary Deployment)  (0) 2025.10.14
[DevOps] 롤링 배포(Rolling Deployment)  (0) 2025.10.13
[DevOps] 무중단 배포란?  (0) 2025.10.13
728x90
반응형

무중단 배포란?

https://harmony-raccoon.tistory.com/157

 

[DevOps] 무중단 배포란?

무중단 배포란?무중단 배포(Zero-Downtime Deployment)는 서비스의 운영을 멈추지 않고도 새로운 기능을 배포하거나 기존 시스템을 업데이트 하는 방법을 의미합니다.무중단 배포의 핵심은 로드 밸런

harmony-raccoon.tistory.com

카나리 배포(Canary Deployment)란?

옛날 광부들이 유독 가스에 민감한 카나리아 새를 이용해서 가스 누출 위험을 감지했던 것에서 유래한 것으로 잠재적인 문제 상황을 미리 발견하기 위한 방식을 말합니다.

카나리 배포는 신버젼의 제공 범위를 천천히 늘려가면서 모니터링 및 피드백 과정을 거치면서 배포합니다.

이 방식을 극단적으로 활용하게 된다면 A-B 테스트로 진행할 수 있습니다.

Canary Deployment

카나리 배포 장점

  • 실제 사용자 테스트와 무중단 배포를 동시에 진행할 수 있습니다.
  • 새로운 버젼으로 인한 위험을 최소화 할 수 있습니다.

카나리 배포 단점

  • 호환성 문제가 발생할 수 있습니다.(2가지 버젼이 동시에 존재하기 때문입니다.)

그래서 서버 배포보단 프론트 배포에 많이 사용되는 방식입니다.

(서버 배포는 일관성이 중요하기에, 2가지 버젼이 동시에 존재하면 어렵습니다.)

참고 자료

https://www.samsungsds.com/kr/insights/1256264_4627.html

 

무중단 배포 아키텍처(Zero Downtime Deployment)- 글로벌 서비스 운영의 필수 요소 | 인사이트리포트 |

 

www.samsungsds.com

https://hstory0208.tistory.com/entry/%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC%EB%9E%80-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC-%EC%A0%84%EB%9E%B5%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

무중단 배포란? 무중단 배포 전략에 대해 알아보자.

무중단 배포란? 무중단 배포를 사용하지 않을 경우 실제 서비스를 서버 한대만을 사용해 운영한다고 가정해보자. 현재 서비스 중인 서비스는 application-V1을 배포한 서비스이다. 그런데 기능이 업

hstory0208.tistory.com

혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!

728x90
반응형
728x90
반응형

무중단 배포란?

https://harmony-raccoon.tistory.com/157

 

[DevOps] 무중단 배포란?

무중단 배포란?무중단 배포(Zero-Downtime Deployment)는 서비스의 운영을 멈추지 않고도 새로운 기능을 배포하거나 기존 시스템을 업데이트 하는 방법을 의미합니다.무중단 배포의 핵심은 로드 밸런

harmony-raccoon.tistory.com

롤링 배포(Rolling Deployment)이란?

 

롤링 배포는 사용 중인 인스턴스 내에서 새 버젼을 점진적으로 교체하는 것으로 무중단 배포의 가장 기본적인 방식을 말합니다.

서비스 중인 인스턴스 하나를 로드 밸런서에서 라우팅하지 않도록 한 뒤, 새 버젼을 적용하여 다시 라우팅을 진행합니다.

롤링 배포 시작 전 상태

서비스 중인 인스턴스 하나를 로드 밸런서에서 라우팅 하지 않도록 설정한 후, 새 버젼으로 업데이트를 진행합니다.

신버젼으로 교체중

이후, 다른 인스턴스들도 위의 과정을 진행하여, 모든 인스턴스가 업데이트 될 때까지 반복합니다.

계속 위 과정을 반복합니다.

롤링 배포의 장점

  • 많은 서버 자원을 확보하지 않아도 무중단 배포가 가능합니다.
  • 인스턴스마다 차례로 배포를 진행하기 때문에 배포로 인한 위험이 줄어듭니다.

롤링 배포의 단점

  • 새 버젼을 배포할 때 배포 도중 서비스 중인 인스턴스가 줄어서, 각각의 서버가 부담하는 트래픽 양이 증가합니다.
  • 배포가 진행되는 동안 구버젼과 신버젼이 공존하기 때문에 호환성 문제가 발생할 수 있습니다.

참고 자료

https://www.samsungsds.com/kr/insights/1256264_4627.html

 

무중단 배포 아키텍처(Zero Downtime Deployment)- 글로벌 서비스 운영의 필수 요소 | 인사이트리포트 |

 

www.samsungsds.com

https://hstory0208.tistory.com/entry/%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC%EB%9E%80-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC-%EC%A0%84%EB%9E%B5%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

무중단 배포란? 무중단 배포 전략에 대해 알아보자.

무중단 배포란? 무중단 배포를 사용하지 않을 경우 실제 서비스를 서버 한대만을 사용해 운영한다고 가정해보자. 현재 서비스 중인 서비스는 application-V1을 배포한 서비스이다. 그런데 기능이 업

hstory0208.tistory.com

혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!

728x90
반응형
728x90
반응형

무중단 배포란?

무중단 배포(Zero-Downtime Deployment)는 서비스의 운영을 멈추지 않고도 새로운 기능을 배포하거나 기존 시스템을 업데이트 하는 방법을 의미합니다.

무중단 배포의 핵심은 로드 밸런서를 통해 연결된 2개 이상의 인스턴스(서버)에 트래픽을 제어해 배포하는 것입니다.

배포작업이 서비스에 영향을 주지 않도록 하기 위해 고객의 이용량에 따라 인스턴스는 물론 로드 밸런서도 다중화를 고려해야 합니다.

이러한 방법을 통해 사용자 경험과 서비스 신뢰성을 유지할 수 있게 되어 DevOps 환경의 핵심 기술로 자리잡고 있습니다.

일반 배포 vs 무중단 배포

일반적인 배포의 문제점

  • DownTime 발생 : 배포 시 새로운 서버가 실행되기까지 서비스가 중단됨.
  • 롤백 복잡성 : 배포 도중 문제가 발생한 경우 복구에 많은 자원과 시간이 소요됨
  • 리스크 증가 : 서비스 규모가 커질수록 배포 실패의 위험성과 리스크가 커짐.

무중단 배포의 장점

  • 서비스 연속성 보장 : 사용자는 배포중에도 끊김없는 서비스 이용 가능
  • 안정성 강화 : 배포 실패시 신속히 이전 버젼으로 롤백 가능
  • 운영 효율성 증대 : CI/CD 파이프라인과 결합하여 배포 자동화 가능

무중단 배포를 위한 준비 단계

시스템 설계 최적화

  • 로드 밸런서 도입 : 트래픽을 여러 서버로 분산하여 장애 발생을 최소화하고, 다양한 배포 전략을 사용합니다.
  • 배포 전략
    • 블루, 그린 배포
    • 카나리 배포
    • 롤링 배포

CI/CD 파이프라인 구축

  • 자동화 된 빌드와 테스트 : Jenkins, GitHub Actions 같은 도구를 사용해서 코드 변경시마다 자동 테스트 및 빌드를 실행해야 합니다.
  • 배포 관리 도구 : Terraform, Ansible, ArgoCD 등을 활용하여 서버 환경 배포를 자동화합니다.

참고 자료

https://geekdive-corp.com/column/zero-downtime-deployment-guide

 

무중단 배포 가이드: 순식간에 업데이트 되는 서버 만들기

무중단 배포 가이드: 순식간에 업데이트 되는 서버 만들기

geekdive-corp.com

https://hstory0208.tistory.com/entry/%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC%EB%9E%80-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC-%EC%A0%84%EB%9E%B5%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

무중단 배포란? 무중단 배포 전략에 대해 알아보자.

무중단 배포란? 무중단 배포를 사용하지 않을 경우 실제 서비스를 서버 한대만을 사용해 운영한다고 가정해보자. 현재 서비스 중인 서비스는 application-V1을 배포한 서비스이다. 그런데 기능이 업

hstory0208.tistory.com

혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!

728x90
반응형
728x90
반응형

Docker란?

https://harmony-raccoon.tistory.com/153

 

[Docker] Docker란?

Docker란?Docker란 Linux의 Container 기술를 활용하여 격리 프로그램을 격리하고, 생성 및 관리하는 프로그램을 말합니다.Docker 공식 홈페이지에서 정의한 Docker의 기능은 다음과 같습니다.도커 컨테이

harmony-raccoon.tistory.com

https://harmony-raccoon.tistory.com/154

 

[Docker] Docker의 구성요소

Docker란?https://harmony-raccoon.tistory.com/153 [Docker] Docker란?Docker란?Docker란 Linux의 Container 기술를 활용하여 격리 프로그램을 격리하고, 생성 및 관리하는 프로그램을 말합니다.Docker 공식 홈페이지에서

harmony-raccoon.tistory.com

Docker file이란?

https://harmony-raccoon.tistory.com/155

 

[Docker] Docker File 만들기

Docker란?https://harmony-raccoon.tistory.com/153 [Docker] Docker란?Docker란?Docker란 Linux의 Container 기술를 활용하여 격리 프로그램을 격리하고, 생성 및 관리하는 프로그램을 말합니다.Docker 공식 홈페이지에서

harmony-raccoon.tistory.com

Docker Compose이란?

Docker Compose는 다중 Container 애플리케이션을 정의하고 실행하는 도구입니다.

효율적이고 간소화된 개발 및 배포 환경을 구축하는 핵심 도구입니다.

Docker Compose는 전체 애플리케이션에서 단일 YAML 구성 파일에서 서비스, 네트워크 및 볼륨을 쉽게 관리할 수 있도록 도와줍니다.

version: "3"

services:
  front:
    image: dabom/front:latest
    ports:
      - 80:80
    volumes:

  back:
    image: dabom/back:latest
    ports:
      - 8080:8080
  db:
    image: mariadb:latest
    ports:
      - 3306:3306
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MARIADB_ROOT_PASSWORD=[DB 비밀번호]
      - MARIADB_DATABASE=[DB 이름]

단, Docker Compose 파일을 사용하기 위해서는 각각의 DockerFile이 정의되어있어야 합니다.

또한, docker-compose.yml파일이라고 이름이 고정되어야 합니다.(다른 이름으로 되어있으면 Docker가 인식하지 못합니다.)

Docker Compose 명령어

개발 환경 전체 실행

docker compose up -d

전체 중지 및 정리

docker compose down

로그 실시간 확인

docker compose logs -f

도커 이미지 다시 빌드하고 재시작

docker compose up --build -d

참고 자료

https://docs.docker.com/compose/

 

Docker Compose

Learn how to use Docker Compose to define and run multi-container applications with this detailed introduction to the tool.

docs.docker.com

혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!

728x90
반응형

'DevOps > Docker' 카테고리의 다른 글

[Docker] Docker File 만들기  (0) 2025.10.07
[Docker] Docker의 구성요소  (0) 2025.10.07
[Docker] Docker란?  (0) 2025.10.07
728x90
반응형

Docker란?

https://harmony-raccoon.tistory.com/153

 

[Docker] Docker란?

Docker란?Docker란 Linux의 Container 기술를 활용하여 격리 프로그램을 격리하고, 생성 및 관리하는 프로그램을 말합니다.Docker 공식 홈페이지에서 정의한 Docker의 기능은 다음과 같습니다.도커 컨테이

harmony-raccoon.tistory.com

https://harmony-raccoon.tistory.com/154

 

[Docker] Docker의 구성요소

Docker란?https://harmony-raccoon.tistory.com/153 [Docker] Docker란?Docker란?Docker란 Linux의 Container 기술를 활용하여 격리 프로그램을 격리하고, 생성 및 관리하는 프로그램을 말합니다.Docker 공식 홈페이지에서

harmony-raccoon.tistory.com

Docker File이란?

Docker file은 Docker에서 Docker image를 생성하기 위한 용도로 작성하는 파일을 의미합니다.

즉, 만들 Docker image에 대한 정보들을 기술한 스크립트(설정 파일)입니다.

이때, Dockerfile이라고 파일명을 고정해야 합니다.(다른 이름으로 수정하면 Docker가 인식 못합니다.)

# Base image로 openjdk 17을 사용
FROM openjdk:17-jdk-slim
# RUN = 컨테이너에서 실행할 명령어, 컨테이너를 준비하기 위한 명령어
# RUN apt update
# RUN apt intall net-tools
COPY ./build/libs/back-0.0.1-SNAPSHOT.jar  /app.jar
# ADD = COPY + 추가 기능(압축 해제, URL)
# ADD
# docker run -dit my_image bash 처럼 특정 이미지에서 마지막에 명령어를
# 입력해서 실행할 때 CMD는 입력한 명령어로 덮어쓰기 돼고, ENTRYPOINT 유지
# ENTRYPOINT  pwd
CMD ["java","-jar","/app.jar"]


# ENV = 환경 변수 설정, 문서화 역할, 기본값 설정
# EXPOSE = 포트포워딩 설정, 문서화 역할

Docker File의 지시어

FROM

FROM은 Docker file에서 사용할 Base image를 지정하는 지시어입니다.

예를 들어 우리가 vue.js 프로젝트를 빌드하여 Container로 실행시키고자 한다면 nginx 같은 서버 프로그램이 필요합니다.

이런 프로그램들이 설치된 Base image 위에서 프론트 개발자가 작성한 코드를 실행시켜야 동작하기에 이런 지시어가 필요합니다.

COPY

개발자가 개발한 프로그램을 Image 내부의 한 경로에 저장시킵니다.

즉, image가 container로 빌드될 때 우리의 프로젝트 파일이 어디에 있을지 지정하는 지시어입니다.

RUN

docker image가 container로 빌드될 때 자동으로 실행되는 명령어를 입력하는 지시어입니다.

우리 프로그램이 실행되기 위해서 설치해야할 프로그램이 있다면 이 스크립트 명령어를 통해서 설치해야 합니다.

CMD

container가 실행되고 나서 가장 먼저 실행되는 명령어를 입력하는 지시어입니다.

예를 들어 spring 백엔드 서버를 image로 패키징하여 빌드하고 싶을 때, docker image가 빌드될 때 java -jar ./app.jar 같은 명령어가 필요합니다.

이런 명령어를 입력하는 지시어입니다.

(CMD는 여러번 입력하면 맨 마지막에서 입력된 CMD만 실행됩니다.)

ENTRYPOINT

ENTRYPONIT는 CMD를 조합해서 명령어를 작성할 수 있습니다.

(ENTRYPONIT는 여러번 입력하면 맨 마지막에서 입력된 ENTRYPONIT만 실행됩니다.)

LABEL

LABEL은 Docker Image에 메타 데이터들을 추가합니다.

(key-value 형태로 저장되며, 버전같은 것을 입력할 때 사용합니다.)

ENV

ENV는 image에 필요한 환경 변수를 설정하는 지시어입니다.

(key-value 형태로 저장됩니다.)

EXPOSE

Container가 수신할 포트를 지정합니다.

기본은 TCP로 받으며 [포트 번호]/[프로토콜] 형태로 지정이 가능합니다.

ADD

URL을 통해서 필요한 프로그램을 다운받는 지시어입니다.

USER

Container 내부에서 명령을 실행할 사용자를 지정합니다.

기본은 root계정이며, 이후 명령들이 이 지시어로 지정한 사용자에서 실행됩니다.

WORKDIR

프로그램이 실행될 디렉토리를 지정합니다.

기본 home 디렉토리를 지정한다고 생각하면 될 것 같습니다.

VOLUME

컨테이너 내부 디렉토리를 외부 저장소와 연결(mount)합니다.

이때, 프로그램이 시작되면서 실행되어야 할 명령어 스크립트를 이 볼륨을 이용해서 저장하여 실행시킬 수 있습니다.

참고 자료

https://docs.docker.com/reference/dockerfile/

 

Dockerfile reference

Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.

docs.docker.com

https://hstory0208.tistory.com/entry/Docker-dockerfile%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%9E%91%EC%84%B1%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

[Docker] DockerFile의 개념과 작성법에 대해 알아보자. (도커 이미지 생성 방법)

DockerFile이란? Dockerfile은 Docker Image를 생성하기 위한 스크립트(설정파일)이다. 여러가지 명령어를 토대로 Dockerfile을 작성한 후 빌드하면 Docker는 Dockerfile에 나열된 명령문을 차례대로 수행하며 Dock

hstory0208.tistory.com

https://toramko.tistory.com/entry/docker-%EB%8F%84%EC%BB%A4%ED%8C%8C%EC%9D%BCDockerfile-%EC%9D%98-%EA%B0%9C%EB%85%90-%EC%9E%91%EC%84%B1-%EB%B0%A9%EB%B2%95%EB%AC%B8%EB%B2%95-%EC%9E%91%EC%84%B1-%EC%98%88%EC%8B%9C

 

docker :: 도커파일(Dockerfile) 의 개념, 작성 방법/문법, 작성 예시

1. 도커파일(Dockerfile) 이란? 도커파일은 docker 에서 이미지를 생성하기 위한 용도로 작성하는 파일이다. 만들 이미지에 대한 정보를 기술해 둔 템플릿(template) 이라고 보면 된다. 도커 이미지를 만

toramko.tistory.com

혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!

728x90
반응형

'DevOps > Docker' 카테고리의 다른 글

[Docker] Docker Compose란?  (0) 2025.10.07
[Docker] Docker의 구성요소  (0) 2025.10.07
[Docker] Docker란?  (0) 2025.10.07
728x90
반응형

Docker란?

https://harmony-raccoon.tistory.com/153

 

[Docker] Docker란?

Docker란?Docker란 Linux의 Container 기술를 활용하여 격리 프로그램을 격리하고, 생성 및 관리하는 프로그램을 말합니다.Docker 공식 홈페이지에서 정의한 Docker의 기능은 다음과 같습니다.도커 컨테이

harmony-raccoon.tistory.com

Docker의 구성요소

Docker는 크게 Image, Container, dockerd, docker client으로 구성되어있습니다.

Dockerd

docker daemon

dockerd는 Docker Daemon의 줄인말로서 Docker Server 프로그램을 말합니다.

한 호스트에서 실행되는 모든 컨테이너는 해당 호스트의 dockerd에 의해 생성, 관리되며 docker client는 이 데몬에 요청을 보내 컨테이너의 상태를 확인하거나 제어합니다.

기본적으로 dockerd와 docker client는 docker.sock 이라는 Unix 소켓 파일을 통해 통신합니다.

(만약, Socket 통신이 아니라 다른 설정을 통해 TCP 통신을 진행한다면 docker.sock이라는 파일을 통하지 않습니다.)

Docker Client

docker daemon 프로그램에 접속하는 프로그램을 말합니다.

간단하게 표현하자면 frontend 프로그램이라고 생각하면 됩니다.

docker desktop같은 프로그램을 말하며, docker daemon에 접속하여 사용자가 container의 상태를 확인하고 제어할 수 있습니다.

Docker Client 명령어 모음(CLI)

컨테이너 실행 및 접근

docker run -d -p 8080:80 --name web nginx
docker exec -it web bash

이미지 빌드 및 실행

docker build -t myapp:1.0 . // 현재 경로에 존재하는 Dockerfile을 이용해서 빌드합니다.
// myapp:1.0 => myapp이라는 이름의 이미지 이름과 1.0이라는 태그를 가진 이미지로 빌드합니다.
docker run -d -p 8080:8080 myapp:1.0

컨테이너 상태 모니터링

docker ps
docker logs -f web
docker stats

리소스 정리

docker stop $(docker ps -q)
docker rm $(docker ps -aq)
docker image prune -a

Docker Image

Docker Image, Docker Container

Docker Image는 Container를 생성하기 전에 필요한 모든 코드 소스 파일 및 환경을 저장한 패키지를 말합니다.

간단하게 Spring이라는 프로그램을 실행하기 위해서는 Java17 같은 프로그램도 필요합니다.

이러한 프로그램들을 Docker에서는 Image파일로 제공하고 있으며, 온라인으로 접속하여 다운받을 수 있는 곳을 Docker Hub라고 합니다.

또한, 개발자가 자신이 만든 프로그램을 Image로 패키징하여 Docker Hub에 업로드하고, 다른 컴퓨터에서 다운받을 수 있습니다.

Docker Container

Docker에서 관리하는 Container들을 Docker Container라고 합니다.

간단하게 이해하자면 Docker Image가 Container를 만들 코드 소스들 모음이라고 생각하고, Docker Image가 메모리 위로 올라와서 실행된다면 그 프로그램이 Docker Container라고 생각해도 됩니다.

참고 자료

https://stackoverflow.com/questions/46649592/dockerd-vs-docker-containerd-vs-docker-runc-vs-docker-containerd-ctr-vs-docker-c

 

dockerd vs docker-containerd vs docker-runc vs docker-containerd-ctr vs docker-containerd-shim

This stuff is really getting confused now. Can someone please explain what's going on. Just the straight one liner difference. dockerd libcontainerd containerd docker-containerd docker-runc docker-

stackoverflow.com

https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-an-image/

 

What is an image?

What is an image

docs.docker.com

https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/

 

What is a container?

What is a container? This concept page will teach you about containers and provide a quick hands-on where you will run your first container.

docs.docker.com

https://nginxstore.com/blog/nginx/nginx-%EC%9B%B9-%EC%84%9C%EB%B2%84%EB%A5%BC-docker-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%A1%9C-%EB%A7%8C%EB%93%A4%EC%96%B4-%EA%B5%AC%EB%8F%99%ED%95%98%EA%B8%B0/

 

NGINX Plus Docker 이미지 구성 및 실행 가이드

이 포스트에서는 NGINX OSS/Plus 웹 서버를 Docker 이미지 로 만들고 컨테이너를 생성하여, 구동하는 방법에 대해 다루겠습니다. 해당 방법을 통해 기존에 사용하던 서버를 손쉽게 Docker 컨테이너로 생

nginxstore.com

혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!

728x90
반응형

'DevOps > Docker' 카테고리의 다른 글

[Docker] Docker Compose란?  (0) 2025.10.07
[Docker] Docker File 만들기  (0) 2025.10.07
[Docker] Docker란?  (0) 2025.10.07
728x90
반응형

Docker란?

Docker란 Linux의 Container 기술를 활용하여 격리 프로그램을 격리하고, 생성 및 관리하는 프로그램을 말합니다.

Docker 공식 홈페이지에서 정의한 Docker의 기능은 다음과 같습니다.

도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다.
여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.

즉, Docker는 Linux의 시스템을 활용하여 구성되기 때문에 Linux 시스템을 가지고 있어야 합니다.

따라서 Window Os는 WSL이라는 프로그램을 활용해서 Linux를 설치해야 하고, Mac OS는 Linux 시스템과 같은 계열의 OS이므로 따로 추가 설치할 필요가 없습니다.

WSL이란?
WSL(Window Subsystem for Linux)의 약자로 윈도우 10, 11에서 네이티브로 Linux를 가동하기 위한 프로그램을 말합니다.

Container란?

Linux에서 Container는 코드의 라이브러리 및 종속성과 함께 애플리케잉션 코드를 포함하는 스프트웨어의 실행 가능한 단위로서, 코드를 다양한 에코 시스템에서 실행할 수 있습니다.

컨테이너는 OS 커널의 기능을 사용하여 프로세스를 격리하고 애플리케이션이 엑세스할 수 있는 CPU, 메모리 및 디스크 공간의 양을 제어하는 운영 체제 가상화의 형태를 활용합니다.

Container는 VM보다 이동성이 뛰어나고 리소스 효율성이 뛰어나기에 현재 클라우드 네이티브 애플리케이션에서 필수적으로 사용되고있습니다.

Container vs VM

VM vs Container

VM(Virtual Machine)

하이퍼 바이저라는 소프트웨어는 물리적 머신에서 리소스를 분리하여 분할하고 VM에 할당할 수 있도록 합니다.

사용자가 물리적 환경에서 추가 리소스를 요구하는 VM 명령을 실행하면 하이퍼바이저는 해당 요청을 물리적 시스템으로 전달하고 변경 사항을 캐시합니다.

VM은 물리적 서버처럼 보이고 작동하기 때문에 애플리케이션 종속성과 대규모 OS 설치 공간이라는 단점이 존재합니다.

이러한 공간은 단일 앱이나 마이크로서비스(MSA)를 실행하는 데는 거의 필요하지 않습니다.

Container의 장점

Container는 VM과 다르게 같은 OS에서 프로그램을 격리하는 기능을 가진 프로그램이기에, OS를 공유합니다.

따라서 새로운 OS를 설치할 필요가 없으며, VM보다 리소스를 효율적으로 사용합니다.

그렇기에 쉽게 확장할 수 있으며, 이를 활용한 프로그램이 Docker입니다.

현재, Container를 활용한 프로그램은 Docker, Kubernetes가 존재합니다.

참고 자료

https://ko.wikipedia.org/wiki/%EB%8F%84%EC%BB%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)

 

도커 (소프트웨어) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 도커(Docker)는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다. 도커 웹 페이지의 기능을

ko.wikipedia.org

https://ko.wikipedia.org/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4%EC%9A%A9_%EC%9C%88%EB%8F%84%EC%9A%B0_%ED%95%98%EC%9C%84_%EC%8B%9C%EC%8A%A4%ED%85%9C

 

리눅스용 윈도우 하위 시스템 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 리눅스용 윈도우 하위 시스템(Windows Subsystem for Linux, WSL)은 윈도우 10과 윈도우 11에서 네이티브로 리눅스 실행 파일(ELF)을 실행하기 위한 호환성 계층이다. WSL은

ko.wikipedia.org

https://www.ibm.com/kr-ko/think/topics/linux-containers

 

Linux 컨테이너란 무엇입니까? | IBM

Linux 컨테이너(LXC)는 Linux 운영 체제를 기반으로 하는 컨테이너 유형입니다.

www.ibm.com

https://www.redhat.com/en/topics/containers/containers-vs-vms

 

Containers vs VMs

Linux containers and virtual machines (VMs) are packaged computing environments that combine various IT components and isolate them from the rest of the system.

www.redhat.com

혹시라도 틀린 내용이 있다면 댓글로 알려주시면 감사하겠습니다!!

728x90
반응형

'DevOps > Docker' 카테고리의 다른 글

[Docker] Docker Compose란?  (0) 2025.10.07
[Docker] Docker File 만들기  (0) 2025.10.07
[Docker] Docker의 구성요소  (0) 2025.10.07
728x90
반응형

WebSocket이란?

https://harmony-raccoon.tistory.com/145

 

[Network] WebSocket이란?

WebSocket이란?WebSocket은 단일 TCP(Transmission Control Protocol) 연결을 통해 양방향 통신을 제공하는 컴퓨터 통신 프로토콜을 의미합니다.HTTP 통신과는 다르지만 WebSocket은 "HTTP 포트 443, 80을 통해 작동하

harmony-raccoon.tistory.com

STOMP이란?

https://harmony-raccoon.tistory.com/144

 

[Network] WebSocket (STOMP)

WebSocket이란?https://harmony-raccoon.tistory.com/145 [Network] WebSocket이란?WebSocket이란?WebSocket은 단일 TCP(Transmission Control Protocol) 연결을 통해 양방향 통신을 제공하는 컴퓨터 통신 프로토콜을 의미합니다.HTTP

harmony-raccoon.tistory.com

Vue.js로 WebSocket 구현하기

https://harmony-raccoon.tistory.com/152

 

[Vue.js] WebSocket 구현하기

WebSocket 이란?https://harmony-raccoon.tistory.com/145 [Network] WebSocket이란?WebSocket이란?WebSocket은 단일 TCP(Transmission Control Protocol) 연결을 통해 양방향 통신을 제공하는 컴퓨터 통신 프로토콜을 의미합니다.HTT

harmony-raccoon.tistory.com

Spring을 이용해서 WebSocket 구현하기

WebSocket 서버를 열기 위해서는 WebSocket Config 파일이 존재해야 합니다.

WebSocketConfig

@Configuration
@EnableWebSocketMessageBroker
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    private final JwtHandShakeInterceptor jwtHandShakeInterceptor;
    private final AuthChannelInterceptor authChannelInterceptor;

    @Value("${websocket.allowed-origin}")
    private String frontServer; // front URI

    @Bean(name = "customMessageBrokerScheduler")
    public TaskScheduler messageBrokerTaskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        scheduler.setThreadNamePrefix("ws-heartbeat-");
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        scheduler.initialize();
        return scheduler;
    } // WebSocket을 처리할 Thread 설정

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic", "/queue") // Topic, Queue Prefix 설정
                .setTaskScheduler(messageBrokerTaskScheduler())
                .setHeartbeatValue(new long[]{10000, 10000});
        // 하트비트 연결 및 10초 주기로 연결 확인
        registry.setApplicationDestinationPrefixes("/app"); // Client가 데이터를 보낼 Prefix 설정
        registry.setUserDestinationPrefix("/user");
        // 사용자별 메세지 라우팅
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat") // WebSocket HandShake를 할 URI
                .addInterceptors(jwtHandShakeInterceptor) // jwt를 통해서 인가 담당 기능
                .setAllowedOriginPatterns(frontServer) // CORS 해제 설정
                .withSockJS(); // SockJS를 통한 WebSocket 설정
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(authChannelInterceptor); // WebSocket에서 인증 정보를 처리할 수 있도록 저장하는 기능을 수행하는 객체
    }

    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
        registration.setMessageSizeLimit(128 * 1024); // 128KB
        registration.setSendBufferSizeLimit(512 * 1024); // 512KB
        registration.setSendTimeLimit(1000); // 전송시간 제한 1초
    }
}

여기서 추가적인 객체가 2개가 존재합니다.

JwtHandShakeInterceptor, AuthChannelInterceptor인데, 각각 하는 역할이 다릅니다.

JwtHandShakeInterceptor : HTTP HandShake가 일어날 때, 인가 검증

AuthChannelInterceptor : STOMP에서 연결을 하기 위한 CONNECT Frame 통신이 올 때, 인가 검증

특히, AuthChannelInterceptor는 인가를 확인한 후에 사용자 데이터를 기능에 적용할 수 있도록 제공해주는 중요한 객체입니다.

JwtHandShakeInterceptor

@Component
public class JwtHandShakeInterceptor implements HandshakeInterceptor {
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        if (request instanceof ServletServerHttpRequest servletServerHttpRequest) {
            HttpServletRequest httpReq = servletServerHttpRequest.getServletRequest();

            Cookie[] cookies = httpReq.getCookies();

            String jwt = findDabomJWT(cookies);
            exceptionHandler(jwt, attributes);
        }
        return true;
    }


    private void exceptionHandler(String jwt, Map<String, Object> attributes) {
        try {
            haveTokenLogic(jwt, attributes);
        } catch (ExpiredJwtException e) {
            // 만료 토큰 302 Redirect로 RefreshToken
        } catch (SecurityException | MalformedJwtException e) {
            // 잘못된 토큰 403 Error 내려주기
        } catch (UnsupportedJwtException e) {
            // 지원되지 않는 토큰 403 Error 내려주기
        } catch (IllegalArgumentException e) {
            // 빈 토큰 403 Error 내려주기
        }
    }

    private String findDabomJWT(Cookie[] cookies) {
        String jwt = null;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (Objects.equals(cookie.getName(), ACCESS_TOKEN)) {
                    jwt = cookie.getValue();
                }
            }
        }
        return jwt;
    }

    private void haveTokenLogic(String jwt, Map<String, Object> attributes) {
        if (jwt != null) {
            Claims claims = JwtUtils.getClaims(jwt);
            haveDabomTokenLogic(claims, attributes, jwt);
        }
    }

    private void haveDabomTokenLogic(Claims claims, Map<String, Object> attributes, String jwt) {
        if (claims != null) {
            MemberDetailsDto dto = createDetailsFromToken(claims, jwt);

            Authentication authentication = new UsernamePasswordAuthenticationToken(
                    dto,
                    null,
                    List.of(new SimpleGrantedAuthority(dto.getMemberRole().name()))) {
                @Override
                public String getName() {
                    return dto.getIdx().toString(); // getName대신 getIdx를 사용하기 위해서 설정
                }
            };
            SecurityContextHolder.getContext().setAuthentication(authentication);
            attributes.put("auth", authentication);
        }
    }

    private MemberDetailsDto createDetailsFromToken(Claims claims, String jwt) {
        Integer idx = Integer.parseInt(JwtUtils.getValue(claims, TOKEN_IDX));
        String name = JwtUtils.getValue(claims, TOKEN_NAME);
        String role = JwtUtils.getValue(claims, TOKEN_USER_ROLE);
        return MemberDetailsDto.createFromToken(idx, name, role);
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {

    }
}

위 코드는 Spring Security에서 JwtAuthFilter와 매우 흡사한 코드입니다.

실제로 동작 과정도 매우 흡사합니다. (단, 2개의 코드가 완전히 같게 움직이게 할 수 없습니다. / 프로토콜이 미세하게 다르기 때문에)

AuthChannelInterceptor

@Component
public class AuthChannelInterceptor implements ChannelInterceptor {
    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
        if(StompCommand.CONNECT.equals(accessor.getCommand())) { // STOMP에서 CONNECT형태로 데이터가 오면
            Map<String, Object> attributes = accessor.getSessionAttributes();
            if(attributes!=null) {
                Authentication authentication = (Authentication) attributes.get("auth");
                if(authentication!=null) {
                    accessor.setUser(authentication); // 인가 정보를 뽑아서 StompHeaderAccessor에 저장한다.
                }
            }
        }
        return message;
    }
}

STOMP에서 CONNECT로 Frame의 Command가 날라오면, 처음 웹소캣에 연결하는 클라이언트이므로 인가 과정을 통해 처리해야 합니다.

이렇게 인가 정보는 다음 기능을 수행할 때 사용하게 됩니다.

ChatController

@RestController
@RequiredArgsConstructor
public class TogetherChatController {
    private final SimpMessagingTemplate messagingTemplate;
    private final MemberService memberService;
    private final TogetherService togetherService;
    private final Map<String, Set<Integer>> topicSessions = new ConcurrentHashMap<>();

    @MessageMapping("/together/{togetherIdx}")
    public void sendMessage(Principal principal,
                            @DestinationVariable Integer togetherIdx, @Payload String message) {
        MemberDetailsDto memberDetailsDto = getMemberDetailsDto((Authentication) principal);

        MemberInfoResponseDto memberInfo = memberService.getMemberInfo(memberDetailsDto);
        String destination = "/topic/together/" + togetherIdx; // 토픽 키
        int userCount = topicSessions.getOrDefault(destination, Collections.emptySet()).size();

        TogetherChatResponseDto res = TogetherChatResponseDto.toDtoBySend(memberInfo.name(), message, userCount, memberInfo.id());

        messagingTemplate.convertAndSend("/topic/together/" + togetherIdx, res);
    }

    @EventListener
    public void handleSubscribeEvent(SessionSubscribeEvent event) {
        SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.wrap(event.getMessage());
        Principal userPrincipal = headerAccessor.getUser();
        String destination = headerAccessor.getDestination();

        if (destination != null && destination.startsWith("/topic/together/")) {
            // 환영 메시지 생성
            MemberDetailsDto memberDetailsDto = getMemberDetailsDto((Authentication) userPrincipal);
            MemberInfoResponseDto memberInfo = memberService.getMemberInfo(memberDetailsDto);

            // 토픽별 접속자 세션 관리
            topicSessions.computeIfAbsent(destination, k -> ConcurrentHashMap.newKeySet()).add(memberInfo.id());

            Integer userCount = topicSessions.get(destination).size();

            TogetherChatResponseDto welcome = TogetherChatResponseDto.toDtoByJoin(memberInfo.name(), userCount);
            messagingTemplate.convertAndSend(destination, welcome);
        }
    }

    @EventListener
    public void handleDisconnectEvent(SessionDisconnectEvent event) {
        SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.wrap(event.getMessage());
        Principal userPrincipal = headerAccessor.getUser();

        if (userPrincipal == null) {
            return; // 인증정보 없으면 종료
        }

        MemberDetailsDto memberDetailsDto = getMemberDetailsDto((Authentication) userPrincipal);
        Integer memberId = memberDetailsDto.getIdx();

        // 연결된 모든 토픽에 대해 해당 멤버 아이디 제거
        topicSessions.forEach((topic, memberSet) -> {
            boolean removed = memberSet.remove(memberId);
            if (removed) {
                messagingTemplate.convertAndSend(topic, "");
            }
        });
    }

    private MemberDetailsDto getMemberDetailsDto(Authentication principal) {
        Authentication authentication = principal;
        MemberDetailsDto memberDetailsDto = (MemberDetailsDto)authentication.getPrincipal();
        return memberDetailsDto;
    }
}

위 코드는 실제 채팅방 기능을 개발한 코드에서 발췌한 내용입니다.

제가 저 코드를 작성할 때, 인가 정보를 가지고 채팅방의 인원을 확인하고, 없다면 새로 추가하여 인원방을 정확하게 처리하기 위해 인가 정보를 활용했었습니다.

이렇게 AuthChannelInterceptor를 활용해서 추가적인 기능 개발을 진행할 수 있습니다.

728x90
반응형
728x90
반응형

WebSocket 이란?

https://harmony-raccoon.tistory.com/145

 

[Network] WebSocket이란?

WebSocket이란?WebSocket은 단일 TCP(Transmission Control Protocol) 연결을 통해 양방향 통신을 제공하는 컴퓨터 통신 프로토콜을 의미합니다.HTTP 통신과는 다르지만 WebSocket은 "HTTP 포트 443, 80을 통해 작동하

harmony-raccoon.tistory.com

STOMP이란?

https://harmony-raccoon.tistory.com/144

 

[Network] WebSocket (STOMP)

WebSocket이란?https://harmony-raccoon.tistory.com/145 [Network] WebSocket이란?WebSocket이란?WebSocket은 단일 TCP(Transmission Control Protocol) 연결을 통해 양방향 통신을 제공하는 컴퓨터 통신 프로토콜을 의미합니다.HTTP

harmony-raccoon.tistory.com

Vue.js를 이용하여 WebSocket 구현하기

Sock.js를 사용해서 WebSocket 구현

WebSocket을 Stomp를 사용해서 구현할려면 npm에서 라이브러리를 다운받아야 합니다.

npm install stompjs
npm install sockjs-client

이를 통해서 WebSocket에 연결하는 방법을 다음 코드로 구현하면 됩니다.

JavaScript로 WebSocket 연결

다음 코드는 WebSocket을 연결하는 것까지만 구현되어있습니다.

const connectWebSocket = async () => {
  const ws = new SockJS('https://[WebSocket 서버 URI 주소]', null,
      {
        transportOptions: {
          xhr: { withCredentials: true }, // Cookie를 같이 보내기 위한 코드
          xhrStreaming: { withCredentials: true } // Cookie를 같이 보내기 위한 코드
        }
      })
  const client = Stomp.over(ws)
  socket.value = client
  socket.value.connect(
      {},
    (frame) => {
      subscribed.value = true
      subscribeMasterEvent()
    },
    (error) => {
    }
  )
}

JavaScript로 WebSocket 구독

다음 코드는 연결된 WebSocket에서 STOMP로 구독하고, 메시지를 얻는 기능을 코드로 구현한 것입니다.

const socket = reactive({
  messages: [],
  socket: null
})

const chatSubscription = () => {
  socket.socket.subscribe(`/topic/[토픽 URI]`, (mes) => {
    const data = JSON.parse(mes.body)
    socket.messages.push(data)
    if(data.users !== socket.joinMember) {
      socket.joinMember = data.users
    }
  });
}

이 기능은 개발자가 지정한 Topic으로 구독을 진행하고, 그 구독으로 메시지가 전파되면 그 메시지를 캐치해서 메시지 리스트에 데이터를 저장하는 코드입니다.

JavaScript로 Message 전송

writeMessage에 담긴 데이터를 웹소캣을 통해서 서버에 전송합니다.

const writeMessage = ref("")

const sendMessage = () => {
  if(writeMessage.value === ""){
    return;
  }
  socket.socket.send(`/app/[topic의 URI]`, {}, writeMessage.value);
  writeMessage.value = ""
}

해당 서버는 받은 데이터를 다시 같은 Topic을 구독하고 있는 전체 클라이언트들에게 전송합니다.

이때, 내가 보낸 데이터를 다시 내가 받기 때문에 내가 보낸 데이터인지 확인하고 처리를 하는 기능을 꼭 구현해야 합니다.

728x90
반응형

'Vue.js' 카테고리의 다른 글

[Vue.js] Oauth2 개발하기  (0) 2025.09.24
[Vue.js] Composition API(Ref, Reactive)  (0) 2025.07.17
[Vue.js] API 통신  (0) 2025.07.15
[Vue.js] State Management  (0) 2025.07.15
[Vue.js] Router  (0) 2025.07.15

+ Recent posts