fbpx
30 C
Jakarta
Selasa, 14 Mei 2024

Menjalankan NGINX dan NGINX Plus di Docker

Deploy NGINX dan NGINX Plus sebagai Docker container.
NGINX Plus, platform pengiriman aplikasi berkinerja tinggi, penyeimbang beban, dan server web, tersedia sebagai Docker Docker.

Menjalankan NGINX Open Source di Docker Container

Anda dapat membuat instance NGINX dalam container Docker menggunakan image NGINX Open Source dari Docker Hub.

1.Luncurkan instance NGINX yang berjalan dalam wadah dan gunakan konfigurasi NGINX default dengan perintah berikut:

$ docker run --name mynginx1 -p 80:80 -d nginx

di mana:
mynginx1 adalah nama wadah yang dibuat berdasarkan gambar NGINX
– opsi -d menentukan bahwa wadah berjalan dalam mode terpisah: wadah terus berjalan hingga berhenti tetapi tidak merespons perintah yang dijalankan pada baris perintah.
– opsi -p memberi tahu Docker untuk memetakan port yang diekspos dalam wadah oleh gambar NGINX (port 80) ke port yang ditentukan pada host Docker. Parameter pertama menentukan port di host Docker, parameter kedua dipetakan ke port yang terbuka di container
Perintah mengembalikan bentuk panjang ID penampung: fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d. Bentuk ID ini digunakan atas nama file log.

2.Verifikasi bahwa container telah dibuat dan dijalankan dengan perintah dock

$ docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED         STATUS        ...  
fcd1fb01b145  nginx:latest  "nginx -g 'daemon of  16 seconds ago  Up 15 seconds ... 
   
    ... PORTS              NAMES
    ... 0.0.0.0:80->80/tcp mynginx1

Perintah ini juga memungkinkan melihat pemetaan port yang ditetapkan pada langkah sebelumnya: bidang PORTS dalam laporan keluaran bahwa port 80 pada host Docker dipetakan ke port 80 dalam container.

Menjalankan NGINX Plus di Docker Container

Docker juga dapat digunakan dengan NGINX Plus. Perbedaan antara menggunakan Docker dengan NGINX Open Source adalah Anda harus membuat image NGINX Plus terlebih dahulu, karena sebagai penawaran komersial NGINX Plus tidak tersedia di Docker Hub.

Catatan: Jangan pernah mengunggah image NGINX Plus Anda ke repositori publik seperti Docker Hub. Melakukannya melanggar perjanjian lisensi Anda.

Membuat image Docker NGINX Plus

Untuk menghasilkan image NGINX Plus:
Buat konteks build Docker, atau Dockerfile:

FROM debian:bullseye-slim

LABEL maintainer="NGINX Docker Maintainers <[email protected]>"

# 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   27
# ENV NJS_VERSION     0.7.4
# 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;"]
FROM alpine:3.16

LABEL maintainer="NGINX Docker Maintainers <[email protected]>"

# 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 27
# ENV NJS_VERSION   0.7.4
# 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;"]

# vim:syntax=Dockerfile

2.Seperti NGINX Open Source, image NGINX Plus default memiliki pengaturan default yang sama:
– akses dan log kesalahan ditautkan ke pengumpul log Docker
– tidak ada volume yang ditentukan: Dockerfile dapat digunakan untuk membuat image dasar dari mana Anda dapat membuat image baru dengan volume yang ditentukan, atau volume dapat ditentukan secara manual:

VOLUME /usr/share/nginx/html
VOLUME /etc/nginx

– tidak ada file yang disalin dari host Docker saat container dibuat: Anda dapat menambahkan definisi COPY ke setiap Dockerfile, atau image yang Anda buat dapat digunakan sebagai dasar untuk image lain

Baca Juga:  Setup Zabbix Server di Debian 10 Buster

3.Masuk ke Portal Pelanggan MyF5 dan unduh file nginx-repo.crt dan nginx-repo.key Anda. Untuk uji coba NGINX Plus, file disediakan dengan paket uji coba Anda.

4.Salin file ke direktori tempat Dockerfile berada.

5.Buat image Docker, misalnya, nginxplus (perhatikan periode terakhir dalam perintah).

