블로그 | NGINX

Docker를 사용하여 NGINX 및 NGINX Plus 배포

NGINX-F5-수평-검정-유형-RGB의 일부
릭 넬슨 썸네일
릭 넬슨
2022년 12월 16일 게시

편집기 - DebianAlpine Linux 용 NGINX Plus Dockerfiles는 최신 NGINX Plus 릴리스와 해당 운영 체제 배포판의 버전에 맞게 2022년 12월에 업데이트되었습니다. Dockerfiles 와 지침은 NGINX Plus 이미지를 빌드할 때 Docker 비밀을 사용하여 라이선스 정보를 전달합니다.

Docker는 분산형 애플리케이션을 컨테이너 (애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 가볍고 독립형 실행 가능 소프트웨어 패키지)로 빌드, 배송, 실행하기 위한 개방형 플랫폼입니다. 컨테이너는 Kubernetes 와 같은 컨테이너 오케스트레이션 플랫폼을 통해 배포되고 오케스트레이션될 수 있습니다. (이 블로그에서 설명하는 Docker 컨테이너 기술 외에도 NGINX는 NGINX 오픈 소스 기반 및 NGINX Plus 기반 버전의 F5 NGINX Ingress Controller를 제공합니다. NGINX Plus 구독자에게는 추가 비용 없이 지원이 제공됩니다.)

소프트웨어 애플리케이션인 NGINX 오픈 소스F5 NGINX Plus는 Docker의 훌륭한 사용 사례이며, Docker 이미지 저장소인 Docker HubNGINX 오픈 소스 이미지를 게시합니다. 이 게시물에서는 다음 방법을 설명합니다.

소개

Docker 오픈 플랫폼에는 컨테이너를 빌드, 실행, 조율하는 오픈 소스 런타임인 Docker Engine과 Docker화된 애플리케이션을 전체 개발 커뮤니티 또는 특정 조직의 범위 내에서 배포, 공유, 협업할 수 있는 호스팅 서비스인 Docker Hub가 포함됩니다.

Docker 컨테이너를 사용하면 개발자는 인프라의 제약에서 애플리케이션을 분리하여 애플리케이션 "콘텐츠"에 집중할 수 있습니다. Docker화된 애플리케이션은 노트북, 베어 메탈 서버, VM 또는 클라우드 등 모든 인프라에 즉시 이식 가능하므로 손쉽게 조립 및 재조립하여 완전한 기능을 갖춘 분산 애플리케이션으로 만들고 실시간으로 지속적으로 혁신할 수 있는 모듈식 구성 요소입니다.

Docker에 대한 자세한 내용은 Why Docker? 또는 전체 Docker 문서를 참조하세요.

NGINX 오픈 소스 Docker 이미지 사용

Docker Hub의 NGINX 오픈 소스 이미지를 사용하여 Docker 컨테이너에서 NGINX 인스턴스를 생성할 수 있습니다.

매우 간단한 예로 시작해 보겠습니다. 컨테이너에서 실행 중인 NGINX 인스턴스를 시작하고 기본 NGINX 구성을 사용하려면 다음 명령을 실행하세요.

# docker 실행 --이름 mynginx1 -p 80:80 -d nginx fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d

이 명령은 NGINX 이미지를 기반으로 mynginx1 이라는 컨테이너를 생성합니다. 이 명령은 로그 파일 이름에 사용되는 컨테이너 ID의 긴 형식을 반환합니다. 로깅 관리를 참조하세요.

-p 옵션은 Docker에게 NGINX 이미지에서 컨테이너에 노출된 포트(포트 80)를 Docker 호스트의 지정된 포트에 매핑하라고 알려줍니다. 첫 번째 매개변수는 Docker 호스트의 포트를 지정하고, 두 번째 매개변수는 컨테이너에 노출된 포트에 매핑됩니다.

-d 옵션은 컨테이너가 분리 모드로 실행되도록 지정합니다. 즉, 컨테이너는 중지될 때까지 계속 실행되지만 명령줄에서 실행되는 명령에는 응답하지 않습니다. 다음 섹션 에서는 컨테이너와 상호작용하는 방법을 설명합니다.

