[Docker] Docker를 사용하여 간단한 웹 애플리케이션을 만들기
출처: 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
명령어를 통해 액세스할 수 있습니다. - 이는 로그를 실시간으로 모니터링하거나 나중에 분석할 수 있도록 합니다.
- 컨테이너가 백그라운드에서 실행되는 동안, 로그는 Docker의 로깅 드라이버를 통해 수집되며 필요에 따라
6. 시스템 리소스 효율성
- 리소스 활용:
- 백그라운드 모드에서 실행된 컨테이너는 시스템 리소스를 효율적으로 사용하며, 필요한 경우 빠르게 접근할 수 있습니다.
- 이는 시스템의 전체 성능과 효율성을 높이는 데 도움이 됩니다.
-p 80:80
: 호스트 머신의 포트 80을 컨테이너의 포트 80에 매핑--name my-web-app
: Docker 컨테이너에 ‘my-web-app’ 이라는 이름을 부여my-web-app
: 실행할 Docker 이미지의 이름
확인 및 디버깅
docker ps
: 컨테이너가 잘 실행되고 있는지 목록 보기
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를 반환