$ docker build  --no-cache --secret id=nginx-key,src=nginx-repo.key --secret id=nginx-crt,src=nginx-repo.crt -t nginxplus .

Opsi –no-cache memberi tahu Docker untuk membuat image dari awal dan memastikan penginstalan versi terbaru NGINX Plus. Jika Dockerfile sebelumnya digunakan untuk membuat image tanpa opsi –no-cache, image baru menggunakan versi NGINX Plus dari image yang dibuat sebelumnya dari cache Docker.

6.Verifikasi bahwa gambar nginxplus berhasil dibuat dengan perintah Docker image:

$ docker images nginxplus
REPOSITORY  TAG     IMAGE ID      CREATED        SIZE
nginxplus   latest  ef2bf65931cf  6 seconds ago  91.2 MB

7.Buat container berdasarkan image ini, misalnya container mynginxplus:

$ docker run --name mynginxplus -p 80:80 -d nginxplus

8.Verifikasi bahwa wadah mynginxplus aktif dan berjalan dengan perintah docker ps:

$ docker ps
CONTAINER ID  IMAGE             COMMAND               CREATED         STATUS        ...  
eb7be9f439db  nginxplus:latest  "nginx -g 'daemon of  1 minute ago    Up 15 seconds ... 
   
    ... PORTS              NAMES
    ... 0.0.0.0:80->80/tcp mynginxplus

Mengelola Konten dan File Konfigurasi

Konten yang disajikan oleh file konfigurasi NGINX dan NGINX dapat dikelola dengan beberapa cara:

– file disimpan di host Docker
– file disalin dari Host Docker ke wadah
– file disimpan dalam wadah

Memelihara File Konten dan Konfigurasi di Host Docker

Saat container dibuat, Anda dapat memasang direktori lokal di Host Docker ke direktori di container. Gambar NGINX menggunakan konfigurasi NGINX default, yang menggunakan /usr/share/nginx/html sebagai direktori root container dan meletakkan file konfigurasi di /etc/nginx. Untuk Host Docker dengan konten di direktori lokal /var/www dan file konfigurasi di /var/nginx/conf, jalankan perintah:

$ docker run --name mynginx2 --mount type=bind,source=/var/www,target=/usr/share/nginx/html,readonly --mount source=/var/nginx/conf,target=/etc/nginx/conf,readonly -p 80:80 -d nginx

Setiap perubahan yang dibuat pada file di direktori lokal /var/www dan /var/nginx/conf pada Host Docker tercermin dalam direktori /usr/share/nginx/html dan /etc/nginx di dalam container. Opsi readonly berarti direktori ini hanya dapat diubah di host Docker, bukan dari dalam container.

Baca Juga:  Mengoptimalkan PHP-FPM untuk Performa Tinggi

Menyalin Konten dan File Konfigurasi dari Docker Host

Docker dapat menyalin konten dan file konfigurasi dari direktori lokal di host Docker selama pembuatan container. Setelah wadah dibuat, file dipertahankan dengan membuat container baru ketika file berubah atau dengan memodifikasi file dalam container.

Cara sederhana untuk menyalin file adalah dengan membuat Dockerfile dengan perintah yang dijalankan selama pembuatan image Docker baru berdasarkan image NGINX. Untuk perintah file‑copy (COPY) di Dockerfile, jalur direktori lokal relatif terhadap konteks build tempat Dockerfile berada.

Mari kita asumsikan bahwa direktori konten adalah konten dan direktori untuk file konfigurasi adalah conf, keduanya adalah subdirektori dari direktori tempat Dockerfile berada. image NGINX memiliki file konfigurasi NGINX default, termasuk default.conf, di direktori /etc/nginx/conf.d. Untuk menggunakan file konfigurasi dari host Docker saja, hapus file default dengan perintah RUN:

FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY content /usr/share/nginx/html
COPY conf /etc/nginx

Buat image NGINX dengan menjalankan perintah dari direktori tempat Dockerfile berada. Titik (“.”) di akhir perintah mendefinisikan direktori saat ini sebagai konteks build, yang berisi Dockerfile dan direktori yang akan disalin:

$ docker build -t mynginx_image1 .

Buat container mynginx3 berdasarkan image mynginx_image1:

$ docker run --name mynginx3 -p 80:80 -d mynginx_image1

Untuk membuat perubahan pada file dalam container, gunakan container pembantu seperti yang dijelaskan di bagian berikutnya.

Memelihara Konten dan File Konfigurasi di container

Karena SSH tidak dapat digunakan untuk mengakses container NGINX, untuk mengedit konten atau file konfigurasi secara langsung, Anda perlu membuat container pembantu yang memiliki akses shell. Agar container pembantu memiliki akses ke file, buat image baru yang memiliki volume data Docker yang tepat untuk image:

1. Salin konten nginx dan file konfigurasi dan tentukan volume untuk image dengan Dockerfile:

FROM nginx
COPY content /usr/share/nginx/html
COPY conf /etc/nginx
VOLUME /usr/share/nginx/html
VOLUME /etc/nginx

2. Buat image NGINX baru dengan menjalankan perintah berikut:

$ docker build -t mynginx_image2 .

3. Buat container NGINX mynginx4 berdasarkan image mynginx_image2:

$ docker run --name mynginx4 -p 80:80 -d mynginx_image2

4. Mulai container pembantu mynginx4_files yang memiliki shell, menyediakan akses direktori konten dan konfigurasi container mynginx4 yang baru saja kita buat:

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

di mana:
– container pembantu mynginx4_files baru berjalan di latar depan dengan input standar persisten (opsi -i) dan tty (opsi -t). Semua volume yang didefinisikan dalam mynginx4 dipasang sebagai direktori lokal di container pembantu.
– argumen debian berarti bahwa container pembantu menggunakan image Debian dari Docker Hub. Karena image NGINX juga menggunakan Debian, penggunaan Debian paling efisien untuk container pembantu, daripada meminta Docker memuat sistem operasi lain
– argumen /bin/bash berarti bahwa shell bash berjalan di container pembantu, menampilkan prompt shell yang dapat Anda gunakan untuk memodifikasi file sesuai kebutuhan

Untuk memulai dan menghentikan container, jalankan perintah:

$ docker start mynginx4_files
$ docker stop mynginx4_files

Untuk keluar dari shell tetapi membiarkan container berjalan, tekan Ctrl+p diikuti dengan Ctrl+q. Untuk mendapatkan kembali akses shell ke container yang sedang berjalan, jalankan perintah ini:

$ docker attach mynginx4_files

Mengelola Pencatatan

Secara default, image NGINX dikonfigurasi untuk mengirim log akses dan log kesalahan NGINX ke pengumpul log Docker. Ini dilakukan dengan menautkannya ke stdout dan stderr: semua pesan dari kedua log kemudian ditulis ke file /var/lib/docker/containers/container-ID/container-ID-json.log pada host Docker. ID penampung adalah ID bentuk panjang yang dikembalikan saat Anda membuat penampung. Untuk menampilkan ID formulir panjang, jalankan perintah:

$ docker inspect --format '{{ .Id }}' container-name

Anda dapat menggunakan baris perintah Docker dan Docker Engine API untuk mengekstrak pesan log.

Untuk mengekstrak pesan log dari baris perintah, jalankan perintah:

$ docker logs container-name

Untuk mengekstrak pesan log menggunakan Docker Remote API, kirim permintaan GET menggunakan Docker Unix sock:

$ curl --unix-sock /var/run/docker-sock http://localhost/containers/container-name/logs?stdout=1&stderr=1

konfigurasikan NGINX untuk menyimpan file log di /var/log/nginx/log, tambahkan definisi VOLUME untuk direktori ini ke Dockerfile (asalkan konten dan File konfigurasi dikelola dalam contaner):

FROM nginx
COPY content /usr/share/nginx/html
COPY conf /etc/nginx
VOLUME /var/log/nginx/log

Controlling NGINX

Karena tidak ada akses langsung ke baris perintah container NGINX, perintah NGINX tidak dapat dikirim ke wadah secara langsung. Sebagai gantinya, sinyal dapat dikirim ke container melalui perintah Docker kill.

Untuk memuat ulang konfigurasi NGINX, kirim sinyal HUP ke Docker:

$ docker kill -s HUP container-name

Untuk memulai ulang NGINX, jalankan perintah ini untuk memulai ulang container:

$ docker restart container-name

Deploy NGINX dan NGINX Plus sebagai Docker container.
NGINX Plus, platform pengiriman aplikasi berkinerja tinggi, penyeimbang beban, dan server web, tersedia sebagai Docker Docker.

Menjalankan NGINX Open Source di Docker Container

Anda dapat membuat instance NGINX dalam container Docker menggunakan image NGINX Open Source dari Docker Hub.

1.Luncurkan instance NGINX yang berjalan dalam wadah dan gunakan konfigurasi NGINX default dengan perintah berikut:

$ docker run --name mynginx1 -p 80:80 -d nginx

di mana:
mynginx1 adalah nama wadah yang dibuat berdasarkan gambar NGINX
– opsi -d menentukan bahwa wadah berjalan dalam mode terpisah: wadah terus berjalan hingga berhenti tetapi tidak merespons perintah yang dijalankan pada baris perintah.
– opsi -p memberi tahu Docker untuk memetakan port yang diekspos dalam wadah oleh gambar NGINX (port 80) ke port yang ditentukan pada host Docker. Parameter pertama menentukan port di host Docker, parameter kedua dipetakan ke port yang terbuka di container
Perintah mengembalikan bentuk panjang ID penampung: fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d. Bentuk ID ini digunakan atas nama file log.

2.Verifikasi bahwa container telah dibuat dan dijalankan dengan perintah dock

$ docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED         STATUS        ...  
fcd1fb01b145  nginx:latest  "nginx -g 'daemon of  16 seconds ago  Up 15 seconds ... 
   
    ... PORTS              NAMES
    ... 0.0.0.0:80->80/tcp mynginx1

Perintah ini juga memungkinkan melihat pemetaan port yang ditetapkan pada langkah sebelumnya: bidang PORTS dalam laporan keluaran bahwa port 80 pada host Docker dipetakan ke port 80 dalam container.

Menjalankan NGINX Plus di Docker Container

Docker juga dapat digunakan dengan NGINX Plus. Perbedaan antara menggunakan Docker dengan NGINX Open Source adalah Anda harus membuat image NGINX Plus terlebih dahulu, karena sebagai penawaran komersial NGINX Plus tidak tersedia di Docker Hub.

Catatan: Jangan pernah mengunggah image NGINX Plus Anda ke repositori publik seperti Docker Hub. Melakukannya melanggar perjanjian lisensi Anda.

Membuat image Docker NGINX Plus

Untuk menghasilkan image NGINX Plus:
Buat konteks build Docker, atau Dockerfile:

FROM debian:bullseye-slim

LABEL maintainer="NGINX Docker Maintainers <[email protected]>"

# 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   27
# ENV NJS_VERSION     0.7.4
# 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;"]
FROM alpine:3.16

LABEL maintainer="NGINX Docker Maintainers <[email protected]>"

# 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 27
# ENV NJS_VERSION   0.7.4
# 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;"]

# vim:syntax=Dockerfile

2.Seperti NGINX Open Source, image NGINX Plus default memiliki pengaturan default yang sama:
– akses dan log kesalahan ditautkan ke pengumpul log Docker
– tidak ada volume yang ditentukan: Dockerfile dapat digunakan untuk membuat image dasar dari mana Anda dapat membuat image baru dengan volume yang ditentukan, atau volume dapat ditentukan secara manual:

VOLUME /usr/share/nginx/html
VOLUME /etc/nginx

– tidak ada file yang disalin dari host Docker saat container dibuat: Anda dapat menambahkan definisi COPY ke setiap Dockerfile, atau image yang Anda buat dapat digunakan sebagai dasar untuk image lain

Baca Juga:  Cara menginstal Docker di Debian 11

3.Masuk ke Portal Pelanggan MyF5 dan unduh file nginx-repo.crt dan nginx-repo.key Anda. Untuk uji coba NGINX Plus, file disediakan dengan paket uji coba Anda.

4.Salin file ke direktori tempat Dockerfile berada.

5.Buat image Docker, misalnya, nginxplus (perhatikan periode terakhir dalam perintah).

$ docker build  --no-cache --secret id=nginx-key,src=nginx-repo.key --secret id=nginx-crt,src=nginx-repo.crt -t nginxplus .