컨테이너가 생성되었고 실행 중인지 확인하고 포트 매핑을 보려면 docker ps 를 실행합니다. (여기서는 읽기 쉽도록 출력을 여러 줄로 나누었습니다.)

# docker ps 컨테이너 ID 이미지 명령이 생성됨 ... fcd1fb01b145 nginx:latest "nginx -g '16초 전의 데몬 ... ... 상태 포트 이름 ... 최대 15초 0.0.0.0:80->80/tcp mynginx1

출력의 PORTS 필드는 Docker 호스트의 포트 80이 컨테이너의 포트 80에 매핑되었음을 보고합니다. NGINX가 실행 중인지 확인하는 또 다른 방법은 해당 포트로 HTTP 요청을 하는 것입니다. 기본 NGINX 시작 페이지의 코드가 나타납니다.

# 컬 http://localhost<!DOCTYPE html>
<html>
<head>
<title>nginx에 오신 것을 환영합니다!</title>
<style>
body {
width: 35em; 여백: 0 자동; 글꼴 패밀리: Tahoma, Verdana, Arial, sans-serif; } 추가 구성이 필요합니다.

NGINX Docker 컨테이너 작업

이제 작동하는 NGINX Docker 컨테이너가 있지만 콘텐츠와 NGINX 구성은 어떻게 관리할까요? 그럼 벌목은 어떤가요?

SSH에 대한 참고 사항

NGINX 인스턴스에 SSH 액세스를 활성화하는 것은 일반적이지만, Docker 컨테이너는 일반적으로 단일 목적(이 경우 NGINX 실행)을 위해 만들어졌기 때문에 NGINX 이미지에는 OpenSSH가 설치되어 있지 않습니다. 대신 Docker가 지원하는 다른 방법을 사용하겠습니다.

아래의 콘텐츠 및 구성 파일 관리 에 있는 명령 대신, 다음 명령을 실행하면 SSH 세션을 시작하는 대신 실행 중인 NGINX 컨테이너에 대한 대화형 셸을 열 수 있습니다. 하지만 이 방법은 고급 사용자에게만 권장합니다.

  • Alpine Linux 시스템에서:

    # 도커 실행 -it <NGINX_컨테이너_ID>
    
  • 데비안 시스템에서:

    # 도커 실행 -it <NGINX_컨테이너_ID> 배쉬
    

콘텐츠 및 구성 파일 관리

NGINX에서 제공하는 콘텐츠와 NGINX 구성 파일을 관리할 수 있는 방법에는 여러 가지가 있습니다. 여기서는 몇 가지 옵션을 살펴보겠습니다.

옵션 1 – Docker 호스트에서 콘텐츠 및 구성 유지 관리

컨테이너가 생성되면 Docker에게 Docker 호스트의 로컬 디렉토리를 컨테이너의 디렉토리에 마운트하라고 지시할 수 있습니다. NGINX 이미지는 기본 NGINX 구성을 사용하는데, 이는 /usr/share/nginx/html을 컨테이너의 루트 디렉토리로 사용하고 구성 파일을 /etc/nginx 에 저장합니다. 로컬 디렉토리 /var/www 에 콘텐츠가 있고 /var/nginx/conf 에 구성 파일이 있는 Docker 호스트의 경우 이 명령을 실행합니다(여기서는 가독성을 위해 여러 줄로 표시).

# docker run --name mynginx2 --마운트 유형=바인드 소스=/var/www,대상=/usr/share/nginx/html,읽기전용 --마운트 유형=바인드,소스=/var/nginx/conf,대상=/etc/nginx/conf,읽기전용 -p 80:80 -d nginx

이제 Docker 호스트의 로컬 디렉토리 /var/www/var/nginx/conf 에 있는 파일에 적용된 모든 변경 사항은 컨테이너의 /usr/share/nginx/html/etc/nginx 디렉토리에 반영됩니다. 읽기 전용 옵션은 이러한 디렉토리가 컨테이너 내부가 아닌 Docker 호스트에서만 변경될 수 있음을 의미합니다.

