Directory structure:
└── boostcampwm-2024-web34-learndocker/
├── README.md
├── eslint.config.mjs
├── package.json
├── pnpm-workspace.yaml
├── .prettierignore
├── .prettierrc.json
├── backend/
│ ├── README.md
│ ├── nest-cli.json
│ ├── package.json
│ ├── tsconfig.build.json
│ ├── tsconfig.json
│ ├── public/
│ │ └── test.html
│ ├── src/
│ │ ├── app.module.ts
│ │ ├── main.ts
│ │ ├── common/
│ │ │ ├── constant.ts
│ │ │ ├── auth/
│ │ │ │ ├── auth.guard.ts
│ │ │ │ ├── auth.module.ts
│ │ │ │ └── auth.service.ts
│ │ │ ├── cache/
│ │ │ │ ├── cache.module.ts
│ │ │ │ └── cache.service.ts
│ │ │ ├── decorator/
│ │ │ │ └── hide-in-production.decorator.ts
│ │ │ ├── exception/
│ │ │ │ ├── axios-formatter.ts
│ │ │ │ ├── errors.ts
│ │ │ │ └── filters.ts
│ │ │ ├── logger/
│ │ │ │ ├── config.ts
│ │ │ │ └── middleware.ts
│ │ │ ├── request/
│ │ │ │ ├── request.guard.ts
│ │ │ │ ├── request.interceptor.ts
│ │ │ │ ├── request.module.ts
│ │ │ │ └── request.service.ts
│ │ │ └── types/
│ │ │ ├── request.ts
│ │ │ └── session.ts
│ │ ├── quiz/
│ │ │ ├── quiz.controller.spec.ts
│ │ │ ├── quiz.controller.ts
│ │ │ ├── quiz.entity.ts
│ │ │ ├── quiz.module.ts
│ │ │ ├── quiz.service.spec.ts
│ │ │ └── quiz.service.ts
│ │ └── sandbox/
│ │ ├── constant.ts
│ │ ├── exec.api.ts
│ │ ├── sandbox.controller.ts
│ │ ├── sandbox.module.ts
│ │ ├── sandbox.service.spec.ts
│ │ ├── sandbox.service.ts
│ │ ├── utils.ts
│ │ ├── pipes/
│ │ │ ├── command.pipe.spec.ts
│ │ │ └── command.pipe.ts
│ │ └── types/
│ │ └── elements.ts
│ └── test/
│ ├── app.e2e-spec.ts
│ └── jest-e2e.json
├── frontend/
│ ├── index.html
│ ├── package.json
│ ├── postcss.config.js
│ ├── tailwind.config.js
│ ├── tsconfig.app.json
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ ├── vite.config.ts
│ └── src/
│ ├── App.tsx
│ ├── index.css
│ ├── main.tsx
│ ├── vite-env.d.ts
│ ├── api/
│ │ ├── quiz.ts
│ │ └── timer.ts
│ ├── assets/
│ │ └── docker-architecture.webp
│ ├── components/
│ │ ├── ErrorPage.tsx
│ │ ├── Header.tsx
│ │ ├── PageInfoArea.tsx
│ │ ├── PageType.tsx
│ │ ├── Sidebar.tsx
│ │ ├── StartButton.tsx
│ │ ├── StopButton.tsx
│ │ ├── Timer.tsx
│ │ ├── TimerArea.tsx
│ │ ├── modals/
│ │ │ ├── QuizSubmitResultModal.tsx
│ │ │ └── TimerModal.tsx
│ │ ├── popover/
│ │ │ ├── ContainerPopover.tsx
│ │ │ └── ImagePopover.tsx
│ │ ├── quiz/
│ │ │ ├── QuizButtons.tsx
│ │ │ ├── QuizDescription.tsx
│ │ │ ├── QuizInputBox.tsx
│ │ │ ├── QuizNodes.tsx
│ │ │ ├── QuizPage.tsx
│ │ │ ├── QuizPageWrapper.tsx
│ │ │ ├── QuizSubmitArea.tsx
│ │ │ ├── VisualizationNodes.tsx
│ │ │ └── XTerminal.tsx
│ │ ├── staticpages/
│ │ │ ├── DockerContainerLifeCyclePage.tsx
│ │ │ ├── DockerContainerPage.tsx
│ │ │ ├── DockerImagePage.tsx
│ │ │ ├── DockerPage.tsx
│ │ │ └── LandingPage.tsx
│ │ └── visualization/
│ │ ├── Arrow.tsx
│ │ ├── ArrowAnimation.tsx
│ │ ├── BaseNode.tsx
│ │ ├── ContainerNode.tsx
│ │ └── DockerVisualization.tsx
│ ├── constant/
│ │ ├── hostStatus.ts
│ │ ├── quiz.ts
│ │ ├── sidebarStatus.ts
│ │ ├── timer.ts
│ │ ├── visualization.ts
│ │ └── xterm.ts
│ ├── handlers/
│ │ └── handler.ts
│ ├── hooks/
│ │ ├── useAlert.ts
│ │ ├── useDockerVisualization.ts
│ │ ├── useHostStatus.ts
│ │ ├── useQuizData.ts
│ │ ├── useSidebar.ts
│ │ └── useTerminal.ts
│ ├── types/
│ │ ├── quiz.ts
│ │ ├── sidebar.ts
│ │ ├── timer.ts
│ │ └── visualization.ts
│ └── utils/
│ ├── LoadingTerminal.ts
│ ├── sidebarUtils.ts
│ ├── terminalUtils.ts
│ └── visualizationUtils.ts
├── sandbox/
│ ├── setup.ps1
│ ├── setup.sh
│ ├── host-container/
│ │ ├── docker-compose.yml
│ │ └── Dockerfile
│ ├── quiz-images/
│ │ ├── hello-world/
│ │ │ ├── Dockerfile
│ │ │ └── hello.c
│ │ └── joke/
│ │ ├── Dockerfile
│ │ └── joke.c
│ └── registry/
│ └── docker-compose.yml
└── .github/
└── pull-request-template.md