이번 주차부터는 본격적으로 인프라다운(!) 주제를 공부해볼 거예요. 요즘 배포할 때 빼놓을 수 없는 Docker는 응용프로그램을 격리해주는 컨테이너를 관리해줍니다. 가볍고 빠른 가상머신으로 생각하면 될 거예요.

이번 주차에는 Docker가 무엇인지와 왜 쓰는지를 이해하고, Docker CLI와 Docker Compose로 컨테이너를 관리해볼 거예요.

공부할 내용 📚

1. Docker

서버를 배포할 때 가장 문제를 많이 일으키는 부분 중 하나는 개발 환경과 서버 환경의 차이입니다. 이를 막기 위해서 기존에는 VMWare 같은 가상 머신을 주로 사용하였다면, 요즘은 더 빠르고 가벼운 컨테이너인 Docker를 많이 사용합니다. Docker는 환경 문제나 보안, 성능 등 다양한 문제를 해결해줍니다.

우선 Docker 설치 가이드를 참고해서 설치해주세요.

  • Docker가 무엇인지, 기존의 가상머신과의 차이점을 이해합니다.
  • Docker CLI를 이용하여 컨테이너를 관리하는 방법을 배웁니다.
    (알아볼 명령어: run, ps, stop, rm, exec, logs, images, pull)
  • Docker Compose를 이용하여 여러 컨테이너를 관리하는 방법을 배웁니다.
    (알아볼 속성: image, build, command, ports, volumes, environment, depends_on, restart, networks)
  • Dockerfile을 이용하여 이미지를 만들고 배포해봅니다.
    (알아볼 속성: FROM, RUN, COPY, CMD, ENV, WORKDIR, ENTRYPOINT, ADD, HEALTHCHECK)

참고 자료

2. Nginx

Nginx는 웹 서버로, 요즘은 대부분의 서버가 Nginx를 사용합니다. Nginx는 매우 빠르고 확장성이 좋아서 많이 사용됩니다. Nginx의 주 용도인 reverse proxy와 load balancing을 배우고, Nginx를 설정하는 방법을 알아봅니다.

  • Nginx의 역할과 특징을 이해합니다.
  • Proxy(reverse vs. forward)와 Load Balancing의 개념을 이해합니다.
  • Nginx를 설치하고 설정하는 방법을 배웁니다.

참고 자료

더 공부하면 좋을 서비스: Caddy (선택)

Caddy는 Nginx보다 사용하기 쉽고 빨라요! 스꾸딩에서도 최근부터 Caddy를 사용하고 있어요. 다만 Nginx에 비해 검색할 수 있는 자료가 적어서, 입문자가 배우기에 조금 더 적합한 Nginx를 스터디 내용에 넣었습니다. Caddy에 관심이 있다면 공부해보면 좋고, 실습도 Caddy로 구현하면 더 좋습니다! (Caddy 공식 문서)

프로젝트 실습 🎈

지난 번에 만든 Express 어플리케이션을 Dockerize(Docker Image를 만들어서 배포)해봅니다. Express만 Dockerize하면 재미없죠…! Nginx도 Dockerize해서 Express 앞에 두고, Nginx가 Express로 요청을 전달하도록 설정해봅니다. (Reverse Proxy로 쓸 거예요!)

flowchart LR
  subgraph Docker Compose
    Nginx -- localhost:3000 --> Node.js
  end
  Client -- localhost:8000 --> Nginx
  • docker-compose.yml 파일을 작성해주세요.
  • Express 어플리케이션을 수정해주세요!
    • Express 어플리케이션의 포트를 3000번으로 변경해주세요.
    • HTML을 반환하는 endpoint는 없애주세요. Nginx가 HTML을 반환하도록 해주세요! (GET /)
  • Express 어플리케이션을 Dockerize합니다. 공식 Node.js Docker Image를 Dockerfile에서 FROM으로 사용해주세요.
  • Nginx 이미지는 공식 이미지를 그대로 사용하면 됩니다. nginx.conf와 index.html 파일을 볼륨으로 연결해주세요. (week2.html의 이름을 변경해주세요!)

Challenge! 🔥 (선택)
Express 컨테이너를 두 개 띄우고, Nginx(또는 Caddy)에서 load balancing 기능을 사용해보세요.
Hint: Node.js의 포트를 외부로 노출하면 충돌이 나겠죠? 노출시키지 않고 컨테이너끼리 요청을 주고받는 방법을 알아보세요!

flowchart LR
  subgraph Docker Compose
    Nginx -- localhost:3000 --> A("Node.js(1)")
    Nginx -- localhost:3000 --> B("Node.js(2)")
  end
  Client -- localhost:80 --> Nginx