Docker&Container

Docker&Container - Network 1. nginx 만들기

hminor 2024. 12. 14. 23:27
반응형

nginx 만들기

  • 컨테이너 간 통신하는 방법
    • Reverse Proxy
      • 서버로 들어오는 요청 가로채는 프로그램
      • Web Server와 함께 사용할 것임
      • 순서
        • 클라이언트가 Reverse Proxy로 들어오게 되면
        • Reverse Proxy가 Web Server로 안내
      • 사용 이유(장점)
        • 서버 정보를 숨길 수 있음
        • https 인증서 설치가 쉬움
        • 로드밸런싱 가능
        • 로그 남기기
        • IP차단
      • 종류
        • Nginx
        • caddy
  • Nginx 로컬 설치 및 셋팅
    • NginX 실행 순서
      • Nginx 설치
        • 도커를 사용할 것이기에 우선 패스
      • Nginx 설정 파일 작성
        • Docker 폴더에 폴더와 파일 생성
          • ex) nginx/myconfig1.conf
        • 이후 nginx 문법에 맞게 설정 코드를 작성해야 함.
          • 다만 따로 배운 적이 없기에 아래와 같이 우선 작성
          • 간단히 설명하자면
            • listen 80 ← 80 포트로 들어오면
            • location ← 해당 코드를 실행해라는 의미
              • 여기서 / 는 모든 경로 접속 시를 의미
              • 그리모 http://localhost:8080 여기로 보내기
              • 아래 코드는 웹서버에 도움되는 유저의 부가 정보 채워서 보내라는 의미
              server {
                      listen 80;
                      location / {
                          proxy_pass <http://localhost:8080>;
                          proxy_set_header Host $host;
                          proxy_set_header X-Real-IP $remote_addr;
                          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                          proxy_set_header X-Forwarded-Proto $scheme;
                      }
              }
              
              
              • 리눅스의 경우엔
                • /etc/nginx/conf.d 폴더에 해당 파일을 넣으면 된다고 함
                • 그리고 기존 폴더에 default.conf 파일이 있는데
                  • 우선 순위가 기존 파일이 더 높기에
                  • 삭제 후 새롭게 작성한 파일을 넣으면 됨.
                • 이후 nginx -g daemon off; 를 터미널에 입력하면 nginx 실행됨
      • Nginx 실행 명령어 입력
    • 코드 작성하기
      • 생성한 nginx 폴더에 Dockerfile 만들기
        • 이후 해당 파일에 아래와 코드 작성
          • 코드 설명
            • FROM docker에서 nginx 이미지 불러오기
            • COPY로 우리가 만든 myconfig1.conf 를 특정 경로로 옮기기
            • 기존 conf 파일을 지우기 위해 RUN 사용
            • EXPOSE로 특정 포트 열기
            • CMD로 실행 명령어 작성
              • 코드 설명
                • nginx
                  • Nginx 웹 서버 실행 명령어
                • -g
                  • 글로벌 설정으로, 뒤에 오는 설정은 모든 Nginx 설정 파일에 영향을 미침
                • daemon off;
                  • Nginx는 기본적으로 데몬 모드(백그라운드 실행)으로 동작
                  • Docker 컨테이너는 포그라운드에서 실행되는 프로세스를 필요로 하기에, daemon off; 를 설정하여 데몬 모드로 전환되지 않고, 포그라운드에서 실행되도록 함.
                    • 포그라운드 프로세스란?
                      • 현재 사용자의 터미널(콘솔)과 직접 연결된 상태에서 실행되는 프로세스를 의미
                      • 즉, 실행 결과가 즉시 화면에 출력됨.
                      • 프로세스가 종료될 때까지 터미널 제어권을 유지
                      • 예를 들어, 터미널에서 실행한 명령어가 작업을 마칠 때까지 기다리는 상태.
                    • 기존 데몬 모드(백그라운드 프로세스)란?
                      • 사용자의 터미널과 분리된 상태로 실행되는 프로세스
                      • 즉, 실행 결과는 화면에 출력X, 로그도 별도 저장
                      • 프로세스가 독립적으로 실행되며, 사용자는 터미널 다른 작업을 할 수 있음.
                    • 쉽게 이해하자면, 데몬 모드로 실행하면 컨테이너가 실행 중단된 것으로 간주되기에, 컨테이너가 바로 종료됨.
                  • 이렇게 하면 Dcoker가 Nginx 프로세스를 주 프로세스로 인식하고, 컨테이너가 종료되지 않으며 정상적으로 동작.
            FROM nginx:1.27.2-alpine
            
            COPY ./myconfig1.conf /etc/nginx/conf.d/myconfig1.conf
            RUN rm /etc/nginx/conf.d/default.conf
            
            EXPOSE 80
            CMD ["nginx", "-g", "daemon off;"]
            
    • 실행하기
      • 터미널에서 이미지 만들기
        • docker build -t nginx:1 ./nginx
      • 생성한 nginx 이미지 실행
        • option에서 Host port를 80 으로 변경 후 실행
      • 이후 이전 생성한 nodeserver인 web server를 실행
        • option에서 Host port를 myconfig1.conf에서 설정한 것처럼 8080으로 변경 후 실행
      • 다만 nginx 서버에서 80 포트로 접속하면
        • nodeserver 서버인 8080 포트로 안내가 되어야 하는데 안됨
      • 이유?
        • 현재 나의 컴퓨터(Host)에선 아래와 같이 2개의 가상 컴퓨터가 있음
        • 다만
          • 가상 컴퓨터1에는
            • 8080 포트도 뚫려있지 않고
            • 8080 포트에서 실행중인 서버도 없기에 동작을 안함
          • 가상 컴퓨터2에 뚫려 있고, 실행중인 8080서버와는 완전히 구분된 별도의 컴퓨터
      • 해결 방법
        • 가상 컴퓨터1(nginx, 80)
        • 안전하며, 간단한 방법
          • network 내에 컨테이너를 넣으면 가상 IP 주소를 부여함
            • 따라서 가상 컴퓨터1,2 를 함께 넣어서 관리
            • 같은 네트워크 내에선
              • 가상 IP주소가 생기기에 가상 컴퓨터끼리 통신이 가능.