Conteneur Nginx qui affiche le nom d'hôte de l'hôte exécutant Docker

introduction

Lorsque je travaillais avec Kubernetes, j'ai créé le conteneur connecté par le navigateur car je me demandais sur quel Worker il fonctionnait. Je l'utilise pour arrêter le travailleur exprès et vérifier la destination de la connexion.

Environnement de fonctionnement confirmé

image

Il a été téléchargé sur https://hub.docker.com/r/yasthon/nginx-display-hostname.

Essayez de bouger

Ici, il est exécuté dans l'environnement du nom d'hôte "dockerhost.example.jp".

$ docker pull yasthon/nginx-display-hostname
$ docker container run -d -v /etc/hostname:/usr/share/nginx/html/hostname -p 80:80 yasthon/nginx-display-hostname
$ curl http://localhost/index.sh
<html><head>
<title>dockerhost.example.jp</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head><body>
HOSTNAME : dockerhost.example.jp
</body></html>

Vérifiez également à partir du navigateur.

//[Adresse IP de l'hôte Docker]/index.Accéder à sh.



HOSTNAME : dockerhost.example.jp


## mouvement

 Je monte `` / etc / hostname '' au démarrage du conteneur.
 J'exécute sh de Nginx et lis le nom d'hôte.

 Dockerfile

 Ce fichier est utilisé lors de la construction locale.


#### **`Dockerfile`**
```dockerfile

FROM debian:buster-slim

COPY default.conf /etc/nginx/conf.d/

COPY index.sh /usr/share/nginx/html/

RUN apt-get update && \
  apt-get install -y --no-install-recommends nginx fcgiwrap && \
  apt-get autoclean && \
  rm -rf /var/lib/apt/lists/* && \
  echo "daemon off;" >> /etc/nginx/nginx.conf && \
  rm -f /etc/nginx/sites-enabled/default && \
  chmod 744 /usr/share/nginx/html/index.sh && \
  chown www-data:www-data /usr/share/nginx/html/index.sh

CMD /etc/init.d/fcgiwrap start && nginx

Cela fonctionnait facilement lorsque je l'installais normalement sur le système d'exploitation, mais lorsque je l'ai exécuté dans un conteneur, j'avais un problème.

--Si je pensais que la racine par défaut de Nginx était / usr / share / nginx / html /, je faisais référence à / var / www / html ''. Étant donné que l'utilisation du conteneur est limitée, je l'ai résolu en supprimant / etc / nginx / sites-enabled / default '' sans enquêter. --Il n'y avait pas de fcgiwrap.socket ''. J'ai ajouté /etc/init.d/fcgiwrap start` `` à CMD et l'ai créé lorsque le conteneur a démarré.

default.conf

Il s'agit du fichier de configuration Nginx.

default.conf


server {
  listen       80;
  server_name  localhost;
  location ~ \.sh$ {
    root   /usr/share/nginx/html/;
    include           /etc/nginx/fastcgi_params;
    fastcgi_index     index.sh;
    fastcgi_param     SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_pass      unix:/var/run/fcgiwrap.socket;
  }
}

Aucun problème par rapport à Dockerfile.

index.sh

Lit et affiche le fichier de nom d'hôte monté.

index.sh


#!/bin/sh

host_name=$(cat hostname)

echo "Content-type:text/html"
echo ""
echo "<html><head>"
echo "<title>${host_name}</title>"
echo '<meta http-equiv="Content-type" content="text/html;charset=UTF-8">'
echo "</head><body>"
echo "HOSTNAME : ${host_name}"
echo "</body></html>"

De même, sans aucun problème.

Construire localement

Le nom de l'image est "nginx-display-hostname". Mettez les trois fichiers dans le même répertoire et exécutez docker build```.

$ docker image build -t nginx-display-hostname .
$ docker container run -d -v /etc/hostname:/usr/share/nginx/html/hostname -p 80:80 nginx-display-hostname
$ curl http://localhost/index.sh
<html><head>
<title>dockerhost.example.jp</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head><body>
HOSTNAME : dockerhost.example.jp
</body></html>

Vérifiez également à partir du navigateur.

//[Adresse IP de l'hôte Docker]/index.Accéder à sh.



HOSTNAME : dockerhost.example.jp


## Travailler sur Kubernetes

 Vous devez monter `` / etc / hostname '' en utilisant volumeMounts et volumes.


#### **`sample.yaml`**
```yaml

apiVersion: v1
kind: Namespace
metadata:
  name: nginx-prod #nom de l'espace de noms
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment #Nom du déploiement(C'est aussi le nom du réplicaset)
  namespace: nginx-prod #nom de l'espace de noms
spec:
  selector:
    matchLabels: #Création d'un réplicaset pour les pods avec des libellés correspondants
      app: nginx-pod
  replicas: 2
  template: #Modèle de pod
    metadata:
      name: nginx-pod #Nom du pod
      namespace: nginx-prod #Le nom de l'espace de noms du pod
      labels: #Étiquette du pod
        app: nginx-pod
    spec:
      containers: #Paramètres du conteneur
        - name: nginx-container #Le nom du conteneur
          image: yasthon/nginx-display-hostname #Nom de l'image
          env:
            - name: nginx-container
          ports:
            - containerPort: 80 #Port à conteneurs
          volumeMounts:
            - name: file-hostname
              mountPath: /usr/share/nginx/html/hostname
      volumes:
        - name: file-hostname
          hostPath:
            path: /etc/hostname

Démarrez le pod.

$ kubectl apply -f sample.yaml
namespace/nginx-prod created
deployment.apps/nginx-deployment created

Vérifiez le nom du pod.

$ kubectl get all -n nginx-prod
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-7ff4cc65cd-6r4qv   1/1     Running   0          3m52s
pod/nginx-deployment-7ff4cc65cd-djm9r   1/1     Running   0          3m52s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   2/2     2            2           3m53s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-7ff4cc65cd   2         2         2       3m53s

Vérifiez l'adresse IP dans les détails du pod.

$ kubectl describe pod/nginx-deployment-7ff4cc65cd-djm9r -n nginx-prod | grep ^IP:
IP:           10.244.1.5

Accédez à l'adresse IP confirmée depuis le travailleur.

$ curl http://10.244.1.5/index.sh
<html><head>
<title>worker.example.jp</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head><body>
HOSTNAME : worker.example.jp
</body></html>

Il a été confirmé que le pod (nginx-deployment-7ff4cc65cd-6r4qv) a été démarré sur l'hôte worker.example.jp. Un service est requis pour l'accès au navigateur depuis l'extérieur du cluster.

finalement

Je pensais pouvoir y arriver bientôt, mais cela a pris un temps inattendu. J'espère qu'il sera utile à ceux qui en ont besoin.

Recommended Posts

Conteneur Nginx qui affiche le nom d'hôte de l'hôte exécutant Docker
L'histoire de la mise à jour du Docker Container de Sonar Qube
Modifier le dossier de placement de l'image et du conteneur Docker
Liste des commandes Docker que j'utilise souvent (opération de conteneur)
Surveillance Docker-expliquant les bases des bases-
[Docker] Comment accéder à l'hôte depuis l'intérieur du conteneur. http: //host.docker.internal:
Organisez la communication dans un environnement qui utilise diverses ressources sur la machine hôte et le conteneur Docker
Ceci et cela de JDK
Présentation des fonctionnalités des conteneurs JavaFX Scene Builder
[Docker] Copie des fichiers du conteneur Docker vers l'hôte
[Docker] Démarrez le conteneur dès que possible
Paramètres japonais pour mysql dans le conteneur Docker
Comment afficher la quantité de disque utilisée par le conteneur Docker pour chaque conteneur
Jusqu'au lancement d'un conteneur Docker construit avec RedHat Quarkus
Surveillez le conteneur Docker et le processus SystemD sur le même hôte avec Zabbix sur Ubuntu.