Zusammenfassung des Docker-Verständnisses für Anfänger ③ ~ Bis die API mit nginx ~ als Proxy erstellt wird

Einführung

Nachdem ich endlich angefangen habe, Docker zu lernen, fasse ich mein Verständnis zusammen.

Beachten Sie, was Sie heute gelernt haben

Starten Sie einen Container, der Express mit node.js ausführt, und einen Container, der nginx auf dem lokalen PC ausführt. Dann drücken Sie die Express-API über Nginx. Ich habe genau das mit Docker-Compose gemacht.

Unterschied zwischen dem letzten Mal und diesem Mal

Letztes Mal musste portiert werden, um auf den Express-Container zugreifen zu können.

curl http://localhost:3000
Hello

スクリーンショット 2020-10-22 22.22.35.png

Dieses Mal ist es mit der Proxy-Funktion von nginx möglich, auf den Express-Container zuzugreifen, ohne den Port anzugeben.

curl http://:localhost
Hello

スクリーンショット 2020-10-23 8.32.39.png

Überblick über die Entwicklung

cd ~
mkdir sample

Entwickeln Sie im Beispielverzeichnis. Der Inhalt des Verzeichnisses sieht folgendermaßen aus. Die App- und Webverzeichnisse sind die Express- bzw. Nginx-Container. スクリーンショット 2020-10-23 8.24.02.png

index.js


const express = require('express');
const app = express();
app.get('/', (req, res) => {
  res.send('Hello').status(200);
});

app.listen(3000, () => {
  console.log('Listening on port 3000');
});

Express Backend Dockerfile Vorbereitung

FROM node:alpine

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .
# package.Ich möchte nicht npm installieren, nachdem ich json jedes Mal kopiert habe, wenn ich baue.
#KOPIEREN Sie daher nach Abschluss des obigen Vorgangs. .Tu es.
#Dann wird der Build nur für den Teil ausgeführt, in dem der Code geändert wird.

EXPOSE 3000
CMD [ "node", "index.js" ]

Nginx.conf vorbereiten

Proxy-Anforderungen, die an alle Endpunkte (/) von localhost 80port (dh den Standardport von http) im Nginx-Container an http: // app: 3000 gesendet werden. Beachten Sie, dass die Domäne des App-Containers eine App ist, die von Docker gesteuert wird. Dieser Name der Einstellungsdatei ist übrigens in nginx.conf festgelegt. Wenn sich der Speicherort unter dem Webverzeichnis befindet, spielt dies keine Rolle.

nginx.conf



user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 1024;
}

http {
	# Weather Report Reverse Proxy
         server {
            listen 80;
            server_name localhost 127.0.0.1;

            location / {
                proxy_pass          http://app:3000;
                proxy_set_header    X-Forwarded-For $remote_addr;
            }

        }
}

Docker-compose.yml vorbereiten

docker-compose.yml


version: '3'
#Geben Sie 3 an, ohne an etwas zu denken
services:
  app:
    build:
      context: ./app
      # docker-compose.Von yml aus gesehen./Erstellen Sie gemäß der Docker-Datei in der App
    container_name: express-app
    #Geben Sie vorerst einen Containernamen an
    ports:
      - '3000:3000'
      # docker run -p 3000:Mit 3000 App
    volumes:
      - './app:/usr/src/app'
      #Auf dem lokalen PC./Der App-Ordner und im Container~/usr/src/Synchronisieren Sie den App-Ordner.
      # docker exec -it express-Sie können mit App sh überprüfen

  web:
    image: nginx:latest 
    #nginx:Bei alpilne tritt ein Fehler auf, sodass die neueste Version verwendet wird.
    container_name: nginx-web
    ports:
      - '80:80'
    volumes:
      - './web/reverse_proxy/nginx.conf:/etc/nginx/nginx.conf'
      #Auf dem lokalen PC./web/reverse_proxy/nginx.conf und im behälter~/etc/nginx/nginx.Synchronisieren Sie conf.
      # ~/etc/nginx/nginx.conf ist eine Standortspezifikation.
    links:
      - app
    depends_on:
      - app
      #Es wurde die Abhängigkeit geklärt, dass es nur funktioniert, wenn der App-Container gestartet wird.

Docker-komponieren und fertig

docker-compose up startet den Container. Wenn Sie den Befehl curl von Ihrem lokalen PC aus eingeben, erhalten Sie eine Antwort vom App-Container. Wie in der ersten Abbildung gezeigt.

curl http://localhost
Hello

Sie können übrigens auch direkt auf den App-Container zugreifen. Natürlich.

curl http://localhost:3000
Hello

Schließlich

Ich habe die Grundlagen während der Grundlagen zusammengefasst. Übrigens war ich verzweifelt, weil Nginx nicht gut gestartet ist, egal wie oft ich es versucht habe, aber als ich "Docker ps" gemacht habe, einen mysteriösen Container namens "k8s_controller_ingress-nginx-controller" (oder besser gesagt, es scheint das Eindringen von Kubernetes zu sein) Mir ist aufgefallen, dass es nicht aufhört, auch wenn ich "Docker aufhöre". Durch einen Neustart von kubernetes wurde das Problem behoben. Wenn also eine solche Situation vorliegt, ist es meiner Meinung nach eine gute Idee, es zu versuchen.

スクリーンショット 2020-10-23 9.33.31.png

Vielen Dank.

Recommended Posts

Zusammenfassung des Docker-Verständnisses für Anfänger ③ ~ Bis die API mit nginx ~ als Proxy erstellt wird
Zusammenfassung des Docker-Verständnisses für Anfänger do ~ Docker-Compose ~
Zusammenfassung des Docker-Verständnisses für Anfänger do ~ Docker-Run -p ~
Zusammenfassung des Docker-Verständnisses für Anfänger Until ~ Bis zur Bereitstellung eines Docker-Containers auf einer EC2-Instanz ~
Zusammenfassung des Docker-Verständnisses für Anfänger ④ ~ Bis die EC2-Instanz gestartet und der Docker installiert ist ~
Zusammenfassung des Docker-Verständnisses für Anfänger Until ~ Bis zur automatischen Bereitstellung des Docker-Containers für die EC2-Instanz mit CodeDeploy und CodePipeline ~
Einfache Installation von Nginx und Docker mit ansible
Zusammenfassung der Verwendung von FragmentArgs
Zusammenfassung der Verwendung von DBFlow
Bis Sie nginx unter CentOS mit Docker unter Mac OS starten
[Java] Anfängerverständnis von Servlet-②
Zusammenfassung der Verwendung von ButterKnife
Objektorientierte Zusammenfassung von Anfängern (Java)
[Für Anfänger] Zusammenfassung des Java-Konstruktors
[Rails] Einführung von Rubocop durch Anfänger
Entwicklung von Flink mit der DataStream-API
Zusammenfassung häufig verwendeter Docker-Befehle
Zusammenfassung der objektorientierten Programmierung mit Java
Erstellen Sie mit Docker eine Umgebung für "API-Entwicklung + API-Überprüfung mithilfe der Swagger-Benutzeroberfläche"