{"id":137825,"date":"2023-06-25T08:42:46","date_gmt":"2023-06-25T05:42:46","guid":{"rendered":"https:\/\/computingforgeeks.com\/?p=137825"},"modified":"2023-06-25T08:42:51","modified_gmt":"2023-06-25T05:42:51","slug":"run-nginx-in-docker-container-using-bunkerweb","status":"publish","type":"post","link":"https:\/\/computingforgeeks.com\/run-nginx-in-docker-container-using-bunkerweb\/","title":{"rendered":"Running Nginx in Docker Container using BunkerWeb"},"content":{"rendered":"\n<p>Getting started with Docker and Docker networking can present some challenges. One of the initial hurdles is understanding the concepts of container networking, which operates differently from traditional networking. You need to familiarize yourself with concepts like bridges, overlays, network modes, and DNS resolution within Docker. This understanding is crucial to grasp how containers communicate with each other and with the host system.<\/p>\n\n\n\n<p>Another challenge lies in choosing the appropriate networking option. Docker offers various networking options such as bridge networks, host networking, overlay networks, and macvlan networks. Selecting the right option for a specific use case can be challenging, particularly for beginners who are not yet acquainted with the characteristics and implications of each option.<\/p>\n\n\n\n<p>Configuring networking for containers is another area that can pose difficulties. It involves creating and managing Docker networks, assigning IP addresses, defining ports, and linking containers together. Users may struggle with setting up networking configurations correctly, especially when dealing with complex multi-container setups or external connectivity requirements.<\/p>\n\n\n\n<p><strong>BunkerWeb<\/strong> is a web server that is built on the <em>NGINX<\/em> server software and is specifically focused on enhancing security. Familiar to many, NGINX is a web server and reverse proxy server with a reputation for high performance, scalability, and flexibility. It is commonly used to serve web content, handle load balancing, and act as a reverse proxy to distribute incoming requests to backend servers. By building BunkerWeb on top of NGINX, it likely leverages NGINX&#8217;s robust features and capabilities while adding security enhancements and focusing on secure web server configurations.<\/p>\n\n\n\n<p>BunkerWeb provides several features, among them are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Easy Integration into Existing Environments<\/strong>: BunkerWeb seamlessly integrates with Linux, Docker, Swarm, and Kubernetes, making it simple to incorporate into your existing infrastructure and workflow.<\/li>\n\n\n\n<li><strong>Highly Customizable<\/strong>: With BunkerWeb, you have the flexibility to customize and fine-tune its features to meet your specific use case. You can easily enable, disable, and configure different functionalities according to your requirements.<\/li>\n\n\n\n<li><strong>Secure by Default<\/strong>: BunkerWeb prioritizes security by providing out-of-the-box and hassle-free minimal security measures for your web services. It is designed to ensure your applications and data are protected without requiring extensive configuration efforts.<\/li>\n\n\n\n<li><strong>Free as in &#8220;Freedom&#8221;<\/strong>: BunkerWeb is licensed under the free AGPLv3 license, offering you the freedom to use, modify, and distribute the software. This license promotes openness and community collaboration.<\/li>\n\n\n\n<li><strong>Security features such as:<\/strong>\n<ul class=\"wp-block-list\">\n<li>HTTPS Support with Let&#8217;s Encrypt Automation: BunkerWeb seamlessly integrates with Let&#8217;s Encrypt to automate the process of obtaining and renewing SSL\/TLS certificates, ensuring secure communication with HTTPS.<\/li>\n\n\n\n<li>State-of-the-Art Web Security Measures: BunkerWeb implements various advanced web security measures, including HTTP security headers to enhance protection, prevention of information leaks, and robust TLS hardening configurations.<\/li>\n\n\n\n<li>Integrated ModSecurity WAF with OWASP Core Rule Set: BunkerWeb includes an integrated ModSecurity Web Application Firewall (WAF) that leverages the OWASP Core Rule Set, providing an additional layer of defence against web-based attacks and vulnerabilities.<\/li>\n\n\n\n<li>Automatic Behavior-Based Ban: BunkerWeb monitors and detects unusual behaviour from clients and automatically blocks them based on HTTP status codes, helping prevent malicious activities.<\/li>\n\n\n\n<li>Connections and Requests Limit: BunkerWeb allows you to set limits on client connections and requests, helping to mitigate potential abuse or resource exhaustion.<\/li>\n\n\n\n<li>Bot Blocking with Challenge Response: BunkerWeb offers the ability to block bots by presenting them with challenges to solve, such as cookies, JavaScript execution, captchas, hCaptcha, or reCAPTCHA, effectively filtering out automated malicious activities.<\/li>\n\n\n\n<li>Blacklisting Known Bad IPs with External Blacklists and DNSBL: BunkerWeb enables the use of external blacklists and DNS-based blackhole lists (DNSBL) to automatically block connections from known malicious IP addresses.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Now let&#8217;s learn how to run Nginx Web Server in Docker Container using BunkerWeb.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">#1. Install Docker and Docker Compose<\/h2>\n\n\n\n<p>This guide requires you to have Docker Engine and Docker Compose installed. To install Docker, follow the below guide:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/computingforgeeks.com\/solve-error-package-docker-ce-stable-requires-container-selinux\/\" target=\"_blank\" rel=\"noreferrer noopener\">How To Install Docker CE on Linux Systems<\/a><\/li>\n<\/ul>\n\n\n\n<p>After the installation, ensure that docker has been started and enabled:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl enable --now docker<\/code><\/pre>\n\n\n\n<p>You also need to add your system user to the docker group:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo usermod -aG docker $USER\nnewgrp docker<\/code><\/pre>\n\n\n\n<p>Verify the docker installation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-pink-color\">docker version<\/mark>\nClient: Docker Engine - Community\n Version:           23.0.6\n API version:       1.42\n Go version:        go1.19.9\n Git commit:        ef23cbc\n Built:             Fri May  5 21:18:22 2023\n OS\/Arch:           linux\/amd64\n Context:           default\n\nServer: Docker Engine - Community\n Engine:\n  Version:          23.0.6\n  API version:      1.42 (minimum version 1.12)\n  Go version:       go1.19.9\n  Git commit:       9dbdbd4\n  Built:            Fri May  5 21:18:22 2023\n  OS\/Arch:          linux\/amd64\n......<\/code><\/pre>\n\n\n\n<p>You can also install docker-compose using the guide:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/computingforgeeks.com\/how-to-install-latest-docker-compose-on-linux\/\" target=\"_blank\" rel=\"noreferrer noopener\">How To Install Docker Compose on Linux<\/a><\/li>\n<\/ul>\n\n\n\n<p>Once installed, verify with the command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">docker-compose version<\/mark>\nDocker Compose version v2.18.0<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">#2. Provision BunkerWeb Container<\/h2>\n\n\n\n<p>When dealing with BunkerWeb, there are several concepts we need to be aware of. These concepts include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Integrations<\/strong><\/li>\n<\/ul>\n\n\n\n<p>The primary focus is on seamlessly integrating BunkerWeb into the target environment. The term &#8220;integration&#8221; is preferred over &#8220;installation&#8221; since BunkerWeb aims to harmoniously become a part of existing environments. The supported integrations are Docker, Docker autoconf, Swarm, Kubernetes, Linux and Ansible.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Settings<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Once BunkerWeb is seamlessly integrated into your environment, the next step involves configuring it to effectively serve and safeguard your web applications.<\/p>\n\n\n\n<p>Configuration of BunkerWeb revolves around the utilization of &#8220;settings&#8221; or &#8220;variables.&#8221; Each setting is associated with a specific name, such as <strong><em>AUTO_LETS_ENCRYPT<\/em><\/strong> or <em><strong>USE_ANTIBOT<\/strong><\/em>, for instance. By assigning values to these settings, you can tailor BunkerWeb to meet your specific configuration requirements.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Multisite mode<\/strong><\/li>\n<\/ul>\n\n\n\n<p>When utilizing BunkerWeb, understanding the concept of multisite mode becomes essential. The primary objective of safeguarding web applications naturally incorporates the notion of &#8220;virtual host&#8221; or &#8220;vhost&#8221; (further information available here). This concept enables the seamless hosting of multiple web applications from a single instance or a cluster. By employing multisite mode, BunkerWeb empowers you to efficiently serve and protect multiple web applications simultaneously.<\/p>\n\n\n\n<p>When running BunkerWeb in docker containers, we observe the below architecture:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/BunkerWeb-docker.png\" alt=\"\" class=\"wp-image-137830\" width=\"560\" height=\"276\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/BunkerWeb-docker.png 560w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/BunkerWeb-docker-300x148.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/BunkerWeb-docker-324x160.png 324w\" sizes=\"auto, (max-width: 560px) 100vw, 560px\" \/><\/figure>\n\n\n\n<p>The utilization and configuration of the BunkerWeb container revolve around the following components:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Environment Variables<\/strong>: BunkerWeb allows you to configure and customize its behaviour using environment variables. These variables provide a flexible way to adapt BunkerWeb to your specific use cases and requirements.<\/li>\n\n\n\n<li><strong>Volume<\/strong>: BunkerWeb utilizes volumes to cache critical data and facilitate the mounting of custom configuration files. This enables you to persist important information and easily incorporate your own tailored configuration files into the BunkerWeb container.<\/li>\n\n\n\n<li><strong>Networks<\/strong>: BunkerWeb employs networks to expose ports, allowing clients to access the web services served by BunkerWeb. Additionally, networks enable seamless connectivity to upstream web services, ensuring smooth communication between BunkerWeb and other components of your environment.<\/li>\n<\/ul>\n\n\n\n<p>Now we will begin by creating a network for BunkerWeb:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker network create <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-orange-color\">bw-net<\/mark><\/code><\/pre>\n\n\n\n<p>We also need to create a volume for BunkerWeb. Begin by creating a path on your host:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-orange-color\"> <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-cyan-blue-color\">\/bw-datastore<\/mark><\/mark>\nsudo chmod 775 -R <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-orange-color\"> <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-cyan-blue-color\">\/bw-datastore<\/mark><\/mark>\nsudo chown -R $USER:docker<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-orange-color\">  <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-cyan-blue-color\">\/bw-datastore<\/mark><\/mark><\/code><\/pre>\n\n\n\n<p>For <strong>Rhel-based<\/strong> systems, configure SELinux as shown:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chcon -R -t svirt_sandbox_file_t <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-cyan-blue-color\">\/bw-datastore<\/mark><\/code><\/pre>\n\n\n\n<p>Now create a docker volume:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker volume create --driver local \\\n     --opt type=none \\\n     --opt device= <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-cyan-blue-color\">\/bw-datastore<\/mark> \\\n     --opt o=bind bw-data<\/code><\/pre>\n\n\n\n<p>View the volume;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-pink-color\">docker volume ls<\/mark>\nDRIVER    VOLUME NAME\nlocal     bw-data<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">#3. Run BunkerWeb Docker Container<\/h2>\n\n\n\n<p>Now to run and verify that BunkerWeb is working perfectly, we need to deploy and application for the test. For this demo, we can use a sample app then create reverse proxy using Bunkerweb.<\/p>\n\n\n\n<p>Now we will proceed and run the BunkerWeb Docker container. This can be done in two ways:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uisng Docker CLI<\/li>\n\n\n\n<li>Using Docker Compose<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Option 1: Run BunkerWeb Using Docker CLI<\/h3>\n\n\n\n<p>Begin by spinning the demon app with the command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d \\\n       --name myapp \\\n       --network bw-net \\\n       nginxdemos\/hello:plain-text<\/code><\/pre>\n\n\n\n<p>Then spin the BunkerWeb container with the command bearing the below syntax:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d \\\n       --name <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-cyan-blue-color\">mybunker<\/mark> \\\n       --network <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">bw-net<\/mark> \\\n       -p 80:8080 \\\n       -p 443:8443 \\\n       -v bw-data:\/data \\\n       -e SERVER_NAME=<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">web.computingforgeeks.com<\/mark> \\\n       -e USE_REVERSE_PROXY=yes \\\n       -e REVERSE_PROXY_URL=\/ \\\n       -e REVERSE_PROXY_HOST=http:\/\/myapp \\\n       bunkerity\/bunkerweb:1.4.8<\/code><\/pre>\n\n\n\n<p>In the above command, we have set reverse proxy for the app we deployed earlier on the URL <em><strong>http:\/\/myapp<\/strong><\/em>.<\/p>\n\n\n\n<p>View if the containers are running:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-pink-color\">docker ps<\/mark>\nCONTAINER ID   IMAGE                         COMMAND                  CREATED         STATUS                            PORTS                                                                                    NAMES\n1a4dbded0a42   bunkerity\/bunkerweb:1.4.8     \"\/opt\/bunkerweb\/help\u2026\"   3 seconds ago   Up 2 seconds (health: starting)   80\/tcp, 0.0.0.0:80->8080\/tcp, :::80->8080\/tcp, 0.0.0.0:443->8443\/tcp, :::443->8443\/tcp   mybunker\nb669d3fa1eb4   nginxdemos\/hello:plain-text   \"\/docker-entrypoint.\u2026\"   4 minutes ago   Up 4 minutes                      80\/tcp                                                                                   myapp<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Option 2: Run BunkerWeb Using Docker Compose<\/h3>\n\n\n\n<p>It is also possible to run the BunkerWeb and the test app containers using a single Docker Compose file. First, create the file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vim docker-compose.yml<\/code><\/pre>\n\n\n\n<p>In the file, add the lines below, replacing where required:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3'\n\nservices:\n  mybunker:\n    container_name: <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">mybunker<\/mark>\n    image: bunkerity\/bunkerweb:1.4.8\n    ports:\n      - 80:8080\n      - 443:8443\n    volumes:\n      - bw-data:\/data\n    environment:\n      - SERVER_NAME=<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-cyan-blue-color\">web.computingforgeeks.com<\/mark>\n      - USE_REVERSE_PROXY=yes\n      - REVERSE_PROXY_URL=\/\n      - REVERSE_PROXY_HOST=http:\/\/myapp\n    networks:\n      - bw-net\n\n  myapp:\n    container_name: <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">myapp<\/mark>\n    image: nginxdemos\/hello:plain-text\n    networks:\n      - bw-net\n\nvolumes:\n  bw-data:\n\nnetworks:\n  bw-net:\n    name: bw-net<\/code><\/pre>\n\n\n\n<p>Save the file and run the containers with the command:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose up -d<\/code><\/pre>\n\n\n\n<p>View if the containers are running:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-pink-color\"> docker-compose ps<\/mark>\nNAME                IMAGE                         COMMAND                  SERVICE             CREATED             STATUS                    PORTS\nthor-myapp-1        nginxdemos\/hello:plain-text   \"\/docker-entrypoint.\u2026\"   myapp               22 seconds ago      Up 21 seconds             80\/tcp\nthor-mybunker-1     bunkerity\/bunkerweb:1.4.8     \"\/opt\/bunkerweb\/help\u2026\"   mybunker            22 seconds ago      Up 21 seconds (healthy)   80\/tcp, 0.0.0.0:80->8080\/tcp, :::80->8080\/tcp, 0.0.0.0:443->8443\/tcp, :::443->8443\/tcp<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Test Access to Appication<\/h3>\n\n\n\n<p>If the containers are running, we can test if BunkerWeb is handling the requests as desired. We can use cURL as shown:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl web.computingforgeeks.com<\/code><\/pre>\n\n\n\n<p>Sample Output:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"922\" height=\"398\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-1.png\" alt=\"\" class=\"wp-image-137841\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-1.png 922w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-1-300x130.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-1-768x332.png 768w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-1-696x300.png 696w\" sizes=\"auto, (max-width: 922px) 100vw, 922px\" \/><\/figure>\n\n\n\n<p>You can also load the page on your browser using the URL <a href=\"https:\/\/.computingforgeeks.com\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/web.computingforgeeks.com<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"922\" height=\"398\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb.png\" alt=\"\" class=\"wp-image-137840\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb.png 922w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-300x130.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-768x332.png 768w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-696x300.png 696w\" sizes=\"auto, (max-width: 922px) 100vw, 922px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">#4. Run BunkerWeb Containers With Multiple Applications<\/h2>\n\n\n\n<p>There are scenarios where you have several applications that need a reverse proxy. BunkerWeb is capable of handling the traffic and proxy the requests as required.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>For Docker CLI<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Begin by spinning the apps:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">##APP1\n<\/mark><\/em>docker run -d \\\n       --name myapp1 \\\n       --network bw-net \\\n       nginxdemos\/hello:plain-text\n\n<em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">##APP2\n<\/mark><\/em>docker run -d \\\n       --name myapp2 \\\n       --network bw-net \\\n       nginxdemos\/hello:plain-text\n\n<em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">##APP3\n<\/mark><\/em>docker run -d \\\n       --name myapp3 \\\n       --network bw-net \\\n       nginxdemos\/hello:plain-text<\/code><\/pre>\n\n\n\n<p>Proceed and spin BunkerWeb:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d \\\n       --name mybunker \\\n       --network bw-net \\\n       -p 80:8080 \\\n       -p 443:8443 \\\n       -v bw-data:\/data \\\n       -e MULTISITE=yes \\\n       -e \"SERVER_NAME=myapp1.computingforgeeks.com myapp2.computingforgeeks.com myapp3.computingforgeeks.com\" \\\n       -e USE_REVERSE_PROXY=yes \\\n       -e REVERSE_PROXY_URL=\/ \\\n       -e myapp1.computingforgeeks.com_REVERSE_PROXY_HOST=http:\/\/myapp1 \\\n       -e myapp2.computingforgeeks.com_REVERSE_PROXY_HOST=http:\/\/myapp2 \\\n       -e myapp3.computingforgeeks.com_REVERSE_PROXY_HOST=http:\/\/myapp3 \\\n       bunkerity\/bunkerweb:1.4.8<\/code><\/pre>\n\n\n\n<p>View if the containers are running:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-pink-color\">docker ps<\/mark>\nCONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS                            PORTS                                                                                    NAMES\n56cb582c7d5e   bunkerity\/bunkerweb:1.4.8     \"\/opt\/bunkerweb\/help\u2026\"   5 seconds ago    Up 4 seconds (health: starting)   80\/tcp, 0.0.0.0:80->8080\/tcp, :::80->8080\/tcp, 0.0.0.0:443->8443\/tcp, :::443->8443\/tcp   mybunker\n42d995f8acb6   nginxdemos\/hello:plain-text   \"\/docker-entrypoint.\u2026\"   20 seconds ago   Up 19 seconds                     80\/tcp                                                                                   myapp3\n6ab7df943bf2   nginxdemos\/hello:plain-text   \"\/docker-entrypoint.\u2026\"   24 seconds ago   Up 23 seconds                     80\/tcp                                                                                   myapp2\n4e84d030f8c9   nginxdemos\/hello:plain-text   \"\/docker-entrypoint.\u2026\"   28 seconds ago   Up 27 seconds                     80\/tcp                                                                                   myapp1<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Using Docker Compose<\/strong><\/li>\n<\/ul>\n\n\n\n<p>You can spin all your apps and BunkerWeb with a single file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>vim docker-compose.yml<\/code><\/pre>\n\n\n\n<p>Add the lines below to it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3'\n\nservices:\n  mybunker:\n    container_name: mybunker\n    image: bunkerity\/bunkerweb:1.4.8\n    ports:\n      - 80:8080\n      - 443:8443\n    volumes:\n      - bw-data:\/data\n    environment:\n      - MULTISITE=yes\n      - SERVER_NAME=myapp1.computingforgeeks.com myapp2.computingforgeeks.com myapp3.computingforgeeks.com\n      - USE_REVERSE_PROXY=yes\n      - REVERSE_PROXY_URL=\/\n      - myapp1.computingforgeeks.com_REVERSE_PROXY_HOST=http:\/\/myapp1\n      - myapp2.computingforgeeks.com_REVERSE_PROXY_HOST=http:\/\/myapp2\n      - myapp3.computingforgeeks.com_REVERSE_PROXY_HOST=http:\/\/myapp3\n    networks:\n      - bw-net\n\n  myapp1:\n    container_name: myapp1\n    image: nginxdemos\/hello:plain-text\n    networks:\n      - bw-net\n\n  myapp2:\n    container_name: myapp2\n    image: nginxdemos\/hello:plain-text\n    networks:\n      - bw-net\n\n  myapp3:\n    container_name: myapp3\n    image: nginxdemos\/hello:plain-text\n    networks:\n      - bw-net\n\nvolumes:\n  bw-data:\n\nnetworks:\n  bw-net:\n    name: bw-net<\/code><\/pre>\n\n\n\n<p>Run the containers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose up -d<\/code><\/pre>\n\n\n\n<p>View if the containers are up:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-pink-color\">docker ps<\/mark>\nCONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS                    PORTS                                                                                    NAMES\n385de3ddfa7b   nginxdemos\/hello:plain-text   \"\/docker-entrypoint.\u2026\"   21 seconds ago   Up 19 seconds             80\/tcp                                                                                   myapp1\n0e3f8980f23b   nginxdemos\/hello:plain-text   \"\/docker-entrypoint.\u2026\"   21 seconds ago   Up 19 seconds             80\/tcp                                                                                   myapp3\n25dd1f4be099   nginxdemos\/hello:plain-text   \"\/docker-entrypoint.\u2026\"   21 seconds ago   Up 19 seconds             80\/tcp                                                                                   myapp2\n4c3fdf996b05   bunkerity\/bunkerweb:1.4.8     \"\/opt\/bunkerweb\/help\u2026\"   21 seconds ago   Up 19 seconds (healthy)   80\/tcp, 0.0.0.0:80->8080\/tcp, :::80->8080\/tcp, 0.0.0.0:443->8443\/tcp, :::443->8443\/tcp   mybunker<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Test Access to the Applications<\/h3>\n\n\n\n<p>To test if you are able to access the sites, first, modify your \/etc\/hosts file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-pink-color\">sudo vim \/etc.hosts<\/mark>\n192.168.200.51 myapp1.computingforgeeks.com myapp2.computingforgeeks.com myapp3.computingforgeeks.com<\/code><\/pre>\n\n\n\n<p>Now you can use cURL as shown below to verify if BunkerWeb is working:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl myapp1.computingforgeeks.com \ncurl myapp2.computingforgeeks.com \ncurl myapp3.computingforgeeks.com<\/code><\/pre>\n\n\n\n<p>Sample Output:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"932\" height=\"432\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-2.png\" alt=\"\" class=\"wp-image-137842\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-2.png 932w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-2-300x139.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-2-768x356.png 768w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-2-696x323.png 696w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-2-906x420.png 906w\" sizes=\"auto, (max-width: 932px) 100vw, 932px\" \/><\/figure>\n\n\n\n<p>You can also use a web browser with the required URL for example:<\/p>\n\n\n\n<p>APP1:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"932\" height=\"432\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-3.png\" alt=\"\" class=\"wp-image-137843\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-3.png 932w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-3-300x139.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-3-768x356.png 768w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-3-696x323.png 696w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-3-906x420.png 906w\" sizes=\"auto, (max-width: 932px) 100vw, 932px\" \/><\/figure>\n\n\n\n<p>APP2<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"932\" height=\"432\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-4.png\" alt=\"\" class=\"wp-image-137844\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-4.png 932w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-4-300x139.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-4-768x356.png 768w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-4-696x323.png 696w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-4-906x420.png 906w\" sizes=\"auto, (max-width: 932px) 100vw, 932px\" \/><\/figure>\n\n\n\n<p>APP3<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"932\" height=\"432\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-5.png\" alt=\"\" class=\"wp-image-137845\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-5.png 932w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-5-300x139.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-5-768x356.png 768w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-5-696x323.png 696w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-5-906x420.png 906w\" sizes=\"auto, (max-width: 932px) 100vw, 932px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">#5. Configure HTTPS on BunkerWeb<\/h2>\n\n\n\n<p>It is also important to secure traffic using HTTPS. BunkerWeb allows you to use Let&#8217;s Encrypt, Custom certificate and Self-signed certs when protecting your traffic.<\/p>\n\n\n\n<p>To enable HTTPS, you can use the below environment variables:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Setting<\/th><th>Default<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>REDIRECT_HTTP_TO_HTTPS<\/td><td>no<\/td><td>If set to&nbsp;<code>yes<\/code>, will redirect every HTTP request to HTTPS even if BunkerWeb is not configured with HTTPS.<\/td><\/tr><tr><td>AUTO_REDIRECT_HTTP_TO_HTTPS<\/td><td>yes<\/td><td>If set to&nbsp;<code>yes<\/code>, will redirect every HTTP request to HTTPS only if BunkerWeb is configured with HTTPS.<\/td><\/tr><tr><td>HTTPS_PROTOCOLS<\/td><td>TLSv1.2 TLSv1.3<\/td><td>This is the list of supported SSL\/TLS protocols when HTTPS is enabled.<\/td><\/tr><tr><td>HTTP2<\/td><td>yes<\/td><td>If set to&nbsp;<code>yes<\/code>, will enable HTTP2 protocol support when using HTTPS.<\/td><\/tr><tr><td>LISTEN_HTTP<\/td><td>yes<\/td><td>If set to&nbsp;<code>no<\/code>, BunkerWeb will not listen for HTTP requests. Useful if you want HTTPS only for example.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>To use a desired certificate, you need to declare it in your configuration as an environment variable. This can be done as shown:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Let&#8217;s Encrypt<\/strong><\/li>\n<\/ul>\n\n\n\n<p>BunkerWeb has an automatic Let&#8217;s Encrypt certificate generation and renewal. It makes it so easy to get HTTPS working out of the box for public-facing web applications. For this to work, you need to have an FQDN. Below is a list of the environment variables involved:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Setting<\/th><th>Default<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>AUTO_LETS_ENCRYPT<\/td><td>no<\/td><td>if set to&nbsp;<code>yes<\/code>, HTTPS will be enabled with automatic certificate generation and renewal from Let&#8217;s Encrypt.<\/td><\/tr><tr><td>EMAIL_LETS_ENCRYPT<\/td><td>contact@{FIRST_SERVER}<\/td><td>This is the email address to be used when generating certificates. Let&#8217;s Encrypt will send notifications to that email such as certificate expiration.<\/td><\/tr><tr><td>USE_LETS_ENCRYPT_STAGING<\/td><td>no<\/td><td>If set to&nbsp;<code>yes<\/code>, the staging server of Let&#8217;s Encrypt will be used instead of the production one. Useful when doing development tests to avoid being &#8220;blocked&#8221; due to limits.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Custom certificate<\/strong><\/li>\n<\/ul>\n\n\n\n<p>This option applies to those who want to use their own certificates. The environment variables used here are:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Setting<\/th><th>Default<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>USE_CUSTOM_HTTPS<\/td><td>no<\/td><td>If set to&nbsp;<code>yes<\/code>, HTTPS will be enabled with custom certificates. BunkerWeb will also check every day if the custom certificate specified in <strong><em>CUSTOM_HTTPS_CERT <\/em><\/strong>is modified and reload NGINX for that case.<\/td><\/tr><tr><td>CUSTOM_HTTPS_CERT<\/td><td><\/td><td>The full path to the certificate. If you have one or more intermediate certificate(s) in your chain of trust, you will need to provide the bundle (more info&nbsp;<a href=\"https:\/\/nginx.org\/en\/docs\/http\/configuring_https_servers.html#chains\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>).<\/td><\/tr><tr><td>CUSTOM_HTTPS_KEY<\/td><td><\/td><td>The full path to the private key.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Self-signed<\/strong><\/li>\n<\/ul>\n\n\n\n<p>If you do not have a Fully Qualified Domain name, you can still protect your traffic on BunkerWeb. The related settings are:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Setting<\/th><th>Default<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td>GENERATE_SELF_SIGNED_SSL<\/td><td>no<\/td><td>If set to&nbsp;<code>yes<\/code>, HTTPS will be enabled with automatic self-signed certificate generation and renewal from Let&#8217;s Encrypt.<\/td><\/tr><tr><td>SELF_SIGNED_SSL_EXPIRY<\/td><td>365<\/td><td>This is the number of days for the certificate expiration (<strong>-days<\/strong>&nbsp;value used with&nbsp;<strong>openssl<\/strong>).<\/td><\/tr><tr><td>SELF_SIGNED_SSL_SUBJ<\/td><td>\/CN=myapp.computingforgeeks.com\/<\/td><td>This is the certificate subject to use (<strong>-subj<\/strong>&nbsp;value used with&nbsp;<strong>openssl<\/strong>).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>To test if this works, we can modify our docker-compose file and add the lines in the environment section for BunkerWeb:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-pale-pink-color\">vim docker-compose.yml<\/mark>\nversion: '3'\n\nservices:\n  mybunker:\n    container_name: mybunker\n    image: bunkerity\/bunkerweb:1.4.8\n    ports:\n      - 80:8080\n      - 443:8443\n    volumes:\n      - bw-data:\/data\n    environment:\n<em>  <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">    - SERVER_NAME=web.computingforgeeks.com\n      - USE_REVERSE_PROXY=yes\n      - REVERSE_PROXY_URL=\/\n      - REVERSE_PROXY_HOST=http:\/\/myapp\n      - AUTO_REDIRECT_HTTP_TO_HTTPS=yes\n      - GENERATE_SELF_SIGNED_SSL=yes\n      - SELF_SIGNED_SSL_EXPIRY=365\n      - SELF_SIGNED_SSL_SUBJ=\/CN=web.computingforgeeks.com\/<\/mark><\/em>\n........<\/code><\/pre>\n\n\n\n<p>Apply the changes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose up -d<\/code><\/pre>\n\n\n\n<p>Now verify if you are able to access the app using HTTPS:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"932\" height=\"432\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-6.png\" alt=\"\" class=\"wp-image-137849\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-6.png 932w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-6-300x139.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-6-768x356.png 768w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-6-696x323.png 696w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2023\/05\/Nginx-Web-Server-in-Docker-Container-using-BunkerWeb-6-906x420.png 906w\" sizes=\"auto, (max-width: 932px) 100vw, 932px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>That marks the end of this detailed guide on how to run Nginx Web Server in Docker Container using BunkerWeb. This will help solve the networking complexity involved when dealing with complex multi-container setups or external connectivity requirements. I hope this was informative.<\/p>\n\n\n\n<p>See more:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/computingforgeeks.com\/hosting-php-applications-on-linux-with-apache-nginx\/\" target=\"_blank\" rel=\"noreferrer noopener\">Hosting PHP Applications on Linux with Apache \/ Nginx Web Server<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/computingforgeeks.com\/detect-malicious-traffic-in-your-network-using-maltrail\/\" target=\"_blank\" rel=\"noreferrer noopener\">Detect Malicious traffic in your Network using Maltrail<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/computingforgeeks.com\/install-plausible-analytics-on-linux-alternative-to-google-analytics\/\" target=\"_blank\" rel=\"noreferrer noopener\">How To Run Plausible Analytics in a Docker Container<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Getting started with Docker and Docker networking can present some challenges. One of the initial hurdles is understanding the concepts of container networking, which operates differently from traditional networking. You need to familiarize yourself with concepts like bridges, overlays, network modes, and DNS resolution within Docker. This understanding is crucial to grasp how containers communicate &#8230; <a title=\"Running Nginx in Docker Container using BunkerWeb\" class=\"read-more\" href=\"https:\/\/computingforgeeks.com\/run-nginx-in-docker-container-using-bunkerweb\/\" aria-label=\"Read more about Running Nginx in Docker Container using BunkerWeb\">Read more<\/a><\/p>\n","protected":false},"author":21,"featured_media":137830,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[316,27,299,832,349],"tags":[38644],"class_list":["post-137825","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-containers","category-docker","category-how-to","category-tech","category-web-hosting","tag-bunkerweb"],"_links":{"self":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/137825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/comments?post=137825"}],"version-history":[{"count":0,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/137825\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media\/137830"}],"wp:attachment":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media?parent=137825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/categories?post=137825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/tags?post=137825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}