Skip to content

Nginx 컨테이너

Nginx 컨테이너화하기 앞서

Nginx 컨테이너는 Github의 Webhooks 기능을 활용해 jenkins로 자동 배포하여 컨테이너화할 예정입니다. 이 포스트에서는 Nginx 프로젝트의 구조 및 Dockerfile과 jenkin Shell 스크립트 내용을 다룹니다.

지난 포스트인 Jenkins 컨테이너와 달리 Nginx 컨테이너는 설정 파일(nginx.conf 등) 수정이 자주 이뤄지므로 배포 때마다 Docker 이미지 빌드, 새 컨테이너가 구동되도록 하였습니다.

Nginx 컨테이너와 Jenkins 컨테이너 얽힘 문제

Jenkins 서비스 역시 Nginx 컨테이너를 통해 외부로 제공되기 때문에 구동 중인 Nginx 컨테이너가 중지(배포 시)될 때 Jenkins가 외부와 연결이 잠깐 끊기는 현상(502)이 발생합니다.

  • 이는 단순히 Nginx 프락시 연결이 외부와 끊길 뿐, 구동되는 Jenkins 빌드에는 영향을 주지 않습니다.

Nginx 프로젝트 구조

Nginx 프로젝트는 원하는 사이트 구성

  • 하나의 설정 파일로 사용
  • 각 사이트의 파일을 만들어 include or ...

등등 원하는 구조로 구성하면 됩니다.

주의

잘못된 설정 파일 문제(오타 포함)로 Nginx 컨테이너를 시작하지 못하게 되면 Jenkins 서비스 또한 외부와 연결이 끊겨 Github webhook을 사용할 수 없기 때문에 항상 로컬 테스트를 거친 후 배포하시기 바랍니다.

nginx
│  .dockerignore
│  Dockerfile
│  nginx.conf

├─conf.d
│      default.conf
│      jenkins.conf
│      tradurs.back.conf
│      tradurs.d4.conf
│      tradurs.front.conf

└─security
        general.conf

Nginx Dockerfile 작성

Nginx Docker 빌드에 사용될 Dockerfile을 작성합니다.

Dockerfile?

dockerfile
FROM nginx:1.26.0-alpine

WORKDIR /etc/nginx

COPY . .

EXPOSE 80

ENTRYPOINT ["nginx", "-g", "daemon off;"]
구문설명
FROM nginx:1.26.0-alpinenginx:1.26.0-alpine 이미지를 바탕으로 Docker 이미지를 생성합니다.
WORKDIR /etc/nginxNginx 컨테이너 내부 작업 경로를 지정합니다.
COPY . .미리 준비한 Nginx 설정 파일들을 작업 경로로 복사합니다.
EXPOSE 80Nginx 컨테이너가 외부 호스트와 연결될 포트를 명시합니다.
ENTRYPOINT ["nginx", "-g", "daemon off;"]Nginx 서버를 구동합니다.
daemon off는 nginx 서버가 foreground로 실행되도록 하는 명령어입니다. 이를 지정하지 않으면 해당 컨테이너에 --detach 옵션으로 접근하더라도 서버가 중지됩니다.

Jenkins Nginx Shell 설정

Jenkins의 nginx 프로젝트 설정으로 이동해 Build StepsExecute Shell을 작성합니다.

shell
cd /var/jenkins_home/workspace/nginx
docker build --no-cache --tag nginx:host .
docker stop "nginx-host" || true
docker rm -f "nginx-host" || true
docker container run --detach --restart always --cpuset-cpus="0" --cpu-shares="1024" --memory="500m" --memory-swap="1g" --publish 80:80 --volume /var/jenkins_home:/var/jenkins_home --add-host=host.docker.internal:host-gateway --env TZ=Asiz/Seoul --name "nginx-host" nginx:host
docker system prune -f
docker buildx prune -f
구문설명
cd /var/jenkins_home/workspace/nginx호스트 볼륨의 nginx 작업 경로로 이동합니다.
docker build ...Dockerfile에 작성된 스크립트대로 Docker 이미지를 만듭니다.
docker stop ...기존에 구동 중인 nginx 컨테이너를 중지합니다.(없는 경우 true로 통과)
docker rm ...기존에 생성된 nginx 컨테이너를 삭제합니다.(없는 경우 true로 통과)
docker container run ...새 nginx 이미지를 이용해 컨테이너를 구동합니다.

--detach : 비 연결 구동
--restart : 재시작 설정
--cpuset-cpus : 할당 CPU 번호
--cpu-shares : 할당 CPU 상대적 가중치
--memory : 메모리 한도
--memory-swap : 스왑 메모리 한도
--publish : 호스트에 게시되는 포트 정의(외부:내부)
--volume : 호스트와 공유 경로(호스트:컨테이너)
--add-host : 컨테이너에서 호스트(인스턴스)로 접근할 때 사용할 host명 정의
--env : 환경 변수(TimeZone)
--name : 컨테이너 이름
docker system prune -fDocker 이미지 및 컨테이너를 정리합니다.
docker buildx prune -fDocker 빌드 캐시를 정리합니다.

마지막으로 Nginx의 소스를 git push 하여 Jenkins를 통해 정상적으로 자동 배포되는지 확인하면 됩니다.

Made with VitePress.