본문 바로가기
Infra, Cloud/Docker

[Docker] Nginx 환경 구축

by J4J 2022. 2. 1.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 Nginx 환경 구축하는 방법에 대해 적어보는 시간을 가져보려고 합니다.

 

 

 

들어가기에 앞서 다음 글을 참고하시면 좋을 것 같습니다.

 

 

 

 

Nginx 환경 구축 방법

 

[ 1. 도커 설치 ]

 

위에 링크를 걸어둔 [Docker] MySQL 환경 구축을 참고해주시길 바랍니다.

 

 

 

[ 2. Dockerfile 작성 ]

 

Nginx를 위한 폴더를 하나 만들고 그 내부에 Dockerfile이라는 이름의 파일을 하나 생성해줍니다.

 

Dockerfile은 Nginx가 실행되는 환경을 커스텀하는 파일로 Nginx의 기본 설정이 담겨있는 이미지를 가져와 자유롭게 커스텀해줄 수 있습니다.

 

그리고 작성한 Dockerfile로 새로운 이미지를 만들어줄 수 있고 이를 이용해 Docker Container를 생성하고 실행해줄 수 있습니다.

 

저는 가볍게 Dockerfile에 다음과 같이 작성해주도록 하겠습니다.

 

# nginx 이미지 불러오기
FROM nginx:latest

# 데몬으로 실행(백그라운드에 접속하지 않고 실행하라고만 함) (컨테이너 실행할 때 동작)
CMD ["nginx", "-g", "daemon off;"]

 

 

 

[ 3. Dockerfile로 이미지 만들기 ]

 

현재 제 폴더 구성은 다음과 같습니다.

 

폴더 구성

 

 

 

Dockerfile이 있는 경로로 이동해야 되기 때문에 터미널에서 nginx폴더로 이동해줍니다.

 

그 뒤 다음 명령어를 이용해 이미지를 빌드해줍니다.

 

$ docker build -t web-img . // .경로에 있는 Dockerfile을 이용하여 web-img라는 이름의 이미지로 빌드하기

 

 

반응형

 

 

여러 설치작업이 이루어지게 되고 정상적으로 동작이 완료되었다면 다음 명령어를 통해 web-img라는 이름의 이미지가 생성된 것을 확인할 수 있습니다.

 

$ docker images

 

 

 

[ 4. Docker Container 생성 및 실행 ]

 

위에서 생성한 이미지를 이용해서 Docker Container 생성 및 실행을 해보겠습니다.

 

$ docker run --name web-con -p 80:80 -d web-img
// --name web-con: 컨테이너 이름을 web-con으로 지정
// -p 80:80: 포트 설정, 컨테이너 외부에서 80포트로 들어오는 것은 컨테이너 내부의 80포트가 동작
// -d: 데몬으로 실행 (컨테이너에게 실행하라고 명령만 보내기)
// web-img: web-img라는 이름의 이미지를 이용하여 컨테이너 생성 및 실행

 

 

 

문제없이 정상동작 되었다면 다음 명령어를 통해 web-con이라는 Docker Container가 생성된 것을 확인할 수 있습니다.

 

$ docker ps -a

 

Container 실행 확인

 

 

 

테스트

 

위의 모든 과정이 이루어졌다면 http://localhost에 접속할 경우 Nginx 초기 화면이 보이는 것을 확인할 수 있습니다.

 

Docker 실행 결과

 

 

 

만약 정상적으로 보이지 않는다면 다음 명령어를 이용해 어떤 문제가 발생했는지 확인 후 해결하시면 될 것 같습니다.

 

$ docker logs web-con // 지금까지 동작된 것 확인
$ docker logs -f web-con // 강제 종료할 때까지 컨테이너에서 동작되는 모든 로그 즉각 확인

 

 

 

volume을 이용한 설정 파일 추가

 