Opsi –no-cache memberi tahu Docker untuk membuat image dari awal dan memastikan penginstalan versi terbaru NGINX Plus. Jika Dockerfile sebelumnya digunakan untuk membuat image tanpa opsi –no-cache, image baru menggunakan versi NGINX Plus dari image yang dibuat sebelumnya dari cache Docker.

6.Verifikasi bahwa gambar nginxplus berhasil dibuat dengan perintah Docker image:

$ docker images nginxplus
REPOSITORY  TAG     IMAGE ID      CREATED        SIZE
nginxplus   latest  ef2bf65931cf  6 seconds ago  91.2 MB

7.Buat container berdasarkan image ini, misalnya container mynginxplus:

$ docker run --name mynginxplus -p 80:80 -d nginxplus

8.Verifikasi bahwa wadah mynginxplus aktif dan berjalan dengan perintah docker ps:

$ docker ps
CONTAINER ID  IMAGE             COMMAND               CREATED         STATUS        ...  
eb7be9f439db  nginxplus:latest  "nginx -g 'daemon of  1 minute ago    Up 15 seconds ... 
   
    ... PORTS              NAMES
    ... 0.0.0.0:80->80/tcp mynginxplus

Mengelola Konten dan File Konfigurasi

Konten yang disajikan oleh file konfigurasi NGINX dan NGINX dapat dikelola dengan beberapa cara:

– file disimpan di host Docker
– file disalin dari Host Docker ke wadah
– file disimpan dalam wadah

Memelihara File Konten dan Konfigurasi di Host Docker

Saat container dibuat, Anda dapat memasang direktori lokal di Host Docker ke direktori di container. Gambar NGINX menggunakan konfigurasi NGINX default, yang menggunakan /usr/share/nginx/html sebagai direktori root container dan meletakkan file konfigurasi di /etc/nginx. Untuk Host Docker dengan konten di direktori lokal /var/www dan file konfigurasi di /var/nginx/conf, jalankan perintah:

$ docker run --name mynginx2 --mount type=bind,source=/var/www,target=/usr/share/nginx/html,readonly --mount source=/var/nginx/conf,target=/etc/nginx/conf,readonly -p 80:80 -d nginx

Setiap perubahan yang dibuat pada file di direktori lokal /var/www dan /var/nginx/conf pada Host Docker tercermin dalam direktori /usr/share/nginx/html dan /etc/nginx di dalam container. Opsi readonly berarti direktori ini hanya dapat diubah di host Docker, bukan dari dalam container.

Baca Juga:  Temukan Fitur Terbaru di PHP 8.3

Menyalin Konten dan File Konfigurasi dari Docker Host

Docker dapat menyalin konten dan file konfigurasi dari direktori lokal di host Docker selama pembuatan container. Setelah wadah dibuat, file dipertahankan dengan membuat container baru ketika file berubah atau dengan memodifikasi file dalam container.

Cara sederhana untuk menyalin file adalah dengan membuat Dockerfile dengan perintah yang dijalankan selama pembuatan image Docker baru berdasarkan image NGINX. Untuk perintah file‑copy (COPY) di Dockerfile, jalur direktori lokal relatif terhadap konteks build tempat Dockerfile berada.

Mari kita asumsikan bahwa direktori konten adalah konten dan direktori untuk file konfigurasi adalah conf, keduanya adalah subdirektori dari direktori tempat Dockerfile berada. image NGINX memiliki file konfigurasi NGINX default, termasuk default.conf, di direktori /etc/nginx/conf.d. Untuk menggunakan file konfigurasi dari host Docker saja, hapus file default dengan perintah RUN:

FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY content /usr/share/nginx/html
COPY conf /etc/nginx

Buat image NGINX dengan menjalankan perintah dari direktori tempat Dockerfile berada. Titik (“.”) di akhir perintah mendefinisikan direktori saat ini sebagai konteks build, yang berisi Dockerfile dan direktori yang akan disalin:

$ docker build -t mynginx_image1 .

Buat container mynginx3 berdasarkan image mynginx_image1:

$ docker run --name mynginx3 -p 80:80 -d mynginx_image1

Untuk membuat perubahan pada file dalam container, gunakan container pembantu seperti yang dijelaskan di bagian berikutnya.