옵션 2 – Docker 호스트에서 파일 복사

또 다른 옵션은 컨테이너 생성 중에 Docker 호스트의 로컬 디렉토리에서 Docker가 콘텐츠 및 구성 파일을 복사하는 것입니다. 컨테이너가 생성되면 파일이 변경될 때 새 컨테이너를 만들거나 컨테이너에 있는 파일을 수정하여 파일이 유지됩니다. 파일을 복사하는 간단한 방법은 Docker Hub의 NGINX 이미지를 기반으로 새로운 Docker 이미지를 생성하는 동안 실행되는 명령이 포함된 Dockerfile을 만드는 것입니다. Dockerfile 의 파일 복사( COPY ) 명령의 경우 로컬 디렉토리 경로는 Dockerfile 이 위치한 빌드 컨텍스트를 기준으로 합니다.

예를 들어, 컨텐츠는 content 디렉토리에 있고 구성 파일은 conf 디렉토리에 있는데, 둘 다 Dockerfile이 있는 디렉토리의 하위 디렉토리입니다. NGINX 이미지에는 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf 라는 기본 NGINX 구성 파일이 포함되어 있습니다. 대신 호스트의 구성 파일을 사용하고 싶으므로 기본 파일을 삭제하는 RUN 명령을 포함했습니다.

nginx에서
실행 rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
복사 content /usr/share/nginx/html
복사 conf /etc/nginx

Dockerfile이 있는 디렉토리에서 다음 명령을 실행하여 우리만의 NGINX 이미지를 생성합니다. 명령의 끝에 있는 마침표(".")에 주의하세요. 현재 디렉토리를 빌드 컨텍스트로 정의하며, 여기에는 Dockerfile 과 복사할 디렉토리가 포함됩니다.

# docker build -t mynginx_image1 .

이제 mynginx_image1 이미지를 기반으로 mynginx3 라는 컨테이너를 생성하기 위해 이 명령을 실행합니다.

# docker 실행 --이름 mynginx3 -p 80:80 -d mynginx_image1

컨테이너에 있는 파일을 변경하려면 옵션 3에 설명된 대로 도우미 컨테이너를 사용합니다.

옵션 3 – 컨테이너에서 파일 유지 관리

SSH에 대한 참고 사항 에서 언급했듯이 SSH를 사용하여 NGINX 컨테이너에 액세스할 수 없습니다. 따라서 콘텐츠나 구성 파일을 직접 편집하려면 셸 액세스가 가능한 도우미 컨테이너를 만들어야 합니다. 도우미 컨테이너가 파일에 액세스하려면 이미지에 대해 적절한 Docker 데이터 볼륨이 정의된 새 이미지를 만들어야 합니다. 옵션 2 에서처럼 볼륨을 정의하는 동시에 파일을 복사하려는 경우 다음 Dockerfile을 사용합니다.

nginxRUN에서 rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
복사 content /usr/share/nginx/html
복사 conf /etc/nginx
볼륨 /usr/share/nginx/html
볼륨 /etc/nginx

그런 다음 다음 명령을 실행하여 새 NGINX 이미지를 만듭니다(마지막 마침표에 주의하세요).

# docker build -t mynginx_image2 .

이제 mynginx_image2 이미지를 기반으로 NGINX 컨테이너( mynginx4 )를 생성하기 위해 이 명령을 실행합니다.

# docker 실행 --이름 mynginx4 -p 80:80 -d mynginx_image2

그런 다음 다음 명령을 실행하여 셸이 있는 도우미 컨테이너 mynginx4_files를 시작하여 방금 만든 mynginx4 컨테이너의 콘텐츠 및 구성 디렉토리에 액세스할 수 있습니다.

# docker run -i -t --volumes-from mynginx4 --name mynginx4_files debian /bin/bash root@b1cbbad63dd1:/#

새로운 mynginx4_files 도우미 컨테이너는 지속적인 표준 입력( -i 옵션 )과 tty( -t 옵션)를 사용하여 포그라운드에서 실행됩니다. mynginx4 에 정의된 모든 볼륨은 도우미 컨테이너의 로컬 디렉토리로 마운트됩니다.

