Docker를 사용하여 간단한 웹 애플리케이션을 만드는 단계별 실습
사전 요구 사항
- Docker가 설치되어 있고 실행 중인 컴퓨터
Dockerfile 문법 알아보기
커맨드의미
FROM | 베이스 이미지 지정 |
RUN | 베이스 이미지에 새로운 레이어를 추가해 커맨드를 실행하고 결과를 빌드 이미지에 반영 |
CMD | 컨테이너 시작시 실행할 커맨드 설정 |
LABEL | 이미지에 레이블 지정 |
EXPOSE | 컨테이너에서 노출하는 포트 번호 설정 |
ENV | 환경 변수 설정 |
ADD | 이미지에 파일 복사 |
COPY | 이미지에 파일 복사 |
ENTRYPOINT | 컨테이너 시작시 실행할 커맨드 설정 |
VOLUME | 볼륨이 마운트 될 위치 설정 |
USER | 커맨드를 실행할 때 사용자 ID 설정 |
WORKDIR | 커맨드를 실행할 때 작업 디렉터리 설정 |
ARG | 빌드 시에만 사용되는 변수 설정 |
ONBUILD | 이 이미지를 베이스로 빌드할 때 커맨드가 실행되도록 하기 |
STOPSIGNAL | 컨테이너를 중지시킬 때의 시그널 번호 설정 |
HEALTHCHECK | 헬스 체크를 위한 커맨드 설정 |
Docker CLI 살펴 보기
커맨드의미
docker build | Dockerfile로 이미지 빌드 |
docker images | 이미지 리스트 보기 |
docker image inspect | 이미지 상세 정보 보기 |
docker pull | 레지스트리로부터 이미지 가지고 오기 |
docker push | 레지스트리에 이미지 전송하기 |
docker history | 이미지 생성 기록 보기 |
docker rmi | 이미지 삭제 |
docker import | Docker container export로 가지고 온 것으로 이미지 만들기 |
docker save | 이미지 tar 아카이브로 출력 |
docker load | Docker image save로 출력한 것(tar 아카이브)으로 이미지 로드 |
docker tag | 기존의 이미지에 태그 붙이기 |
docker ps | 컨테이너 목록 보기 |
docker logs | 컨테이너 로그 취득 |
docker exec | 실행 중인 컨테이너 내부에서 커맨드 실행 |
docker container inspect | 컨테이너의 자세한 정보 보기 |
docker port | 컨테이너 포트 맵핑 보기 |
docker rm | 컨테이너 삭제 |
docker run | 새로운 컨테이너로 커맨드 실행 |
docker start | 정지 중인 컨테이너 기동 |
docker stop | 실행 중인 컨테이너 중지 |
docker restart | 컨테이너 다시 시작 |
docker kill | 실행 중인 컨테이너(Docker가 만든 PID 1 프로세스)에 신호 보내기 |
단계 1: 새 디렉터리 생성
웹 애플리케이션을 위한 새 디렉터리를 만들고 터미널에서 해당 디렉터리로 이동합니다.
mkdir my-web-app
cd my-web-app
단계 2: 웹 페이지 만들기
다음 내용을 포함하는 index.html 파일을 만듭니다:
<!DOCTYPE html>
<html>
<head>
<title>My Web App</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
단계 3: Dockerfile 만들기
Dockerfile 이라는 이름의 새 파일을 만들고 다음 내용을 입력합니다:
# 공식 Nginx 런타임을 부모 이미지로 사용
FROM nginx:alpine
# 웹 페이지를 컨테이너로 복사합니다.
COPY index.html /usr/share/nginx/html
단계 4: Docker 이미지 빌드
터미널에서 Dockerfile이 있는 디렉터리로 이동하고 다음 명령어를 실행하여 Docker 이미지를 빌드합니다:
docker build -t my-web-app .
-t 플래그는 이미지를 이름으로 태그하기 위해 사용되며, 이 경우 my-web-app로 태그됩니다.
단계 5: Docker 컨테이너 실행
다음 명령을 실행하여 Docker 컨테이너를 시작합니다:
docker run -d -p 80:80 --name my-web-app my-web-app
-d 플래그는 컨테이너를 백그라운드 모드로 실행하고, -p 플래그는 컨테이너의 80번 포트를 호스트 머신의 80번 포트에 매핑합니다.
단계 6: 웹 애플리케이션에 액세스하기
웹 브라우저를 열고 http://localhost로 이동합니다. 페이지에 "Hello, World!" 메시지가 표시됩니다.
이것으로 간단한 웹 애플리케이션을 Docker를 사용하여 만들었습니다.
애플리케이션에 더 많은 파일을 추가하고 Dockerfile을 수정하여 필요에 맞게 변경할 수 있습니다.
단계 7: 컨테이너 멈추기 및 삭제하기
Docker 컨테이너를 종료하고 삭제하려면 다음 명령어를 실행합니다:
docker stop $(docker ps -aqf "name=my-web-app") && docker rm $(docker ps -aqf "name=my-web-app")
이 명령어는 다음과 같은 작업을 수행합니다:
- docker ps -aqf "name=my-web-app": my-web-app 이름을 갖는 모든 컨테이너의 ID를 반환합니다.
- docker stop $(docker ps -aqf "name=my-web-app"): 해당 컨테이너를 모두 중지합니다.
- docker rm $(docker ps -aqf "name=my-web-app"): 해당 컨테이너를 모두 삭제합니다.
이제 컨테이너가 중지되고 삭제되었습니다. 이제 다시 시작하려면 단계 5에서 설명한 명령을 실행하면 됩니다.
--------------------------------------------------------------------------------------------------------
다음은 컨테이너에 들어간 index.html 파일을 수정하고 v2 버전의 이미지를 빌드하는 예제입니다.
단계 8: 웹 페이지 수정
index.html 파일을 다음 내용으로 수정합니다:
<!DOCTYPE html>
<html>
<head>
<title>My Web App v2</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>This is version 2 of my web app.</p>
</body>
</html>
단계 9: Dockerfile 수정
Dockerfile 파일을 다음과 같이 수정하여 새로운 이미지를 빌드할 수 있습니다.
아래와 같은 내용의 이전과 동일한 도커 파일로 빌드를 다시 한번 수행합니다.
# Use an official Nginx runtime as a parent image
FROM nginx:alpine
# Copy the updated web page to the container
COPY index.html /usr/share/nginx/html
단계 10: Docker 이미지 빌드
터미널에서 Dockerfile이 있는 디렉터리로 이동하고 다음 명령어를 실행하여 새 Docker 이미지를 빌드합니다:
docker build -t my-web-app:v2 .
-t 플래그를 사용하여 이미지 이름을 my-web-app 대신 my-web-app:v2로 태그했습니다.
단계 11: Docker 컨테이너 실행
이제 v2 이미지를 사용하여 컨테이너를 실행합니다.
docker run -d -p 80:80 --name my-web-app-v2 my-web-app:v2
단계 12: 웹 애플리케이션에 액세스하기
새로운 버전의 웹 애플리케이션에 액세스하기 위해 웹 브라우저를 열고 http://localhost로 이동합니다. 새로운 버전의 "Hello, World!" 메시지와 추가된 텍스트 "This is version 2 of my web app."가 표시됩니다.
단계 13: 컨테이너 멈추기 및 삭제하기
이전 단계와 동일한 명령을 사용하여 v2 컨테이너를 중지하고 삭제합니다.
docker stop my-web-app-v2 && docker rm my-web-app-v2
이제 컨테이너가 중지되고 삭제되었습니다.
# 자기 주도 과제
이번에는 This is version 1 of my web app. 라고 출력되는 my-web-app 이미지의 v1 버전을 만들어서 실행 시키고 브라우저에서 메시지를 확인하세요.