Nachdem ich endlich angefangen habe, Docker zu lernen, fasse ich mein Verständnis zusammen.
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.
Letztes Mal musste portiert werden, um auf den Express-Container zugreifen zu können.
curl http://localhost:3000
Hello
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
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.
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');
});
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" ]
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
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-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
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.
Vielen Dank.
Recommended Posts