Growth Log/도커&쿠버네티스

1주차 도커 소개 & 도커 활용

MDanderson 2025. 4. 20. 01:29

도커(Docker)란?

도커는 애플리케이션을 컨테이너라는 단위로 패키징하고 실행할 수 있게 해주는 오픈소스 플랫폼
개발, 테스트, 배포 환경이 일치해서 "내 컴퓨터에선 잘 되는데?" 문제를 줄여준다.

더 자세히 설명하면 컨테이너(Container) 기반의 가상화 기술로, 애플리케이션과 그 실행 환경을 하나의 패키지로 묶어 어디서든 동일하게 실행할 수 있도록 도와주는 플랫폼이다.

  • 개발자, 운영자, 테스트 팀 모두 같은 환경에서 작업 가능
  • 리눅스, 윈도우, 클라우드, 온프레미스 어디서든 실행 가능

 

 

 

도커는 애플리케이션과 그 실행 환경(라이브러리, 설정 등)을 컨테이너로 패키징해서 어떤 환경에서도 동일하게 동작하도록 해준다

도커의 장점

1. 개발환경과 테스트환경과 운영 환경 일치

  • 도커 이미지 안에 환경을 통째로 넣으니까 어디서든 똑같이 실행됨

2. 가볍고 빠름

  • VM보다 리소스 적게 씀 (OS 전체가 아님)
  • 컨테이너는 초 단위로 실행/종료

3. 버전 관리와 이식성

  • Dockerfile로 설정을 코드처럼 관리
  • 이미지 하나면 다른 서버로 옮기기 쉬움 (CI/CD도 쉬워짐)

4. 확장성 & 마이크로서비스 아키텍처에 최적

  • 여러 컨테이너(=서비스)를 독립적으로 실행 가능
  • 서비스별로 스케일 업/다운도 쉬움

5. 테스트 자동화와 지속적 통합(CI/CD)에 유리

  • GitHub Actions, Jenkins 등과 잘 통합됨
  • 테스트, 빌드, 배포 자동화하기 좋음

6. 커뮤니티와 생태계가 강력

  • DockerHub에 수많은 공개 이미지 존재 (MySQL, Redis, Nginx, Node 등등)
  • 바로 써도 되고, 내 환경에 맞게 커스터마이징도 쉬움

 

컨테이너 vs 가상머신 (VM)

항목                                                   컨테이너                                                                    가상머신

 

격리 방식 커널 공유, 프로세스 수준 하이퍼바이저 위에 OS 별도로 설치
부팅 속도 빠름 (초 단위) 느림 (분 단위)
성능 오버헤드 적음
이미지 크기 작음 (수백 MB) 큼 (수 GB)
유연성 코드, 의존성만 패키징 OS 전체 포함

컨테이너는 가볍고 빠르며 리소스를 적게 사용하지만, 가상머신은 더 강한 격리와 보안성을 제공함

                                         

 

                                       컨테이너                                                                                가상머신

 

 

컨테이너 격리란?

컨테이너는 서로 분리된 프로세스 환경을 갖고 있다.
파일 시스템, 네트워크, PID 등을 독립적으로 사용하기 때문에 하나가 죽어도 다른 컨테이너에 영향이 없다.
하지만 완전한 격리는 아니고, 커널은 호스트와 공유함.

컨테이너는 다른 컨테이너 및 호스트 시스템과 분리된 환경에서 실행되는데  이 격리는 다음 요소를 포함한다.

  • 파일 시스템 격리: 각 컨테이너는 고유의 루트 파일 시스템 사용
  • 프로세스 격리: PID 네임스페이스로 프로세스를 분리
  • 네트워크 격리: 독립된 가상 네트워크 사용
  • 유저 격리: UID 매핑을 통해 사용자 환경도 분리
  • 이런 격리 덕분에 보안성, 안정성, 병렬 실행이 보장됨

도커 네트워크 모델

1. bridge 모드 (기본)

  • 컨테이너들이 호스트 내부 가상 브리지 네트워크에 연결됨
  • 서로 통신 가능 (같은 브리지 네트워크 내)
  • 외부 접속은 -p 옵션으로 포트를 노출해야 함
    예) 
docker run -p 8080:80 myapp

2. host 모드

  • 컨테이너가 호스트의 네트워크 스택을 그대로 사용
  • 포트 매핑이 불필요하다. IP, 포트가 호스트와 동일 → 성능은 좋지만 격리 수준 낮아짐
  • 속도는 빠르지만, 격리 수준이 낮아짐
    예)
docker run --network host myapp

3. none 모드

  • 네트워크가 아예 없음
  • 네트워크를 수동으로 설정하거나, 테스트용으로 사용
  • 완전히 격리된 상태, 수동으로 설정 필요
    예)
docker run --network none myapp

 

Dockerfile이란?

  • 도커 이미지 생성 규칙을 정의한 설정 파일
  • 애플리케이션 설치, 복사, 실행 명령 등을 포함

예)

FROM node:18
COPY . /app
WORKDIR /app
RUN npm install
CMD ["npm", "start"]

 

.dockerignore 파일

  • docker build할 때 복사하지 않을 파일/디렉토리를 지정하는 파일
  • .git, node_modules, logs 등 빌드에 불필요한 파일 제외 가능
  • 장점:
    • 빌드 속도 향상
    • 이미지 크기 줄이기
    • 민감한 파일 포함 방지

예)

node_modules
.git
*.log

 

 

이미지 빌드란?

  • Dockerfile을 기반으로 애플리케이션 환경을 포함한 이미지 생성
  • 이 이미지를 컨테이너 실행의 기반으로 사용함
  • 명령어: docker build -t my-app .
  • -t는 태그(이름) 지정
  • 빌드된 이미지는 docker images로 확인 가능

 

멀티플랫폼 빌드란?

  • 하나의 Dockerfile로 여러 아키텍처용 이미지를 빌드하는 것
    즉, 여러 플랫폼에서 실행될 수 있는 이미지를 한 번에 빌드하는 것
  • docker buildx 기능을 사용함
  • buildx는 도커의 확장 빌더
  • --platform으로 대상 플랫폼 지정
  •  

docker buildx build --platform linux/amd64,linux/arm64 -t my-app --push .

 

도커 컴포즈(Docker Compose)란?

  • 여러 컨테이너 서비스를 정의하고 한번에 실행/관리할 수 있는 도구
  • docker-compose.yml 파일을 사용
  • docker-compose는 여러 개의 컨테이너 서비스를 정의하고 관리할 수 있는 도구
    docker-compose.yml 파일에 서비스를 정의하고, 한 번에 실행할 수 있다
  • 장점:
    • 인프라 구성 코드화
    • 개발용 로컬 서버 구성에 탁월
    • 복잡한 서비스 구조를 간단하게 관리

version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

명령어: 
docker-compose up    # 서비스 실행
docker-compose down  # 서비스 중지 및 제거