위의 설정들로 Nginx Docker Container를 생성한 뒤 다음 명령어를 통해 bash shell로 접속해서 Nginx 설정 파일을 변경해줄 수 있습니다.

 

$ docker exec -it web-con /bin/bash // bash shell 접속

 

 

 

하지만 여기서 문제점은 Container가 삭제된다면 설정한 파일들도 같이 삭제가 된다는 것입니다.

 

그렇기 때문에 volume을 이용해 Container 내부와 Container 외부를 서로 연결해주는 것이 좋습니다.

 

연결이 된다면 Container가 삭제되더라도 파일은 유지되어 있고 또한 다시 새로운 Ngnix Container를 생성하더라도 동일한 환경을 세팅해줄 수 있습니다.

 

 

728x90

 

 

[ 1. nginx.conf 파일 생성 ]

 

volume을 이용하기 위해 위의 nginx폴더 내부에 nginx_local.conf라는 파일을 생성한 뒤 다음과 같이 작성해보겠습니다.

 

user nginx;
worker_processes 1;

pid /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    access_log    /var/log/nginx/access.log;
    error_log     /var/log/nginx/error.log;

    include       /etc/nginx/mime.types;
    charset       utf-8;

    server {
        server_name {서버 이름};

        # SpringBoot 접근
        location ~ \.do$ {
            proxy_pass         http://{PC IP}:8080;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # Next 접근
        location / {
            proxy_pass         http://{PC IP}:8088;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    
    sendfile        on;

    keepalive_timeout  65;
}

 

폴더 구성

 

 

 

저는 여기서 상단에 링크를 걸어둔 SpringBoot와 Next가 배포되는 환경을 세팅하려고 합니다.

 

그래서 SpringBoot에 접근되는 location과 Next에 접근되는 location을 설정을 했습니다.

 

위의 파일은 참고만 해주시고 각자 배포되는 환경에 맞게 세팅해주시면 될 것 같습니다.

 

 

 

또한 여기서 한 가지 더 알고 가셔야 될 점은 {PC IP} 쪽에 localhost로 지정하시면 정상 동작하지 않습니다.

 

왜냐하면 다음과 같은 환경으로 구성되기 때문입니다.

 

Docker 배포 환경

 

 

 

 

Docker Container는 자체적으로 OS환경이 구성되기 때문에 그 내부에 배포된 Nginx에서 localhost는 Container 내부를 의미합니다.

 

그렇기 때문에 다른 Container에 배포되어 있는 서비스들은 localhost로 접근할 수 없습니다.

 

그러므로 localhost로 사용하시지 말고 PC IP를 직접 입력해서 해결해주시면 됩니다.

 

 

 

[ 2. 기존 생성된 컨테이너 삭제 ]

 

$ docker rm -f web-con

 

 

 

[ 3. 기존 생성된 이미지로 Docker Container 생성 및 실행 ]

 

$ docker run --name web-con -v ${pwd}/nginx_local.conf:/etc/nginx/nginx.conf -p 80:80 -d web-img
// --name web-con: 컨테이너 이름을 web-con으로 지정
// -v ${pwd}/nginx_local.conf:/etc/nginx/nginx.conf: 볼륨 설정, 컨테이너 외부의 (현재 경로/nginx_local.conf)와 컨테이너 내부의 (/etc/nginx/nginx.conf)를 연결
// -p 80:80: 포트 설정, 컨테이너 외부에서 80포트로 들어오는 것은 컨테이너 내부의 80포트가 동작
// -d: 데몬으로 실행 (컨테이너에게 실행하라고 명령만 보내기)
// web-img: web-img라는 이름의 이미지를 이용하여 컨테이너 생성 및 실행

 

 

테스트

 

위의 설정이 모두 완료되었다면 [Docker] Next 환경 구축에서 보여주던 화면이 보이는 것을 확인할 수 있습니다.

 

Docker 실행 결과

 

 

 

 

 

 

 

이상으로 Nginx 환경 구축하는 방법에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글