Nginx-Container, der den Hostnamen des Hosts anzeigt, auf dem Docker ausgeführt wird

Einführung

Als ich mit Kubernetes gearbeitet habe, habe ich den über den Browser verbundenen Container erstellt, weil ich mich gefragt habe, auf welchem Worker er ausgeführt wird. Ich benutze es, um den Arbeiter absichtlich anzuhalten und das Verbindungsziel zu überprüfen.

Umgebungsbestätigter Betrieb

Bild

Es wurde auf https://hub.docker.com/r/yasthon/nginx-display-hostname hochgeladen.

Versuche dich zu bewegen

Hier wird es in der Umgebung des Hostnamens "dockerhost.example.jp" ausgeführt.

$ 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>

Überprüfen Sie auch über den Browser.

//[Docker-Host-IP-Adresse]/index.Zugang sh.



HOSTNAME : dockerhost.example.jp


## Bewegung

 Ich mounte `` `/ etc / hostname``` beim Starten des Containers.
 Ich starte sh von Nginx und lese den Hostnamen.

 Dockerfile

 Diese Datei wird beim lokalen Erstellen verwendet.


#### **`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

Es funktionierte problemlos, wenn ich es normal auf dem Betriebssystem installierte, aber als ich es in einem Container ausführte, hatte ich ein Problem.

default.conf

Dies ist die Nginx-Konfigurationsdatei.

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

Kein Problem im Vergleich zu Dockerfile.

index.sh

Liest die angehängte Hostnamendatei und zeigt sie an.

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

Ebenso ohne Probleme.

Lokal bauen

Der Bildname lautet "nginx-display-hostname". Legen Sie die drei Dateien in dasselbe Verzeichnis und führen Sie "Docker Build" aus.

$ 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>

Überprüfen Sie auch über den Browser.

//[Docker-Host-IP-Adresse]/index.Zugang sh.



HOSTNAME : dockerhost.example.jp


## Arbeiten an Kubernetes

 Sie müssen `` `/ etc / hostname``` mithilfe von volumeMounts und Volumes bereitstellen.


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

apiVersion: v1
kind: Namespace
metadata:
  name: nginx-prod #Namespace-Name
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment #Bereitstellungsname(Dies ist auch der Name des Replikatsatzes)
  namespace: nginx-prod #Namespace-Name
spec:
  selector:
    matchLabels: #Erstellen eines Replikatsatzes für Pods mit übereinstimmenden Beschriftungen
      app: nginx-pod
  replicas: 2
  template: #Pod-Vorlage
    metadata:
      name: nginx-pod #Pod Name
      namespace: nginx-prod #Der Name des Namespace des Pods
      labels: #Pod-Etikett
        app: nginx-pod
    spec:
      containers: #Containereinstellungen
        - name: nginx-container #Der Name des Containers
          image: yasthon/nginx-display-hostname #Bildname
          env:
            - name: nginx-container
          ports:
            - containerPort: 80 #Containerhafen
          volumeMounts:
            - name: file-hostname
              mountPath: /usr/share/nginx/html/hostname
      volumes:
        - name: file-hostname
          hostPath:
            path: /etc/hostname

Starten Sie den Pod.

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

Überprüfen Sie den Namen des Pods.

$ 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

Überprüfen Sie die IP in den Pod-Details.

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

Greifen Sie vom Worker auf die bestätigte IP zu.

$ 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>

Es wurde bestätigt, dass der Pod (nginx-deploy-7ff4cc65cd-6r4qv) auf dem Host worker.example.jp gestartet wurde. Für den Browserzugriff von außerhalb des Clusters ist ein Dienst erforderlich.

Schließlich

Ich dachte, ich könnte es bald schaffen, aber es dauerte unerwartet lange. Ich hoffe, es wird für diejenigen nützlich sein, die es brauchen.

Recommended Posts

Nginx-Container, der den Hostnamen des Hosts anzeigt, auf dem Docker ausgeführt wird
Die Geschichte der Aktualisierung des Docker-Containers von Sonar Qube
Ändern Sie den Docker-Image- und Container-Platzierungsordner
Liste der Docker-Befehle, die ich häufig verwende (Container-Operation)
Docker-Überwachung - Erläuterung der Grundlagen der Grundlagen
[Docker] Zugriff auf den Host aus dem Container heraus. http: //host.docker.internal:
Organisieren Sie die Kommunikation in einer Umgebung, in der verschiedene Ressourcen auf dem Hostcomputer und dem Docker-Container verwendet werden
Dies und das von JDK
Einführung in die Funktionen von JavaFX Scene Builder-Containern
[Docker] Kopieren Sie Dateien aus dem Docker-Container auf den Host
[Docker] Starten Sie den Container so schnell wie möglich
Japanische Einstellungen für MySQL im Docker-Container
Anzeigen der vom Docker-Container verwendeten Festplattenmenge für jeden Container
Bis zum Start eines Docker-Containers, der mit RedHat Quarkus erstellt wurde
Überwachen Sie den Docker-Container und den SystemD-Prozess auf demselben Host mit Zabbix unter Ubuntu.