Maintenant que j'ai enfin commencé à apprendre Docker, je vais résumer ma compréhension.
Lancez un conteneur qui exécute express avec node.js et un conteneur qui exécute nginx sur le PC local. Ensuite, appuyez sur l'API express via nginx. Je l'ai fait avec docker-compose.
Dernière fois a dû être porté pour accéder au conteneur express.
curl http://localhost:3000
Hello
Cette fois, en utilisant la fonction proxy de nginx, il est possible d'accéder au conteneur express sans spécifier le port.
curl http://:localhost
Hello
cd ~
mkdir sample
Développez dans le répertoire des exemples. Le contenu du répertoire ressemble à ceci. Les répertoires d'application et Web sont respectivement les conteneurs express et nginx.
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.Je ne veux pas faire l'installation de npm après avoir copié json à chaque fois que je construis.
#Par conséquent, après avoir terminé ce qui précède, COPY. .Fais le.
#Ensuite, la construction ne sera exécutée que pour la partie où le code est modifié.
EXPOSE 3000
CMD [ "node", "index.js" ]
Les demandes de proxy qui arrivent à tous les points de terminaison (/) de localhost 80port (c'est-à-dire le port par défaut de http) dans le conteneur nginx vers http: // app: 3000
.
Notez que le domaine du conteneur d'application est app sous le contrôle de Docker.
Au fait, ce nom de fichier de paramètres est fixé dans nginx.conf
. Si l'emplacement se trouve sous le répertoire Web, cela n'a pas d'importance.
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'
#Spécifiez 3 sans penser à rien
services:
app:
build:
context: ./app
# docker-compose.Vu de yml./Construire selon le Dockerfile dans l'application
container_name: express-app
#Donnez un nom de conteneur pour le moment
ports:
- '3000:3000'
# docker run -p 3000:Avec 3000 app
volumes:
- './app:/usr/src/app'
#Sur le PC local./Le dossier de l'application et à l'intérieur du conteneur~/usr/src/Synchronisez le dossier de l'application.
# docker exec -it express-Vous pouvez vérifier avec l'application sh
web:
image: nginx:latest
#nginx:Une erreur se produira avec alpilne, donc la dernière version sera utilisée.
container_name: nginx-web
ports:
- '80:80'
volumes:
- './web/reverse_proxy/nginx.conf:/etc/nginx/nginx.conf'
#Sur le PC local./web/reverse_proxy/nginx.conf et dans le conteneur~/etc/nginx/nginx.Synchronisez la conf.
# ~/etc/nginx/nginx.conf est une spécification d'emplacement.
links:
- app
depends_on:
- app
#Clarification de la dépendance selon laquelle cela ne fonctionnera que si le conteneur d'application est démarré.
docker-compose up
lancera le conteneur.
Si vous tapez la commande curl à partir de votre PC local, vous obtiendrez une réponse du conteneur d'application. Comme le montre la première figure.
curl http://localhost
Hello
En passant, vous pouvez également accéder directement au conteneur d'application. Bien sûr.
curl http://localhost:3000
Hello
J'ai résumé les bases pendant les bases.
Au fait, j'étais désespéré parce que nginx n'a pas bien démarré, peu importe le nombre de fois que j'ai essayé, mais quand j'ai fait docker ps
, un mystérieux conteneur appelé k8s_controller_ingress-nginx-controller
(je pense que c'est une entrée de kubernetes) J'ai remarqué que ça ne s'arrête pas même si j'arrête docker. Le redémarrage de kubernetes l'a corrigé, donc s'il y a une telle situation, je pense que c'est une bonne idée de l'essayer.
Merci beaucoup.
Recommended Posts