/jorny

Primary LanguagePHP

Jorny

Er zijn 2 folders, voor klant1 en voor klant2. Elk van die folders heeft een Dockerfile.

Build and run containers voor klant 1 en klant 2.

docker build -t klant1:v0.1 ./klant1
docker build -t klant2:v0.1 ./klant2

Er zijn 2 images gebouwd.

alt build containers

We starten de images

docker run -d -p 9081:80 -name klant1 klant1:v0.1
docker run -d -p 9082:80 -name klant2 klant2:v0.1

Er zijn 2 containers gestart. De poorten zijn 9081 en 9082 voor de respectievelijke klanten.

alt run containers

De containers draaien op hun poorten 9081 en 9082.

alt klant1

alt klant2

We willen een systeem om gemakkelijk van de ene klant naar de andere te gaan zonder de poorten te moeten onthouden

Optie 1 - GitHub - Easy

Hou de urls gewoon bij in een GitHub pagina:

De GitHub staat centraal en vereist geen extra hosting.

Optie 2 - Reverse proxy - Ook easy

We hadden het erover om de urls op een Apache static webpage te hosten, maar dan vind ik optie 1 eleganter. Voor static pages hebben we geen extra container nodig. Maar we kunnen wel mooiere dingen doen met een reverse proxy. We kunnen ervoor zorgen dat http://localhost/klant1 geredirect wordt naar http://localhost:9081. Eigenlijk hebben we geen portforward meer nodig. We zorgen ervoor dat http://localhost/klant1 gewoon de pagina's toont van de juiste container.

Dus deze zijn voldoende

docker run -d -name klant1 klant1:v0.1
docker run -d -name klant2 klant2:v0.1

We maken een docker network (omdat we de containers by name willen aanspreken)

docker network create devnet

Er is 1 netwerk bijgemaakt.

alt create network

We kunnen de containers verbinden met het nieuwe netwerk - devnet.

docker network connect devnet klant1
docker network connect devnet klant2
docker network inspect devnet

We zien bij inspect dat de containers verbonden zijn.

alt network connect

We voegen een niewe container toe, de reverseproxy, een Nginx.

docker run -d -p 80:80 --name rp --network devnet -v d:\jorny\nginx:/etc/nginx/conf.d/ -v d:\jorny\www:/etc/nginx/html/ nginx:stable

Dat is een mondje vol:

docker run                                \ # we runnen docker
  -d                                      \ # dettached
  -p 80:80                                \ # port forward voor poort 80 op de host naar 80 op de container
  --name rp                               \ # naam van de container is rp
  --network devnet                        \ # we koppelen meteen aan het devnet netwerk
  -v d:\jorny\nginx:/etc/nginx/conf.d/    \ # we koppelen het volume d:\jorny\nginx op de host aan /etc/nginx/conf.d/
  -v d:\jorny\www:/etc/nginx/html/        \ # we koppelen het volume d:\jorny\www op de host aan /etc/nginx/html/

De folder nginx bevat een bestand default.conf met de configuratie van de reverse proxy

server {
    location /klant1 {
        proxy_pass             http://klant1/;
    }
    location /klant2 {
        proxy_pass             http://klant2/;
    }
}

En voor de volledigheid heb ik ook de default webpagina van Nginx ook wat aangepast. Als je dan surft naar http://localhost dan zie je toch ook iets.

<!doctype html>
<html lang="en">
<head>
  <title>Gele Gids</title>
  <meta charset="UTF-8">
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
</head>
<body class="container">
    <div class="jumbotron">
      <h1>Gele Gids</h1>
        <p>
          <a href="http://localhost/klant1">Klant1</a><br>
          <a href="http://localhost/klant2">Klant2</a><br>
        </p>
    </div>
</body>
</html>

Als je aanpassingen maakt in de files dan moet je de Nginx deamon even herstarten. Het gemakkelijkste is de container even verwijderen en opnieuw starten.

# Container stoppen en verwijderen
docker container rm rp -f

# Container starten
docker run -d -p 80:80 --name rp --network devnet -v d:\jorny\nginx:/etc/nginx/conf.d/ -v d:\jorny\www:/etc/nginx/html/ nginx:stable

De landingspagina ziet er dan zo uit

alt resulthome

De pagina van klant 1 - merk op: geen portforward meer

alt resultklant1

De pagina van klant 2 - merk op: geen portforward meer

alt resultklant2

Met servername

De vorige setups verwezen naar virtual directories. Ik heb een nieuwe klant toegevoegd, klant3 met net dezelfde site.

De bedoeling is om deze klant te bereiken via zijn echte url :)

Hiervoor heb ik de reverse proxy aangepast zodat hij luistert naar localhost en naar www.klant3.be. Je moet er dan ook wel voor zorgen dat www.klant3.be resolvt naar 127.0.0.1 in de hosts file.

De config:

server {
    listen 80;
    server_name localhost 127.0.0.1;
    
    location /klant1/ {
        proxy_pass             http://klant1/;
    }
    location /klant2/ {
        proxy_pass             http://klant2/;
    }
}

server {
    listen 80;
    server_name klant3 www.klant3.be;

    location / {
        proxy_pass             http://klant3/;
    }
}

Om uit te voeren:

# build the images, if necessary
docker build -t klant1:v0.1 ./klant1
docker build -t klant2:v0.1 ./klant2
docker build -t klant3:v0.1 ./klant3

# create the network, if necessary
docker network create devnet

# run the containers
docker run -d --name klant1 --network devnet klant1:v0.1
docker run -d --name klant2 --network devnet klant2:v0.1
docker run -d --name klant3 --network devnet klant3:v0.1

# run the reverse proxy and map the config file and the index.html
docker run -d -p 80:80 --name rp --network devnet -v d:\jorny\nginx:/etc/nginx/conf.d/ -v d:\jorny\www:/etc/nginx/html/ nginx:stable