Memelihara Konten dan File Konfigurasi di container

Karena SSH tidak dapat digunakan untuk mengakses container NGINX, untuk mengedit konten atau file konfigurasi secara langsung, Anda perlu membuat container pembantu yang memiliki akses shell. Agar container pembantu memiliki akses ke file, buat image baru yang memiliki volume data Docker yang tepat untuk image:

1. Salin konten nginx dan file konfigurasi dan tentukan volume untuk image dengan Dockerfile:

FROM nginx
COPY content /usr/share/nginx/html
COPY conf /etc/nginx
VOLUME /usr/share/nginx/html
VOLUME /etc/nginx

2. Buat image NGINX baru dengan menjalankan perintah berikut:

$ docker build -t mynginx_image2 .

3. Buat container NGINX mynginx4 berdasarkan image mynginx_image2:

$ docker run --name mynginx4 -p 80:80 -d mynginx_image2

4. Mulai container pembantu mynginx4_files yang memiliki shell, menyediakan akses direktori konten dan konfigurasi container mynginx4 yang baru saja kita buat:

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

di mana:
– container pembantu mynginx4_files baru berjalan di latar depan dengan input standar persisten (opsi -i) dan tty (opsi -t). Semua volume yang didefinisikan dalam mynginx4 dipasang sebagai direktori lokal di container pembantu.
– argumen debian berarti bahwa container pembantu menggunakan image Debian dari Docker Hub. Karena image NGINX juga menggunakan Debian, penggunaan Debian paling efisien untuk container pembantu, daripada meminta Docker memuat sistem operasi lain
– argumen /bin/bash berarti bahwa shell bash berjalan di container pembantu, menampilkan prompt shell yang dapat Anda gunakan untuk memodifikasi file sesuai kebutuhan

Untuk memulai dan menghentikan container, jalankan perintah:

$ docker start mynginx4_files
$ docker stop mynginx4_files

Untuk keluar dari shell tetapi membiarkan container berjalan, tekan Ctrl+p diikuti dengan Ctrl+q. Untuk mendapatkan kembali akses shell ke container yang sedang berjalan, jalankan perintah ini:

$ docker attach mynginx4_files

Mengelola Pencatatan

Secara default, image NGINX dikonfigurasi untuk mengirim log akses dan log kesalahan NGINX ke pengumpul log Docker. Ini dilakukan dengan menautkannya ke stdout dan stderr: semua pesan dari kedua log kemudian ditulis ke file /var/lib/docker/containers/container-ID/container-ID-json.log pada host Docker. ID penampung adalah ID bentuk panjang yang dikembalikan saat Anda membuat penampung. Untuk menampilkan ID formulir panjang, jalankan perintah:

$ docker inspect --format '{{ .Id }}' container-name

Anda dapat menggunakan baris perintah Docker dan Docker Engine API untuk mengekstrak pesan log.

Untuk mengekstrak pesan log dari baris perintah, jalankan perintah:

$ docker logs container-name

Untuk mengekstrak pesan log menggunakan Docker Remote API, kirim permintaan GET menggunakan Docker Unix sock:

$ curl --unix-sock /var/run/docker-sock http://localhost/containers/container-name/logs?stdout=1&stderr=1

konfigurasikan NGINX untuk menyimpan file log di /var/log/nginx/log, tambahkan definisi VOLUME untuk direktori ini ke Dockerfile (asalkan konten dan File konfigurasi dikelola dalam contaner):

FROM nginx
COPY content /usr/share/nginx/html
COPY conf /etc/nginx
VOLUME /var/log/nginx/log

Controlling NGINX

Karena tidak ada akses langsung ke baris perintah container NGINX, perintah NGINX tidak dapat dikirim ke wadah secara langsung. Sebagai gantinya, sinyal dapat dikirim ke container melalui perintah Docker kill.

Untuk memuat ulang konfigurasi NGINX, kirim sinyal HUP ke Docker:

$ docker kill -s HUP container-name

Untuk memulai ulang NGINX, jalankan perintah ini untuk memulai ulang container:

$ docker restart container-name

Untuk mendapatkan Berita & Review menarik Saksenengku Network
Google News

Artikel Terkait

Populer

Artikel Terbaru