debian 인수는 도우미 컨테이너가 Docker Hub의 Debian 이미지를 사용한다는 것을 의미합니다. NGINX 이미지도 Debian을 사용하고(지금까지 모든 예제도 NGINX 이미지를 사용함) Docker가 다른 운영 체제를 로드하는 것보다 도우미 컨테이너로 Debian을 사용하는 것이 가장 효율적입니다.

/bin/bash 인수는 bash 셸이 도우미 컨테이너에서 실행되어 필요에 따라 파일을 수정하는 데 사용할 수 있는 셸 프롬프트를 표시한다는 것을 의미합니다.

컨테이너를 시작 및 중지하려면 다음 명령을 실행하세요.

# 도커 시작 mynginx4_files # 도커 중지 mynginx4_files

셸을 종료하지만 컨테이너는 계속 실행하려면 Ctrl+p를 누른 다음 Ctrl+q를 누릅니다. 실행 중인 컨테이너에 대한 셸 액세스 권한을 되찾으려면 다음 명령을 실행하세요.

# docker 첨부 mynginx4_files

셸을 종료하고 컨테이너를 종료하려면 exit 명령을 실행하세요.

로깅 관리

기본 로깅이나 사용자 지정 로깅을 구성할 수 있습니다.

기본 로깅 사용

NGINX 이미지는 기본적으로 주요 NGINX 액세스 및 오류 로그를 Docker 로그 수집기로 보내도록 구성되어 있습니다. 이는 다음을 연결하여 수행됩니다. 표준 출력 그리고 표준 에러 각각; 두 로그의 모든 메시지는 파일에 기록됩니다. /var/lib/docker/컨테이너/<컨테이너_ID>/<컨테이너_ID>-json.log Docker 호스트에서 <컨테이너_ID> 컨테이너를 생성할 때 반환되는 긴 형식의 ID입니다. 예를 들어, NGINX 오픈 소스 Docker 이미지 사용 에서 생성한 초기 컨테이너의 경우 fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d 입니다.

기존 컨테이너의 컨테이너 ID를 검색하려면 다음 명령을 실행하세요. <컨테이너 이름> 는에 의해 설정된 값입니다 --이름 컨테이너가 생성될 때 매개변수(예를 들어 위의 컨테이너 ID의 경우) 민긴x1):

# docker inspect --format '{{ .Id }}' <컨테이너 이름>

로그를 열면 볼 수 있지만 <컨테이너_ID>-json.log 파일을 직접 실행하는 경우 일반적으로 다음 명령을 실행하는 것이 더 쉽습니다.

# docker 로그 <컨테이너 이름>

Docker Unix 소켓에 GET 요청을 보내면 Docker Engine API를 사용하여 로그 메시지를 추출할 수도 있습니다. 이 명령은 액세스 로그( stdout=1 로 표현됨)와 오류 로그( stderr=1로 표현됨 )를 모두 반환하지만 각각을 요청할 수도 있습니다.

# curl --unix-socket /var/run/docker-sock http://localhost/containers/ <컨테이너 _이름> /logs?stdout=1&stderr=1

다른 쿼리 매개변수에 대해 알아보려면 Docker Engine API 설명서를 참조하세요(해당 페이지에서 "컨테이너 로그 가져오기"를 검색하세요).

사용자 정의 로깅 사용

다른 로그 수집 방법을 구현하거나 특정 구성 블록(예: server{}location{} )에서 로깅을 다르게 구성하려면 컨테이너에서 로그 파일을 저장할 디렉터리에 대한 Docker 볼륨을 정의하고, 로그 파일에 액세스하기 위한 도우미 컨테이너를 만들고, 원하는 로깅 도구를 사용하면 됩니다. 이를 구현하려면 로깅 파일의 볼륨을 포함하는 새 이미지를 만듭니다.

예를 들어, NGINX가 /var/log/nginx/log 에 로그 파일을 저장하도록 구성하려면 옵션 3Dockerfile 로 시작하고 이 디렉토리에 대한 VOLUME 정의를 추가하기만 하면 됩니다.

nginxRUN에서 rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
복사 content /usr/share/nginx/html
복사 conf /etc/nginx
VOLUME /var/log/nginx/log

그런 다음 위에서 설명한 대로 이미지를 생성하고 이를 사용하여 로깅 디렉토리에 액세스할 수 있는 NGINX 컨테이너와 도우미 컨테이너를 생성할 수 있습니다. 도우미 컨테이너에는 원하는 로깅 도구를 설치할 수 있습니다.

NGINX 제어

NGINX 컨테이너의 명령줄에 직접 접근할 수 없으므로 nginx 명령을 사용하여 NGINX를 제어할 수 없습니다. 다행히도 신호를 사용하여 NGINX를 제어할 수 있으며 Docker는 신호를 컨테이너로 보내기 위한 kill 명령을 제공합니다.

NGINX 구성을 다시 로드하려면 다음 명령을 실행하세요.

# docker kill -s HUP <컨테이너 이름>

NGINX를 다시 시작하려면 다음 명령을 실행하여 컨테이너를 다시 시작하세요.

# docker 재시작 <컨테이너 이름>

Docker로 NGINX Plus 배포

지금까지 NGINX 오픈 소스용 Docker에 대해 설명했지만, 상용 제품인 NGINX Plus에서도 사용할 수 있습니다. 차이점은 먼저 NGINX Plus 이미지를 만들어야 한다는 것입니다. NGINX Plus는 상용 제품으로 Docker Hub에서 사용할 수 없기 때문입니다. 다행히도, 이건 하기 매우 쉽습니다.

메모: Docker Hub와 같은 공개 저장소에 NGINX Plus 이미지를 업로드하지 마세요. 그렇게 하면 라이센스 계약을 위반하게 됩니다 .

NGINX Plus의 Docker 이미지 생성

NGINX Plus 이미지를 생성하려면 먼저 Dockerfile을 만듭니다. 여기에 제공된 예제에서는 Debian 11(Bullseye)Alpine Linux 3.17을 기본 Docker 이미지로 사용합니다. NGINX Plus Docker 이미지를 생성하기 전에 nginx-repo.crtnginx-repo.key 파일의 버전을 다운로드해야 합니다. NGINX Plus 고객은 고객 포털 에서 찾을 수 있습니다. NGINX Plus 무료 평가판을 사용하고 있다면 평가판 패키지가 함께 제공됩니다. Dockerfile 이 있는 디렉토리(Docker 빌드 컨텍스트)에 파일을 복사합니다.

NGINX 오픈 소스와 마찬가지로 기본적으로 NGINX Plus 액세스 및 오류 로그는 Docker 로그 수집기에 연결됩니다. 볼륨은 지정되지 않았지만 원하는 경우 볼륨을 추가하거나 각 Dockerfile을 사용하여 기본 이미지를 만든 다음, 이전에 설명한 대로 볼륨을 지정하여 새 이미지를 만들 수 있습니다.

우리는 의도적으로 샘플 Dockerfiles 에 NGINX Plus 버전을 지정하지 않았는데, 이는 NGINX Plus의 새로운 릴리스로 업데이트할 때 파일을 편집할 필요가 없기 때문입니다. 그러나 원하는 경우 파일 버전에 맞게 주석 처리를 해제할 수 있도록 관련 지침의 주석 처리된 버전을 포함했습니다.

마찬가지로 NGINX Plus용 공식 동적 모듈을 설치하는 방법에 대한 지침(주석 처리)을 포함했습니다.

기본적으로 컨테이너가 생성될 때 Docker 호스트에서 파일이 복사되지 않습니다. 위에 설명한 대로 각 DockerfileCOPY 정의를 추가하거나, 생성한 이미지를 다른 이미지의 기반으로 사용할 수 있습니다.

NGINX Plus Dockerfile(Debian 11)

 

 

NGINX Plus Dockerfile(Alpine Linux 3.17)

 

 

NGINX Plus 이미지 생성

같은 디렉토리에 Dockerfile , nginx-repo.crt , nginx-repo.key 파일이 있다면 다음 명령을 실행해 nginxplus 라는 Docker 이미지를 만듭니다(앞과 마찬가지로 마지막 마침표에 주의하세요).

# DOCKER_BUILDKIT=1 docker build --no-cache -t nginxplus --secret id=nginx-crt,src=to/ nginx-repo.crt> --secret id=nginx-key,src=your/ nginx-repo.key> .

DOCKER_BUILDKIT=1 플래그는 아래에서 설명하는 --secret 옵션을 포함할 때 필요한 대로 Docker BuildKit을 사용하여 이미지를 빌드한다는 것을 나타냅니다.

--no-cache 옵션은 Docker에게 이미지를 처음부터 빌드하도록 지시하고 최신 버전의 NGINX Plus가 설치되도록 합니다. Dockerfile을 사용하여 이전에 이미지를 빌드했고 --no-cache 옵션을 생략한 경우, 새 이미지는 Docker 캐시의 NGINX Plus 버전을 사용합니다. (앞서 설명한 대로, 우리는 의도적으로 Dockerfile 에 NGINX Plus 버전을 지정하지 않습니다. 이렇게 하면 NGINX Plus의 새로운 릴리스가 나올 때마다 해당 파일을 변경할 필요가 없습니다.) 이전에 빌드한 이미지에서 NGINX Plus 버전을 사용하는 것이 허용된다면 --no-cache 옵션을 생략하세요.

--secret 옵션은 NGINX Plus 라이선스에 대한 인증서와 키를 Docker 빌드 컨텍스트에 전달하면서 데이터가 노출되거나 Docker 빌드 계층 간에 데이터가 유지되는 위험은 없습니다. id 인수의 값은 기본 Dockerfile 을 변경하지 않고는 변경할 수 없지만, src 인수를 NGINX Plus 인증서와 키 파일의 경로로 설정해야 합니다(이전 지침을 따랐다면 Docker 이미지를 빌드하는 디렉토리와 동일).

docker images nginxplus 명령에서 다음과 같은 출력이 나타나면 이미지가 성공적으로 생성되었음을 나타냅니다.

# docker images nginxplus 저장소 태그 이미지 ID 생성 가상 크기 nginxplus 최신 ef2bf65931cf 6초 전 91.2MB

이 이미지를 기반으로 mynginxplus 라는 이름의 컨테이너를 생성하려면 다음 명령을 실행하세요.

# docker 실행 --name mynginxplus -p 80:80 -d nginxplus

NGINX Plus 컨테이너는 NGINX Open Source 컨테이너와 동일한 방식 으로 제어하고 관리할 수 있습니다.

요약

NGINX, NGINX Plus, Docker는 서로 매우 잘 작동합니다. Docker Hub의 NGINX 오픈 소스 이미지를 사용하거나 자체 NGINX Plus 이미지를 생성하든 Docker 컨테이너에서 NGINX 및 NGINX Plus의 새로운 인스턴스를 쉽게 생성하고 Kubernetes 환경에 배포할 수 있습니다. 기본 이미지에서 새로운 Docker 이미지를 쉽게 만들 수 있어 컨테이너를 더욱 쉽게 제어하고 관리할 수 있습니다. Docker 컨테이너에서 실행되는 모든 NGINX Plus 인스턴스가 구독에 포함되어 있는지 확인하세요. 자세한 내용은 NGINX 영업팀에 문의 하세요.

이 글에서 다룬 것보다 Docker에 대한 내용이 훨씬 더 많습니다. 자세한 내용은 무료 O'Reilly eBook – Container Networking을 다운로드하세요. Docker에서 Kubernetes까지 – 또는 www.docker.com을 확인하세요.


"이 블로그 게시물에는 더 이상 사용할 수 없거나 더 이상 지원되지 않는 제품이 참조될 수 있습니다. 사용 가능한 F5 NGINX 제품과 솔루션에 대한 최신 정보를 보려면 NGINX 제품군을 살펴보세요. NGINX는 이제 F5의 일부가 되었습니다. 이전의 모든 NGINX.com 링크는 F5.com의 유사한 NGINX 콘텐츠로 리디렉션됩니다."