루트 없이 Docker에 Vue 앱 배포

따라서 Docker 컨테이너에 Vue 앱을 배포할 것입니다. 대단하다!! 컨테이너는 앱을 배포하는 환상적인 방법입니다. Vue 앱을 배포할 때 웹 서버로 nginx을 선택합니다. nginx는 Dockerhub의 Docker 이미지로 제공되므로 시작하기 위해 많은 작업을 수행할 필요가 없습니다. 불행히도 기본 구현은 루트 사용자의 컨텍스트에서 실행됩니다. 이는 특히 컨테이너가 위반되는 경우 보안 문제가 될 수 있습니다. 공격자는 이제 루트로 실행 중입니다.

안타깝게도 Dockerfile에서 사용자를 변경하는 것만큼 간단하지 않습니다. nginx 이미지가 루트로 실행되는 이유는 Linux에서 포트 80 또는 443에서 앱을 실행하려면 사용자가 루트여야 하기 때문입니다. 이를 가능하게 하기 위해 컨테이너를 변경할 수 있지만 변경 사항이 복잡합니다. 운 좋게도 우리는 컨테이너를 사용하고 있으므로 컨테이너에서 웹 서버가 실행되는 실제 포트는 관련이 없습니다. 따라서 다른 포트(예: 8080)에서 루트가 아닌 사용자의 컨텍스트에서 앱을 실행할 수 있습니다. 컨테이너를 실행할 때 앱을 인터넷에 직접 노출해야 하는 경우 프로덕션 배포를 위해 포트 80 또는 443에 다시 매핑할 수 있습니다. 제 경우에는 SSL/TLS 인증서가 리버스 프록시 또는 Kubernetes 인그레스에서 호스팅되므로 Docker 이미지에 인증서를 포함하지 않습니다.

가장 먼저 변경해야 할 것은 nginx의 기본 구성 파일입니다. 이번에는 8080이 될 것입니다. 나머지 구성은 기본 설정이지만 앱을 포트 443에 직접 노출하는 경우에는 있을 수 있습니다.

server {
  listen 8080;
  server_name localhost;

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    try_files $uri $uri/ /index.html;
  }

  error_page 400 500 502 503 504 /50x.html;
  location = /50x.html {
    root /usr/share/nginx/html;
  }
}


다음으로 nginx가 실행되는 사용자 컨텍스트를 변경해야 합니다. 운 좋게도 nginx 사람들은 이에 대해 생각했고 이미 기본 컨테이너에 바로 nginx라는 사용자를 만들었으므로 시스템 수준의 사용자 구성이 필요하지 않습니다. 전체 Dockerfile은 다음과 같습니다.

FROM nginx:1.19

RUN rm -f /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d

RUN chown -R nginx:nginx /var/cache/nginx && \
    chown -R nginx:nginx /var/log/nginx && \
    chown -R nginx:nginx /etc/nginx/conf.d

RUN touch /var/run/nginx.pid && \
    chown -R nginx:nginx /var/run/nginx.pid

USER nginx

COPY dist /usr/share/nginx/html

EXPOSE 8080


Dockerfile의 관련 부분을 살펴보겠습니다. nginx 사용자가 로깅, 캐싱 및 구성과 프로세스 ID 파일에 대한 소유권을 가져야 하는 몇 가지 디렉토리가 있습니다.

RUN chown -R nginx:nginx /var/cache/nginx && \
    chown -R nginx:nginx /var/log/nginx && \
    chown -R nginx:nginx /etc/nginx/conf.d

RUN touch /var/run/nginx.pid && \
    chown -R nginx:nginx /var/run/nginx.pid


다음에 사용자 컨텍스트를 설정하므로 nginx는 이 사용자 아래에서 실행됩니다.

USER nginx


그런 다음 Dockerfile은 dist 폴더의 내용을 이미지에 복사합니다. 다음은 npm으로 Vue 앱을 빌드한 결과입니다.
COPY dist /usr/share/nginx/html
마지막으로 80 또는 443이 될 수 없는 포트를 설정합니다.

EXPOSE 8080


이제 Dockerfile은 루트 권한으로 실행되지 않는 컨테이너를 생성하도록 설정되었습니다. 이 앱은 Docker, Kubernetes 인그레스 또는 리버스 프록시를 사용하여 80 또는 443 이상을 실행할 수 있으며 기본값을 사용하는 것보다 위험이 적습니다.

좋은 웹페이지 즐겨찾기