개발/Server

[Docker][docker-compose] Nginx 컨테이너 생성 및 설정

leebera_ 2022. 4. 28. 04:41

이 글에선 mount, port 설정의 편의를 위해 단일 컨테이너를 생성하더라도 docker-compose를 사용한다.

 

docker-compose.yaml

version: "3.9"

services:
  nginx:
    image: nginx:1.23.2
    ports:
      - "80:80"
    environment:
      - TZ=Asia/Seoul
    # volumes:
    #   - ./nginx.conf:/etc/nginx/nginx.conf

ports는 "호스트포트:컨테이너포트" 형식이므로 "80:80"으로 설정한다. nginx에서 기본적으로 설정되어있는 포트가 80이므로 80을 연결한다. 이말은 설정에서 변경시키면 바꿔도 상관없다는 말이다. 호스트도 겹치지 않는 다른 포트로 설정해도 된다.

environment는 컨테이너 생성 시 설정될 환경 변수를 작성하는 블록이다. timezone을 기본적으로 서울로 설정하기 위해 추가해뒀다. (환경 변수가 많아 줄이고 싶거나 드러나면 안되서 보여주지 않고 설정하고 싶다면 .env와 같은 파일에 이름=값 형태로 환경 변수 하나당 한 줄씩 입력하고 env_file 블록을 nginx블록의 하위에 새로 넣고 해당 블록 하위에에 추가한다.)

volumes가 주석처리 되어있다. 이는 처음엔 nginx.conf 파일이 없는데 이 상태에서 실행시키면 기본적으로 디렉터리를 만들고 연결한다. 당연히 컨테이너 내의 nginx.conf는 파일이기 때문에 주석이 없는 상태로 실행하면 디렉터리가 아니라는 에러를 뱉는다.

먼저 위 파일이 있는 위치에서 docker-compose up -d로 컨테이너를 실행시킨 뒤 먼저 conf파일을 컨테이너에서 가져와야 한다. 아래 명령을 실행하자.

docker cp 컨테이너이름:/etc/nginx/nginx.conf ./

 

이제 docker-compose에서 주석처리되어있던 volumes와 그 밑의 줄 모두 해제하고 다시 실행해보면 똑같이 동작할 것이다.

다른 점은 호스트에 복사해둔 nginx.conf를 수정하면 컨테이너의 nginx.conf가 수정되는 것과 똑같아진다.

여기선 파일 하나를 연결하는 것만 다뤘지만 volumes 주석 이유를 말했을 때 기본적으로 디렉터리를 연결한단 점을 생각해서 html파일들을 넣기위해 디렉터리를 연결할 수도 있다. (nginx의 index.html 기본 위치는 /usr/share/nginx/html)