Résumé de la compréhension de Docker par les débutants ③ ~ Jusqu'à l'API de proxy à l'aide de nginx ~

introduction

Maintenant que j'ai enfin commencé à apprendre Docker, je vais résumer ma compréhension.

Notez ce que vous avez appris aujourd'hui

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.

Différence entre la dernière fois et cette fois

Dernière fois a dû être porté pour accéder au conteneur express.

curl http://localhost:3000
Hello

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

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

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

Aperçu du développement

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. スクリーンショット 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');
});

Préparation du Dockerfile backend express

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" ]

Préparation de nginx.conf

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;
            }

        }
}

Préparation de docker-compose.yml

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-composer et terminer

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

finalement

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.

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

Merci beaucoup.

Recommended Posts

Résumé de la compréhension de Docker par les débutants ③ ~ Jusqu'à l'API de proxy à l'aide de nginx ~
Résumé de la compréhension de Docker par les débutants ② ~ docker-compose ~
Résumé de la compréhension de Docker par les débutants ① ~ docker run -p ~
Résumé de la compréhension de Docker par les débutants ⑤ ~ Jusqu'au déploiement d'un conteneur Docker sur une instance EC2 ~
Résumé de la compréhension de Docker par les débutants ④ ~ Jusqu'à ce que l'instance EC2 soit démarrée et que Docker soit installé ~
Résumé de la compréhension de Docker par les débutants ⑥ ~ Jusqu'au déploiement automatique du conteneur Docker sur l'instance EC2 à l'aide de CodeDeploy et CodePipeline ~
Installation simple de nginx et Docker à l'aide d'ansible
Résumé de l'utilisation de FragmentArgs
Résumé de l'utilisation de DBFlow
Jusqu'à ce que vous démarriez nginx sur CentOS en utilisant Docker sur Mac OS
[Java] Compréhension débutante de Servlet-②
Résumé de l'utilisation de ButterKnife
Résumé orienté objet par les débutants (Java)
[Pour les débutants] Résumé du constructeur java
[Rails] Introduction de Rubocop par les débutants
Développement de Flink à l'aide de l'API DataStream
Résumé des commandes Docker fréquemment utilisées
Résumé de la programmation orientée objet utilisant Java
Créez un environnement de "développement d'API + vérification d'API à l'aide de Swagger UI" avec Docker