[Docker] Docker를 사용하여 간단한 웹 애플리케이션을 만들기

2 분 소요

출처: https://dennis.k8s.kr/3 [데니스의 구름짓는 스터디:티스토리]

Dockerfile 이란?

도커(Docker) 이미지를 생성하기 위한 설정 파일

FROM nginx:alpine

  • Nginx의 Alpine 버전을 기반 이미지로 사용
    • Nginx : 웹 서버 소프트웨어, HTTP 서버와 리버스 프록시 서버로 많이 사용
    • Alpine 버전 : 매우 가벼운 리눅스 배포판을 사용하여 이미지를 최소화

COPY index.html /usr/share/nginx/html

  • 호스트 시스템에 있는 index.html 파일을 Nginx의 기본 웹 루트 디렉토리인 /usr/share/nginx/html 로 복사
  • 이 파일을 복사됨으로써 Nginx는 이 파일을 웹 페이지로 서빙

Docker 이미지 빌드

docker build -t my-web-app .

  • docker build : Dockerfile을 읽고 그에 따라 Docker 이미지를 빌드
    • Docker 빌드 프로세스는 Dockerfile에 정의된 명령어를 단계별로 실행하여 이미지를 생성한다.
  • -t my-web-app : 생성된 이미지에 이름을 태그(tag)
    • 이 태그를 통해 이미지를 쉽게 식별하고 참조할 수 있습니다.
  • . : 빌드 위치

Docker 컨테이너 실행

docker run -d -p 80:80 --name my-web-app my-web-app

  • docker run : 새로운 컨테이너를 생성하고 실행
  • -d : 컨테이너를 백그라운드 모드(detached mode)로 실행
    • 터미널을 차지 않고 백그라운드에서 실행
    컨테이너를 백그라운드에서 실행하는 이유

    1. 터미널 제어권 유지

    • 터미널 사용 가능:
      • 컨테이너가 백그라운드에서 실행되면 터미널이 실행 중인 컨테이너에 묶이지 않으므로 사용자는 터미널에서 다른 작업을 계속할 수 있습니다.
      • 예를 들어, 개발자는 추가적인 명령을 실행하거나 다른 컨테이너를 관리할 수 있습니다.

    2. 다중 서비스 실행

    • 여러 컨테이너 관리:
      • 하나 이상의 컨테이너를 동시에 실행해야 하는 경우, 각 컨테이너를 백그라운드에서 실행하면 여러 컨테이너를 쉽게 관리할 수 있습니다.
      • 예를 들어, 웹 서버, 데이터베이스, 캐시 서버 등을 각각 다른 컨테이너에서 실행하고 이들을 동시에 작동시킬 수 있습니다.

    3. 안정적인 서비스 운영

    • 지속적인 서비스:
      • 백그라운드 모드에서 실행된 컨테이너는 시스템이 종료되거나 재부팅될 때까지 계속 실행됩니다.
      • 이는 웹 서버나 데이터베이스 서버와 같이 항상 가동되어야 하는 서비스에 적합합니다.

    4. 스크립트 및 자동화

    • 자동화 스크립트:
      • 배포 스크립트나 자동화 도구에서 컨테이너를 실행할 때, 백그라운드 모드로 실행하면 스크립트의 다른 부분이 차질 없이 계속 실행될 수 있습니다.
      • CI/CD 파이프라인에서도 컨테이너를 백그라운드에서 실행하여 테스트 및 배포 작업을 진행할 수 있습니다.

    5. 로그 및 디버깅

    • 로그 수집 및 모니터링:
      • 컨테이너가 백그라운드에서 실행되는 동안, 로그는 Docker의 로깅 드라이버를 통해 수집되며 필요에 따라 docker logs 명령어를 통해 액세스할 수 있습니다.
      • 이는 로그를 실시간으로 모니터링하거나 나중에 분석할 수 있도록 합니다.

    6. 시스템 리소스 효율성

    • 리소스 활용:
      • 백그라운드 모드에서 실행된 컨테이너는 시스템 리소스를 효율적으로 사용하며, 필요한 경우 빠르게 접근할 수 있습니다.
      • 이는 시스템의 전체 성능과 효율성을 높이는 데 도움이 됩니다.
  • -p 80:80 : 호스트 머신의 포트 80을 컨테이너의 포트 80에 매핑
    • 호스트 머신의 웹 브라우저에서 ‘localhost’ 또는 ‘127.0.0.1’을 통해 컨테이너의 Nginx 웹 서버에 접근할 수 있다.
  • --name my-web-app : Docker 컨테이너에 ‘my-web-app’ 이라는 이름을 부여
  • my-web-app : 실행할 Docker 이미지의 이름

확인 및 디버깅

docker ps : 컨테이너가 잘 실행되고 있는지 목록 보기

Untitled

docker logs my-web-app : Nginx 컨테이너의 로그를 확인

Docker 컨테이너 종료 및 삭제

docker: Error response from daemon: driver failed programming external 
connectivity on endpoint my-web-app2 
(82bc4b3c663dc8370f283608a946712e07dee8f89d815a0c7cec705e62fc6c05): 
Bind for 0.0.0.0:80 failed: port is already allocated.

docker를 중지하지 않고 사용할 경우 발생하는 에러

docker stop my-web-app2 : 컨테이너 중지

docker rm my-web-app2 : 컨테이너 삭제

  • $(docker ps -aqf “name=my-web-app”) : my-web-app 이름을 갖는 모든 컨테이너의 ID를 반환

카테고리:

업데이트: