자습서-Docker와 함께 NGINX 및 NGINX Plus 배포
Docker는 분산 애플리케이션을 컨테이너로 구축, 배송 및 실행하기 위한 개방형 플랫폼입니다.
컨테이너는 Kubernetes와 같은 컨테이너 오케스트레이션 플랫폼에 의해 차례로 배포 및 오케스트레이션될 수 있습니다 .
이 모범사례에서 논의한 Docker 컨테이너 기술 외에도 NGINX는 NGINX 오픈소스 기반 및 NGINX Plus 기반 버전에서 NGINX Ingress Controller를 제공합니다 . NGINX Plus 구독자의 경우 지원이 추가 비용 없이 포함됩니다.
소프트웨어 애플리케이션으로서 NGINX OSS 및 F5 NGINX Plus 는 Docker의 훌륭한 사용사례이며 우리는 Docker 이미지 저장소인 Docker Hub 에 NGINX OSS 이미지를 게시합니다. 이 사례에서는 다음 방법을 설명합니다.
- Docker Hub의 이미지를 사용하여 NGINX 오픈소스 배포
- 컨테이너에서 NGINX 관리 (연결, 구성, 로깅, 다시 로드 및 다시 시작)
- 생성한 Docker 이미지를 사용하여 NGINX Plus 배포
목차
1. 소개
2. NGINX OSS Docker 이미지 사용
3. NGINX Docker 컨테이너 작업
3-1. SSH에 대한 참고 사항
3-2. 콘텐츠 및 구성 파일 관리
3-3. 로깅 관리
3-4. NGINX 제어
4. Docker와 함께 NGINX Plus 배포
4-1. NGINX Plus의 도커 이미지 생성
4-2. NGINX Plus Dockerfile (Debian 11)
4-3. NGINX Plus Dockerfile (Alpine Linux 3.15)
5. 요약
1. 소개
Docker 개방형 플랫폼에는 컨테이너를 빌드, 실행 및 오케스트레이션하는 오픈소스 런타임인 Docker Engine과 전체 개발 커뮤니티에서 또는 특정 조직.
Docker 컨테이너를 사용하면 개발자가 인프라의 제약 조건에서 애플리케이션을 분리하여 애플리케이션 “콘텐츠”에 노력을 집중할 수 있습니다. Docker화된 애플리케이션은 랩톱, 베어메탈 서버, VM 또는 클라우드와 같은 모든 인프라에 즉시 이식할 수 있으므로 완전한 기능을 갖춘 분산 애플리케이션으로 쉽게 조립 및 재조립될 수 있고 실시간으로 지속적으로 혁신할 수 있는 모듈식 구성 요소가 됩니다.
Docker에 대한 자세한 내용은 Docker를 선택해야 하는 이유를 참조하세요. 또는 전체 Docker 설명서 .
2. NGINX OSS Docker 이미지 사용
Docker Hub 의 NGINX 오픈소스 이미지 를 사용하여 Docker 컨테이너에 NGINX 인스턴스를 생성할 수 있습니다 .
아주 간단한 예부터 시작하겠습니다. 컨테이너에서 실행되고 기본 NGINX 구성을 사용하여 NGINX의 인스턴스를 시작하려면 다음 명령을 실행합니다.
# docker run --name mynginx1 -p 80:80 -d nginx
fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d
이 명령은 NGINX 이미지를 기반으로 mynginx1 이라는 컨테이너를 생성합니다 . 이 명령은 로그 파일 이름에 사용되는 긴 형식의 컨테이너 ID를 반환합니다.
이 -p
옵션은 NGINX 이미지에 의해 컨테이너에 노출된 포트(포트 80)를 Docker 호스트의 지정된 포트에 매핑하도록 Docker에 지시합니다. 첫 번째 매개변수는 Docker 호스트의 포트를 지정하고 두 번째 매개변수는 컨테이너에 노출된 포트에 매핑됩니다.
이 -d
옵션은 컨테이너가 분리 모드에서 실행되도록 지정합니다. 즉, 중지될 때까지 계속 실행되지만 명령줄에서 실행되는 명령에는 응답하지 않습니다. 다음 섹션에서는 컨테이너와 상호 작용하는 방법을 설명합니다.
컨테이너가 생성되어 실행 중인지 확인하고 포트 매핑을 보려면 docker
ps
. (여기서 읽기 쉽도록 출력을 여러 줄로 분할했습니다.)
# docker ps
CONTAINER ID IMAGE COMMAND CREATED ...
fcd1fb01b145 nginx:latest "nginx -g 'daemon of 16 seconds ago ...
... STATUS PORTS NAMES
... Up 15 seconds 0.0.0.0:80->80/tcp mynginx1
출력의 PORTS
필드는 Docker 호스트의 포트 80이 컨테이너의 포트 80에 매핑되었다고 보고합니다. NGINX가 실행 중인지 확인하는 또 다른 방법은 해당 포트에 HTTP 요청을 하는 것입니다. 기본 NGINX 시작 페이지의 코드가 나타납니다.
# curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="https://www.nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
3. NGINX Docker 컨테이너 작업
이제 작동하는 NGINX Docker 컨테이너가 있지만 콘텐츠와 NGINX 구성을 어떻게 관리합니까? 그리고 로깅은 어떻습니까?
3-1. SSH에 대한 참고 사항
NGINX 인스턴스에 대한 SSH 액세스를 활성화하는 것이 일반적이지만 Docker 컨테이너는 일반적으로 단일 목적(이 경우 NGINX 실행)을 위한 것이기 때문에 NGINX 이미지에는 OpenSSH가 설치되어 있지 않습니다. 대신 Docker에서 지원하는 다른 방법을 사용합니다.
다음 명령의 대안으로 다음 명령을 실행하여 실행 중인 NGINX 컨테이너에 대한 대화형 Shell을 열 수 있습니다(SSH 세션을 시작하는 대신). 그러나 고급 사용자에게만 권장합니다.
- Alpine Linux인 경우
# docker exec -it <NGINX_container_ID> sh
- Debian인 경우
# docker exec -it <NGINX_container_ID> bash
3-2. 콘텐츠 및 구성 파일 관리
NGINX에서 제공하는 콘텐츠와 NGINX 구성 파일을 모두 관리할 수 있는 몇 가지 방법이 있습니다. 여기에서는 몇 가지 옵션을 다룹니다.
옵션 1 – Docker 호스트에서 콘텐츠 및 구성 유지 관리
컨테이너가 생성되면 Docker 호스트의 로컬 디렉토리를 컨테이너의 디렉토리에 마운트하도록 Docker에 지시할 수 있습니다. NGINX 이미지는 /usr/share/nginx/html 을 컨테이너의 루트 디렉토리로 사용하고 구성 파일을 /etc/nginx 에 저장하는 기본 NGINX 구성을 사용합니다 . 콘텐츠가 로컬 디렉토리 /var/www 에 있고 구성 파일이 /var/nginx/conf 에 있는 Docker 호스트의 경우 다음 명령을 실행하십시오(여기서는 가독성을 위해 여러 줄로 표시됨).
# docker run --name my
# docker run --name mynginx2 --mount type=bind source=/var/www,target=/usr/share/nginx/html,readonly --mount type=bind,source=/var/nginx/conf,target=/etc/nginx/conf,readonly -p 80:80 -d nginx
이제 Docker 호스트 의 로컬 디렉토리 /var/www 및 /var/nginx/conf 에 있는 파일에 대한 모든 변경 사항이 컨테이너의 /usr/share/nginx/html 및 /etc/nginx 디렉토리에 반영됩니다 . 이 readonly
옵션은 이러한 디렉터리가 컨테이너 내에서가 아니라 Docker 호스트에서만 변경할 수 있음을 의미합니다.
옵션 2 – Docker 호스트에서 파일 복사
또 다른 옵션은 컨테이너 생성 중에 Docker가 Docker 호스트의 로컬 디렉토리에서 콘텐츠 및 구성 파일을 복사하도록 하는 것입니다. 컨테이너가 생성되면 파일이 변경될 때 새 컨테이너를 생성하거나 컨테이너에 있는 파일을 수정하여 파일을 유지 관리합니다. 파일을 복사하는 간단한 방법 은 Docker Hub의 NGINX 이미지를 기반으로 새 Docker 이미지를 생성하는 동안 실행되는 명령 으로 Dockerfile 을 만드는 것입니다. Dockerfile 의 파일 복사( COPY
) 명령의 경우 로컬 디렉터리 경로는 Dockerfile 이 있는 빌드 컨텍스트에 상대적입니다.
이 예에서 콘텐츠는 콘텐츠 디렉터리에 있고 구성 파일은 Dockerfile 이 있는 디렉터리의 두 하위 디렉터리인 conf 디렉터리 에 있습니다. NGINX 이미지에는 /etc/nginx/nginx.conf 및 /etc/nginx/conf.d/default.conf 와 같은 기본 NGINX 구성 파일이 포함되어 있습니다. 대신 호스트의 구성 파일을 사용하고 싶기 때문에 기본 파일을 삭제하는 RUN 명령을 포함합니다.
FROM nginx
RUN rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPY content /usr/share/nginx/html
COPY conf /etc/nginx
Dockerfile 이 있는 디렉토리에서 다음 명령을 실행하여 자체 NGINX 이미지를 생성합니다 . 명령 끝에 마침표(“.”)가 있습니다. 현재 디렉터리를 Dockerfile 과 복사할 디렉터리가 포함된 빌드 컨텍스트로 정의합니다.
# docker build -t mynginx_image1 .
이제 이 명령을 실행 하여 mynginx_image1 이미지 를 기반으로 mynginx3 이라는 컨테이너를 생성합니다.
# docker run --name mynginx3 -p 80:80 -d mynginx_image1
컨테이너의 파일을 변경하려면 옵션 3에 설명된 대로 도우미 컨테이너를 사용합니다.
옵션 3 – 컨테이너의 파일 유지 관리
A Note About SSH 에서 언급했듯이 SSH를 사용하여 NGINX 컨테이너에 액세스할 수 없으므로 콘텐츠 또는 구성 파일을 직접 편집하려면 Shell 액세스 권한이 있는 도우미 컨테이너를 만들어야 합니다. 도우미 컨테이너가 파일에 액세스할 수 있으려면 이미지에 대해 정의된 적절한 Docker 데이터 볼륨 이 있는 새 이미지를 만들어야 합니다 . 볼륨을 정의하는 동안 옵션 2 에서와 같이 파일을 복사한다고 가정하고 다음 Dockerfile을 사용합니다 .
FROM nginx
RUN rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPY content /usr/share/nginx/html
COPY conf /etc/nginx
VOLUME /usr/share/nginx/html
VOLUME /etc/nginx
그런 다음 다음 명령을 실행하여 새 NGINX 이미지를 만듭니다(마지막 마침표를 다시 확인).
# docker build -t mynginx_image2 .
이제 이 명령을 실행 하여 mynginx_image2 이미지 를 기반으로 NGINX 컨테이너( mynginx4 )를 생성합니다.
# docker run --name 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 Shell이 도우미 컨테이너에서 실행되어 필요에 따라 파일을 수정하는 데 사용할 수 있는 Shell 프롬프트를 표시함을 의미합니다.
컨테이너를 시작 및 중지하려면 다음 명령을 실행합니다.
# docker start mynginx4_files
# docker stop mynginx4_files
Shell을 종료하고 컨테이너를 실행 중인 상태로 두려면 Ctrl+p
를 누른다음 Ctrl+q
를 누릅니다. 실행 중인 컨테이너에 대한 Shell 액세스 권한을 다시 얻으려면 다음 명령을 실행합니다.
# docker attach mynginx4_files
셸을 종료하고 컨테이너를 종료하려면 exit
명령을 실행합니다.
3-3. 로깅 관리
기본 또는 사용자 정의 로깅을 구성할 수 있습니다.
기본 로깅 사용
NGINX 이미지는 기본적으로 기본 NGINX 액세스 및 오류 로그를 Docker 로그 수집기로 보내도록 구성됩니다. 이는 stdout
및 stderr
각각에 연결하여 수행됩니다. 그러면 두 로그의 모든 메시지가 Docker 호스트의 /var/lib/docker/containers/ <container_ID> / <container_ID> -json.log 파일에 기록됩니다. 여기서 <container_ID> 는 생성할 때 반환되는 긴 형식 ID입니다. 컨테이너. NGINX 오픈소스 Docker 이미지 사용에서 생성한 초기 컨테이너의 경우 예를 들어 fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d 입니다.
기존 컨테이너의 컨테이너 ID를 검색하려면 다음 명령을 실행합니다. 여기서 <container_name>
는 컨테이너가 생성될 때 –name 매개변수로 설정한 값입니다 (위의 컨테이너 ID의 경우 예를 들어 mynginx1 ).
# docker inspect --format '{{ .Id }}' <container_name>
<container_ID> -json.log 파일을 직접 열어 로그를 볼 수 있지만 일반적으로 다음 명령을 실행하는 것이 더 쉽습니다.
# docker logs <container_name>
Docker 엔진 API를 사용 하여 Docker Unix 소켓에 대한 GET 요청을 실행하여 로그 메시지를 추출 할 수도 있습니다 . 이 명령은 액세스 로그( stdout=1
로 표시됨)와 오류 로그( stderr=1
)를 모두 반환하지만 개별적으로 요청할 수도 있습니다.
curl --unix-socket /var/run/docker-sock http://localhost/containers/<container_name>/logs?stdout=1&stderr=1
다른 쿼리 매개변수에 대해 알아보려면 Docker Engine API 설명서 를 참조하십시오 (해당 페이지에서 “컨테이너 로그 가져오기” 검색).
사용자 정의 로깅 사용
다른 로그 수집 방법을 구현하거나 특정 구성 블록(예: server{}
및 location{}
)에서 로깅을 다르게 구성하려면 컨테이너에 로그 파일을 저장할 디렉터리에 대해 Docker 볼륨을 정의하고 다음을 생성합니다. 도우미 컨테이너를 사용하여 로그 파일에 액세스하고 원하는 로깅 도구를 사용할 수 있습니다. 이를 구현하려면 로깅 파일에 대한 볼륨을 포함하는 새 이미지를 생성하십시오.
예를 들어 /var/log/nginx/log 에 로그 파일을 저장하도록 NGINX를 구성하려면 옵션 3 의 Dockerfile로 시작하여 이 디렉토리에 VOLUME 대한 정의를 추가하기만 하면 됩니다.
FROM nginx
RUN rm /etc/nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPY content /usr/share/nginx/html
COPY conf /etc/nginx
VOLUME /var/log/nginx/log
그런 다음 위에서 설명한 대로 이미지를 만들고 이를 사용하여 로깅 디렉터리에 액세스할 수 있는 NGINX 컨테이너와 도우미 컨테이너를 만들 수 있습니다. 도우미 컨테이너에는 원하는 로깅 도구가 설치되어 있을 수 있습니다.
3-4. NGINX 제어
NGINX 컨테이너의 명령줄에 직접 액세스할 수 없기 때문에 nginx
명령을 사용하여 NGINX를 제어할 수 없습니다. 다행히 신호 를 사용 하여 NGINX를 제어할 수 있으며 Docker는 kill
컨테이너에 신호를 보내는 명령을 제공합니다.
NGINX 구성을 다시 로드하려면 다음 명령을 실행합니다.
# docker kill -s HUP <container_name>
NGINX를 다시 시작하려면 다음 명령을 실행하여 컨테이너를 다시 시작합니다.
# docker restart <container_name>
4. Docker와 함께 NGINX Plus 배포
지금까지 NGINX 오픈소스용 Docker에 대해 논의했지만 상용 제품인 NGINX Plus와 함께 사용할 수도 있습니다. 차이점은 NGINX Plus 상용 제품으로 Docker Hub에서 사용할 수 없기 때문에 먼저 NGINX Plus 이미지를 생성해야 한다는 것입니다. 다행히도 이 작업은 매우 쉽습니다.
참고: NGINX Plus 이미지를 Docker Hub와 같은 공용 리포지토리에 업로드하지 마십시오. 그렇게 하면 라이센스 계약을 위반하는 것 입니다.
4-1. NGINX Plus의 도커 이미지 생성
NGINX Plus 이미지를 생성하려면 먼저 Dockerfile 을 생성 하십시오 . 여기에서 제공하는 예제는 Alpine Linux 3.15 및 Debian 11(Bullseye)을 기본 Docker 이미지로 사용합니다. NGINX Plus Docker 이미지를 생성하기 전에 nginx-repo.crt 및 nginx-repo.key 파일 버전을 다운로드해야 합니다. NGINX Plus 고객은 고객 포털 에서 찾을 수 있습니다 . NGINX Plus의 무료 평가판을 수행하는 경우 평가판 패키지와 함께 제공됩니다. Dockerfile 이 있는 디렉터리(Docker 빌드 컨텍스트)에 파일을 복사합니다 .
NGINX 오픈 소스와 마찬가지로 기본적으로 NGINX Plus 액세스 및 오류 로그는 Docker 로그 수집기에 연결됩니다. 지정된 볼륨은 없지만 원하는 경우 볼륨을 추가할 수 있습니다. 또는 앞에서 설명한 대로 각 Dockerfile 을 사용하여 지정된 볼륨으로 새 이미지를 생성할 수 있는 기본 이미지를 생성할 수 있습니다.
NGINX Plus 의 새 릴리스로 업데이트할 때 파일을 편집할 필요가 없도록 샘플 Dockerfiles 에 NGINX Plus 버전을 의도적으로 지정 하지 않았습니다. 그러나 특정 버전의 파일을 만들고 싶은 경우 주석 처리를 해제할 수 있도록 관련 지침의 주석 처리된 버전이 포함되어 있습니다.
마찬가지로 NGINX Plus용 공식 동적 모듈을 설치하는 지침(주석 처리)을 포함 했습니다.
기본적으로 컨테이너가 생성될 때 Docker 호스트에서 파일이 복사되지 않습니다.각 Dockerfile 에 COPY
정의를 추가 하거나 위에서 설명한 대로 생성한 이미지를 다른 이미지의 기반으로 사용할 수 있습니다.
4-2. NGINX Plus Dockerfile (Debian 11)
FROM debian:bullseye-slim
LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"
# Define NGINX versions for NGINX Plus and NGINX Plus modules
# Uncomment this block and the versioned nginxPackages block in the main RUN
# instruction to install a specific release
# ENV NGINX_VERSION 26
# ENV NJS_VERSION 0.7.2
# ENV PKG_RELEASE 1~bullseye
# Download certificate and key from the customer portal (https://account.f5.com)
# and copy to the build context
RUN --mount=type=secret,id=nginx-crt,dst=nginx-repo.crt \
--mount=type=secret,id=nginx-key,dst=nginx-repo.key \
set -x \
# Create nginx user/group first, to be consistent throughout Docker variants
&& addgroup --system --gid 101 nginx \
&& adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y \
ca-certificates \
gnupg1 \
lsb-release \
&& \
NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
found=''; \
for server in \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu \
; do \
echo "Fetching GPG key $NGINX_GPGKEY from $server"; \
apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; \
done; \
test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \
apt-get remove --purge --auto-remove -y gnupg1 && rm -rf /var/lib/apt/lists/* \
# Install the latest release of NGINX Plus and/or NGINX Plus modules
# Uncomment individual modules if necessary
# Use versioned packages over defaults to specify a release
&& nginxPackages=" \
nginx-plus \
# nginx-plus=${NGINX_VERSION}-${PKG_RELEASE} \
# nginx-plus-module-xslt \
# nginx-plus-module-xslt=${NGINX_VERSION}-${PKG_RELEASE} \
# nginx-plus-module-geoip \
# nginx-plus-module-geoip=${NGINX_VERSION}-${PKG_RELEASE} \
# nginx-plus-module-image-filter \
# nginx-plus-module-image-filter=${NGINX_VERSION}-${PKG_RELEASE} \
# nginx-plus-module-perl \
# nginx-plus-module-perl=${NGINX_VERSION}-${PKG_RELEASE} \
# nginx-plus-module-njs \
# nginx-plus-module-njs=${NGINX_VERSION}+${NJS_VERSION}-${PKG_RELEASE} \
" \
&& echo "Acquire::https::pkgs.nginx.com::Verify-Peer \"true\";" > /etc/apt/apt.conf.d/90nginx \
&& echo "Acquire::https::pkgs.nginx.com::Verify-Host \"true\";" >> /etc/apt/apt.conf.d/90nginx \
&& echo "Acquire::https::pkgs.nginx.com::SslCert \"/etc/ssl/nginx/nginx-repo.crt\";" >> /etc/apt/apt.conf.d/90nginx \
&& echo "Acquire::https::pkgs.nginx.com::SslKey \"/etc/ssl/nginx/nginx-repo.key\";" >> /etc/apt/apt.conf.d/90nginx \
&& printf "deb https://pkgs.nginx.com/plus/debian `lsb_release -cs` nginx-plus\n" > /etc/apt/sources.list.d/nginx-plus.list \
&& mkdir -p /etc/ssl/nginx \
&& cat nginx-repo.crt > /etc/ssl/nginx/nginx-repo.crt \
&& cat nginx-repo.key > /etc/ssl/nginx/nginx-repo.key \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y \
$nginxPackages \
curl \
gettext-base \
&& apt-get remove --purge -y lsb-release \
&& apt-get remove --purge --auto-remove -y && rm -rf /var/lib/apt/lists/* /etc/apt/sources.list.d/nginx-plus.list \
&& rm -rf /etc/apt/apt.conf.d/90nginx /etc/ssl/nginx \
# Forward request logs to Docker log collector
&& ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]
4-3. NGINX Plus Dockerfile (Alpine Linux 3.15)
FROM alpine:3.15
LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"
# Define NGINX versions for NGINX Plus and NGINX Plus modules
# Uncomment this block and the versioned nginxPackages in the main RUN
# instruction to install a specific release
# ENV NGINX_VERSION 26
# ENV NJS_VERSION 0.7.2
# ENV PKG_RELEASE 1
# Download certificate and key from the customer portal (https://account.f5.com)
# and copy to the build context
RUN --mount=type=secret,id=nginx-crt,dst=cert.pem \
--mount=type=secret,id=nginx-key,dst=cert.key \
set -x \
# Create nginx user/group first, to be consistent throughout Docker variants
&& addgroup -g 101 -S nginx \
&& adduser -S -D -H -u 101 -h /var/cache/nginx -s /sbin/nologin -G nginx -g nginx nginx \
# Install the latest release of NGINX Plus and/or NGINX Plus modules
# Uncomment individual modules if necessary
# Use versioned packages over defaults to specify a release
&& nginxPackages=" \
nginx-plus \
# nginx-plus=${NGINX_VERSION}-${PKG_RELEASE} \
# nginx-plus-module-xslt \
# nginx-plus-module-xslt=${NGINX_VERSION}-${PKG_RELEASE} \
# nginx-plus-module-geoip \
# nginx-plus-module-geoip=${NGINX_VERSION}-${PKG_RELEASE} \
# nginx-plus-module-image-filter \
# nginx-plus-module-image-filter=${NGINX_VERSION}-${PKG_RELEASE} \
# nginx-plus-module-perl \
# nginx-plus-module-perl=${NGINX_VERSION}-${PKG_RELEASE} \
# nginx-plus-module-njs \
# nginx-plus-module-njs=${NGINX_VERSION}.${NJS_VERSION}-${PKG_RELEASE} \
" \
KEY_SHA512="e7fa8303923d9b95db37a77ad46c68fd4755ff935d0a534d26eba83de193c76166c68bfe7f65471bf8881004ef4aa6df3e34689c305662750c0172fca5d8552a *stdin" \
&& apk add --no-cache --virtual .cert-deps openssl \
&& wget -O /tmp/nginx_signing.rsa.pub https://nginx.org/keys/nginx_signing.rsa.pub \
&& if [ "$(openssl rsa -pubin -in /tmp/nginx_signing.rsa.pub -text -noout | openssl sha512 -r)" = "$KEY_SHA512" ]; then \
echo "key verification succeeded!"; \
mv /tmp/nginx_signing.rsa.pub /etc/apk/keys/; \
else \
echo "key verification failed!"; \
exit 1; \
fi \
&& apk del .cert-deps \
&& cat cert.pem > /etc/apk/cert.pem \
&& cat cert.key > /etc/apk/cert.key \
&& apk add -X "https://pkgs.nginx.com/plus/alpine/v$(egrep -o '^[0-9]+\.[0-9]+' /etc/alpine-release)/main" --no-cache $nginxPackages \
&& if [ -n "/etc/apk/keys/nginx_signing.rsa.pub" ]; then rm -f /etc/apk/keys/nginx_signing.rsa.pub; fi \
&& if [ -n "/etc/apk/cert.key" && -n "/etc/apk/cert.pem"]; then rm -f /etc/apk/cert.key /etc/apk/cert.pem; fi \
# Bring in gettext so we can get `envsubst`, then throw
# the rest away. To do this, we need to install `gettext`
# then move `envsubst` out of the way so `gettext` can
# be deleted completely, then move `envsubst` back.
&& apk add --no-cache --virtual .gettext gettext \
&& mv /usr/bin/envsubst /tmp/ \
\
&& runDeps="$( \
scanelf --needed --nobanner /tmp/envsubst \
| awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
| sort -u \
| xargs -r apk info --installed \
| sort -u \
)" \
&& apk add --no-cache $runDeps \
&& apk del .gettext \
&& mv /tmp/envsubst /usr/local/bin/ \
# Bring in tzdata so users could set the timezones through the environment
# variables
&& apk add --no-cache tzdata \
# Bring in curl and ca-certificates to make registering on DNS SD easier
&& apk add --no-cache curl ca-certificates \
# Forward request and error logs to Docker log collector
&& ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]
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=</path/to/your/nginx-repo.crt> --secret id=nginx-key,src=</path/to/your/nginx-repo.key> .
DOCKER_BUILDKIT=1
플래그는 아래 에서 설명하는 –secret 옵션을 포함할 때 필요에 따라 Docker BuildKit 을 사용하여 이미지를 빌드하고 있음을 나타냅니다.
이 --no-cache
옵션 은 Docker에 이미지를 처음부터 빌드하도록 지시하고 최신 버전의 NGINX Plus 설치를 보장합니다. Dockerfile 이 이전에 이미지를 빌드하는 데 사용되었고 –no-cache 옵션을 포함하지 않으면 새 이미지 는 Docker 캐시의 NGINX Plus 버전을 사용합니다. (참고로 NGINX Plus 의 모든 새 릴리스에서 파일을 변경할 필요가 없도록 Dockerfile에 NGINX Plus 버전을 의도적으로 지정하지 않았습니다.) 이전 에 빌드된 NGINX Plus 버전을 사용하는 것이 허용되는 경우 --no-cache
옵션을 생략합니다. 영상.
이 --secret
옵션은 NGINX Plus 라이선스에 대한 인증서와 키를 데이터 노출 위험 없이 Docker 빌드 컨텍스트에 전달하거나 Docker 빌드 레이어 간에 데이터가 지속되도록 합니다. 기본 Dockerfile을 변경하지 않고 는 id
인수 값을 변경할 수 없지만 NGINX Plus 인증서 및 키 파일(이전 지침을 따랐을 경우 Docker 이미지를 빌드하는 동일한 디렉토리)에 대한 경로로 src 인수를 설정해야 합니다.
docker
images
명령 의 다음과 같은 출력 nginxplus
은 이미지가 성공적으로 생성되었음을 나타냅니다.
# docker images nginxplus
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
nginxplus latest ef2bf65931cf 6 seconds ago 91.2 MB
이 이미지를 기반으로 mynginxplus 라는 컨테이너를 만들려면 다음 명령을 실행합니다.
# docker run --name mynginxplus -p 80:80 -d nginxplus
NGINX 오픈소스 컨테이너와 동일한 방식으로 NGINX Plus 컨테이너를 제어하고 관리할 수 있습니다 .
5. 요약
NGINX, NGINX Plus 및 Docker는 함께 매우 잘 작동합니다. Docker Hub의 NGINX 오픈소스 이미지를 사용하든 고유한 NGINX Plus 이미지를 생성하든 상관없이 Docker 컨테이너에서 NGINX 및 NGINX Plus의 새 인스턴스를 쉽게 스핀업하고 Kubernetes 환경에 배포할 수 있습니다. 또한 기본 이미지에서 새 Docker 이미지를 쉽게 생성하여 컨테이너를 훨씬 더 쉽게 제어하고 관리할 수 있습니다. Docker 컨테이너에서 실행되는 모든 NGINX Plus 인스턴스가 구독에 포함되는지 확인하십시오.