Docker : le dixième pas.

Attention ceci est mon brouillon avant de faire une belle documentation sur Docker (il y a à boire et à manger).

On va dire que ce pas va être un pas de coté. Mon but va être d’améliorer le server4 pour en faire un server5 (source server5.c). Mais je vais aussi faire un programme de stress : client_stress.c afin de bien vérifier tout le fonctionnement.

Voici donc les amélioration sur server5.c :

  • Ajout des logs dans syslog (même si je suis sur un échec sur la redirection des logs : voir le précédent post).
  • Ajout d’une commande TIME pour indiquer le temps en milliseconde depuis l’acceptation.
  • Ajout d’une commande CLIENT pour indiquer l’IP du client.
  • Création d’une table dans Postgresql au lancement du serveur.
  • Ajout d’une commande pour faire l’insertion des performances dans Postresql : DBINSERT.

Voici donc le source que je vous propose :

[root@localhost ~]# cat server5.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include "libpq-fe.h"
#include <syslog.h>

#define MYPORT 80
#define BACKLOG 5
#define MAXCLIENTS 5
#define MAXDATASIZE 100

long
getMicrotime ()
{
  struct timeval currentTime;
  gettimeofday (&currentTime, NULL);
  return currentTime.tv_sec * (int) 1e6 + currentTime.tv_usec;
}

int
main (void)
{
  int sockfd = -1, new_fd, numbytes, highest = 0, i;
  int clients[MAXCLIENTS];
  long clients_t[MAXCLIENTS];
  char clients_ip[MAXCLIENTS][MAXDATASIZE];
  char buffer[MAXDATASIZE];
  char localip[MAXDATASIZE];
  struct sockaddr_in my_addr, their_addr;
  socklen_t sin_size;
  struct timeval tv;
  fd_set readfds;
  char conninfo[MAXDATASIZE];
  PGconn *conn;
  PGresult *res;
  FILE *f;
  char line[100], *p, *c;
  const char *google_dns_server = "8.8.8.8";
  int dns_port = 53;
  struct sockaddr_in serv;
  int sock = socket (AF_INET, SOCK_DGRAM, 0);

  setlogmask (LOG_UPTO (LOG_NOTICE));

  openlog ("server5", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);

  f = fopen ("/proc/net/route", "r");

  while (fgets (line, 100, f))
    {
      p = strtok (line, " \t");
      c = strtok (NULL, " \t");

      if (p != NULL && c != NULL)
	{
	  if (strcmp (c, "00000000") == 0)
	    {
	      printf ("Default interface is : %s \n", p);
	      break;
	    }
	}
    }

  if (sock < 0)
    {
      perror ("Socket error");
      syslog (LOG_ERR, "Error on socket");
      closelog ();
    }

  memset (&serv, 0, sizeof (serv));
  serv.sin_family = AF_INET;
  serv.sin_addr.s_addr = inet_addr (google_dns_server);
  serv.sin_port = htons (dns_port);

  int err = connect (sock, (const struct sockaddr *) &serv, sizeof (serv));

  struct sockaddr_in name;
  socklen_t namelen = sizeof (name);
  err = getsockname (sock, (struct sockaddr *) &name, &namelen);

  const char *p2 = inet_ntop (AF_INET, &name.sin_addr, localip, 100);

  if (p2 != NULL)
    {
      printf ("Local ip is : %s \n", localip);
    }
  else
    {
      printf ("Error number : %d . Error message : %s \n", errno,
	      strerror (errno));
      strcpy (localip, "Error");
    }

  close (sock);

  printf ("POSTGRES2_PORT_5432_TCP_ADDR : %s \n",
	  getenv ("POSTGRES2_PORT_5432_TCP_ADDR"));

  if (getenv ("POSTGRES2_PORT_5432_TCP_ADDR") == NULL)
    {
      sprintf (conninfo, "hostaddr=%s port=%s user=postgres password=%s",
	       "127.0.0.1", "5432", "password");
      syslog (LOG_NOTICE, "Local mode");
    }
  else
    {
      sprintf (conninfo, "hostaddr=%s port=%s user=postgres password=%s",
	       getenv ("POSTGRES2_PORT_5432_TCP_ADDR"),
	       getenv ("POSTGRES2_PORT_5432_TCP_PORT"),
	       getenv ("POSTGRES2_ENV_POSTGRES_PASSWORD"));
      syslog (LOG_NOTICE, "Docker mode");
    }

  conn = PQconnectdb (conninfo);
  if (PQstatus (conn) != CONNECTION_OK)
    {
      fprintf (stderr,
	       "Connection to database failed: %s \n", PQerrorMessage (conn));
    }
  else
    {
      res = PQexec (conn, "select count(*) from STATISTIQUE;");
      if (PQresultStatus (res) != PGRES_TUPLES_OK)
	{
	  printf ("KO : Table STATISTIQUE \n");
	  PQclear (res);
	  res =
	    PQexec (conn,
		    "CREATE TABLE STATISTIQUE ( ID serial primary key, CLIENT CHAR(20) NOT NULL, SERVER CHAR(20) NOT NULL, TEMPS_MILLI INT NOT NULL, TEMPS_CUR INT);");
	  if (PQresultStatus (res) != PGRES_COMMAND_OK)
	    {
	      printf ("KO : Table STATISTIQUE (CREATE) \n");
	      PQclear (res);
	    }
	  else
	    {
	      printf ("OK : Table STATISTIQUE (CREATE) \n");
	      PQclear (res);
	    }
	}
      else
	{
	  printf ("OK : Table STATISTIQUE \n");
	  PQclear (res);
	}
    }
  PQfinish (conn);

  syslog (LOG_NOTICE, "End of check of table");

  if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
    {
      perror ("socket");
      syslog (LOG_ERR, "Error on socket");
      closelog ();
      exit (-1);
    }
  my_addr.sin_family = AF_INET;
  my_addr.sin_port = htons (MYPORT);
  my_addr.sin_addr.s_addr = INADDR_ANY;
  bzero (&(my_addr.sin_zero), 8);

  if (bind (sockfd, (struct sockaddr *) &my_addr, sizeof (struct sockaddr)) ==
      -1)
    {
      perror ("bind");
      syslog (LOG_ERR, "Error on bind");
      closelog ();
      exit (-1);
    }
  if (listen (sockfd, BACKLOG) == -1)
    {
      perror ("listen");
      syslog (LOG_ERR, "Error on listen");
      closelog ();
      exit (-1);
    }
  bzero (clients, sizeof (clients));
  highest = sockfd;
  while (1)
    {
      sin_size = sizeof (struct sockaddr_in);
      tv.tv_sec = 0;
      tv.tv_usec = 250000;
      FD_ZERO (&readfds);
      for (i = 0; i < MAXCLIENTS; i++) { if (clients[i] != 0) { FD_SET (clients[i], &readfds); } } FD_SET (sockfd, &readfds); if (select (highest + 1, &readfds, NULL, NULL, &tv) >= 0)
	{
	  if (FD_ISSET (sockfd, &readfds))
	    {
	      if ((new_fd =
		   accept (sockfd, (struct sockaddr *) &their_addr,
			   &sin_size)) == -1)
		{
		  perror ("ACCEPT");
		  syslog (LOG_ERR, "Error on accept");
		  continue;
		}
	      for (i = 0; i < MAXCLIENTS; i++) { if (clients[i] == 0) { clients[i] = new_fd; clients_t[i] = getMicrotime (); break; } } if (i != MAXCLIENTS) { if (new_fd > highest)
		    {
		      highest = clients[i];
		    }
		  printf ("Connexion received from %s (slot %i) ",
			  inet_ntoa (their_addr.sin_addr), i);
		  strcpy (clients_ip[i], inet_ntoa (their_addr.sin_addr));
		  syslog (LOG_NOTICE, "Connexion received from %s (slot %i) ",
			  inet_ntoa (their_addr.sin_addr), i);
		  send (new_fd, "\nHELLO\n", 7, MSG_NOSIGNAL);
		}
	      else
		{
		  send (new_fd, "\nTOO MANY CLIENT\n", 17, MSG_NOSIGNAL);
		  close (new_fd);
		}
	    }
	  for (i = 0; i < MAXCLIENTS; i++)
	    {
	      if (FD_ISSET (clients[i], &readfds))
		{
		  if ((numbytes =
		       recv (clients[i], buffer, MAXDATASIZE, 0)) <= 0)
		    {
		      printf ("Connexion lost from slot %i", i);
		      syslog (LOG_NOTICE, "Connexion lost from slot %i", i);
		      close (clients[i]);
		      clients[i] = 0;
		    }
		  else
		    {
		      buffer[numbytes] = '\0';
		      printf ("Received from slot %i : %s", i, buffer);
		      syslog (LOG_NOTICE, "Received from slot %i : %s", i,
			      buffer);
		      if (strncmp (buffer, "POSTGRES", 6) == 0)
			{
			  conn = PQconnectdb (conninfo);
			  if (PQstatus (conn) != CONNECTION_OK)
			    {
			      fprintf (stderr,
				       "Connection to database failed: %s",
				       PQerrorMessage (conn));
			      send (new_fd, "\nDB KO\n", 7, MSG_NOSIGNAL);
			      syslog (LOG_ALERT,
				      "Connection to database failed: %s",
				      PQerrorMessage (conn));
			    }
			  else
			    {
			      send (new_fd, "\nDB OK\n", 7, MSG_NOSIGNAL);
			    }
			  PQfinish (conn);
			}
		      if (strncmp (buffer, "DBINSERT", 6) == 0)
			{
			  conn = PQconnectdb (conninfo);
			  if (PQstatus (conn) != CONNECTION_OK)
			    {
			      fprintf (stderr,
				       "Connection to database failed: %s",
				       PQerrorMessage (conn));
			      send (new_fd, "\nDBINSERT KO (1)\n", 16,
				    MSG_NOSIGNAL);
			      syslog (LOG_ALERT,
				      "Connection to database failed: %s",
				      PQerrorMessage (conn));
			    }
			  else
			    {
			      char query_string[256];
			      send (new_fd, "\nDBINSERT OK\n", 7,
				    MSG_NOSIGNAL);
			      sprintf (query_string,
				       "INSERT INTO STATISTIQUE (CLIENT,SERVER,TEMPS_MILLI,TEMPS_CUR) VALUES ('%s','%s','%ld','%ld')",
				       clients_ip[i], localip,
				       getMicrotime () - clients_t[i],
				       time (0));
			      res = PQexec (conn, query_string);
			      if (PQresultStatus (res) != PGRES_COMMAND_OK)
				{
				  send (new_fd, "\nDBINSERT KO (2)\n", 16,
					MSG_NOSIGNAL);
				  send (new_fd, query_string, strlen(query_string), MSG_NOSIGNAL);
				  send (new_fd, "\n", 1, MSG_NOSIGNAL);
				  PQclear (res);
				}
			      else
				{
				  send (new_fd, "\nDBINSERT OK (1)\n", 16,
					MSG_NOSIGNAL);
				  PQclear (res);
				}
			    }
			  PQfinish (conn);
			}
		      if ((strncmp (buffer, "QUIT", 4) == 0))
			{
			  printf ("Connexion QUIT from slot %i \n", i);
			  syslog (LOG_NOTICE,
				  "End of cnx : QUIT (slot n°%i)", i);
			  close (clients[i]);
			  clients[i] = 0;
			}
		      if ((strncmp (buffer, "TIME", 4) == 0))
			{
			  printf ("TIME from slot %i : %ld ms \n", i,
				  getMicrotime () - clients_t[i]);
			}
		      if ((strncmp (buffer, "EXIT", 4) == 0))
			{
			  printf ("Connexion EXIT from slot %i \n", i);
			  syslog (LOG_NOTICE,
				  "End of cnx : EXIT (slot n°%i)", i);
			  close (clients[i]);
			  clients[i] = 0;
			}
		      if ((strncmp (buffer, "CLOSE", 5) == 0))
			{
			  printf ("Connexion CLOSE from slot %i \n", i);
			  syslog (LOG_NOTICE,
				  "End of cnx : CLOSE (slot n°%i)", i);
			  close (clients[i]);
			  clients[i] = 0;
			}
		      if ((strncmp (buffer, "INTERFACE", 9) == 0))
			{
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			  send (new_fd, localip, strlen (localip),
				MSG_NOSIGNAL);
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			}
		      if ((strncmp (buffer, "IP", 2) == 0))
			{
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			  send (new_fd, p, strlen (p), MSG_NOSIGNAL);
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			}
		      if ((strncmp (buffer, "CLIENT", 6) == 0))
			{
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			  send (new_fd, clients_ip[i], strlen (clients_ip[i]),
				MSG_NOSIGNAL);
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			}
		      if ((strncmp (buffer, "DBCNX", 2) == 0))
			{
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			  send (new_fd, conninfo, strlen (conninfo),
				MSG_NOSIGNAL);
			  send (new_fd, "\n", 1, MSG_NOSIGNAL);
			}
		    }
		}
	    }
	}
      else
	{
	  perror ("SELECT");
	  syslog (LOG_ERR, "Error on select");
	  continue;
	}
    }
  return 0;
}

Ensuite on compile :

[root@localhost ~]# gcc -o server5 server5.c -lpq

Et on fait un test avec deux terminaux :

  • Terminal n°1 : le serveur
[root@localhost ~]# ./server5 
Default interface is : enp0s3 
Local ip is : 192.168.10.159 
POSTGRES2_PORT_5432_TCP_ADDR : (null) 
OK : Table STATISTIQUE 
Connexion received from 127.0.0.1 (slot 0) Received from slot 0 : DBINSERT
Received from slot 0 : TIME
TIME from slot 0 : 8470474 ms 
Received from slot 0 : CLIENT
Received from slot 0 : QUIT
Connexion QUIT from slot 0 
^C
  • Terminal n°2 : le client et la vérification en base de donnée
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
DBINSERT

DBINSE
DBINSERT OK (1)
hostaddr=127.0.0.1 port=5432 user=postgres password=password
TIME
CLIENT

127.0.0.1
QUIT
Connection closed by foreign host.
[root@localhost ~]# psql -h localhost -p 5432 -d postgres -U postgres
Mot de passe pour l'utilisateur postgres : 
psql (9.2.15, serveur 9.5.2)
ATTENTION : psql version 9.2, version du serveur 9.5.
         Certaines fonctionnalités de psql pourraient ne pas fonctionner.
Saisissez « help » pour l'aide.

postgres=# select * from statistique;
 id |        client        |        server        | temps_milli | temps_cur  
----+----------------------+----------------------+-------------+------------
  1 | 127.0.0.1            | 192.168.10.159       |     4035350 | 1460738997
(1 ligne)

postgres=# \quit

Maintenant on va tuer les anciens server4 pour mettre les server5 à la place.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
78f6bc54152e        my-server4          "/sbin/server4"          11 hours ago        Up 11 hours         0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          11 hours ago        Up 11 hours         0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          11 hours ago        Up 11 hours         0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          11 hours ago        Up 11 hours         0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   21 hours ago        Up 21 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker stop 78f6bc54152e
78f6bc54152e
[root@localhost ~]# docker stop fce6865343f1
fce6865343f1
[root@localhost ~]# docker stop a75937eb980d
a75937eb980d
[root@localhost ~]# docker stop eacf3e4bc897
eacf3e4bc897
[root@localhost ~]# cat Dockerfile
FROM fedora
MAINTAINER toto toto@cyber-neurones.org 
COPY ./server5 /sbin/server5
RUN dnf install postgresql -y
# Le port en ecoute 
EXPOSE 80 
# Pour lancer postgres 
CMD ["/sbin/server5"]

[root@localhost ~]# docker build -t my-server5 .
Sending build context to Docker daemon 173.1 kB
Step 1 : FROM fedora
 ---> ddd5c9c1d0f2
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Using cache
 ---> bb6bc55cbbfc
Step 3 : COPY ./server5 /sbin/server5
 ---> 2fe1490bb5ce
Removing intermediate container f1423fb336e8
Step 4 : RUN dnf install postgresql -y
 ---> Running in 6543ce6e13d1
Last metadata expiration check performed 0:07:57 ago on Fri Apr 15 17:11:57 2016.
Dependencies resolved.
================================================================================
 Package                Arch          Version              Repository      Size
================================================================================
Installing:
 postgresql             x86_64        9.4.7-1.fc23         updates        1.1 M
 postgresql-libs        x86_64        9.4.7-1.fc23         updates        240 k

Transaction Summary
================================================================================
Install  2 Packages

Total download size: 1.3 M
Installed size: 4.4 M
Downloading Packages:
--------------------------------------------------------------------------------
Total                                           3.8 kB/s | 1.3 MB     06:03     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : postgresql-libs-9.4.7-1.fc23.x86_64                         1/2 
  Installing  : postgresql-9.4.7-1.fc23.x86_64                              2/2 
  Verifying   : postgresql-9.4.7-1.fc23.x86_64                              1/2 
  Verifying   : postgresql-libs-9.4.7-1.fc23.x86_64                         2/2 

Installed:
  postgresql.x86_64 9.4.7-1.fc23       postgresql-libs.x86_64 9.4.7-1.fc23      

Complete!
 ---> 525d14c0b7bd
Removing intermediate container 6543ce6e13d1
Step 5 : EXPOSE 80
 ---> Running in 5e5c9d20a133
 ---> 8e17ff5fd52f
Removing intermediate container 5e5c9d20a133
Step 6 : CMD /sbin/server5
 ---> Running in 45bf70b1fd01
 ---> 07c7d4591a0f
Removing intermediate container 45bf70b1fd01
Successfully built 07c7d4591a0f
[root@localhost ~]# docker rm my-server4-1
my-server4-1
[root@localhost ~]# docker rm my-server4-2
my-server4-2
[root@localhost ~]# docker rm my-server4-3
my-server4-3
[root@localhost ~]# docker rm my-server4-4
my-server4-4
[root@localhost ~]# docker run -p 8080:80 --link postgres2:postgres2 --name my-server4-1 -d my-server5
4fb8f79456af940d23ecd9913cb737326d2f9e9dc61ecb09e3ad99c669b57543
[root@localhost ~]# docker run -p 8081:80 --link postgres2:postgres2 --name my-server4-2 -d my-server5
5b9099ae80d024518259d65c3519b05149164e4f0f8a1a7959ec17f032724a0c
[root@localhost ~]# docker run -p 8082:80 --link postgres2:postgres2 --name my-server4-3 -d my-server5
1e87ae6b009be77a8795620aada0855b23f309d427f3d30ba9b822b09e98ae57
[root@localhost ~]# docker run -p 8083:80 --link postgres2:postgres2 --name my-server4-4 -d my-server5
eb76431e86e0b7519e8314e93b5e8a48acfb2a26e60305564ccc1c35a69b2907
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
eb76431e86e0        my-server5          "/sbin/server5"          3 seconds ago       Up 2 seconds        0.0.0.0:8083->80/tcp     my-server4-4
1e87ae6b009b        my-server5          "/sbin/server5"          13 seconds ago      Up 12 seconds       0.0.0.0:8082->80/tcp     my-server4-3
5b9099ae80d0        my-server5          "/sbin/server5"          22 seconds ago      Up 21 seconds       0.0.0.0:8081->80/tcp     my-server4-2
4fb8f79456af        my-server5          "/sbin/server5"          38 seconds ago      Up 38 seconds       0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   22 hours ago        Up 22 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker rm mon-haproxy-v15b
mon-haproxy-v15b
[root@localhost ~]# docker run -d --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 -p 80:80 --name mon-haproxy-v15b my-haproxy-v15
1f22de2c194bb252882d941ed9b8c14eff48f1fc97089121497c898c9a969d61
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
1f22de2c194b        my-haproxy-v15      "/docker-entrypoint.s"   4 seconds ago        Up 3 seconds        0.0.0.0:80->80/tcp       mon-haproxy-v15b
eb76431e86e0        my-server5          "/sbin/server5"          About a minute ago   Up About a minute   0.0.0.0:8083->80/tcp     my-server4-4
1e87ae6b009b        my-server5          "/sbin/server5"          About a minute ago   Up About a minute   0.0.0.0:8082->80/tcp     my-server4-3
5b9099ae80d0        my-server5          "/sbin/server5"          About a minute ago   Up About a minute   0.0.0.0:8081->80/tcp     my-server4-2
4fb8f79456af        my-server5          "/sbin/server5"          2 minutes ago        Up 2 minutes        0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   22 hours ago         Up 22 hours         0.0.0.0:5432->5432/tcp   postgres2

Maintenant on fait un petit test afin de voir que tout fonctionne.

[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
DBINSERT

DBINSE
DBINSERT OK (1)
hostaddr=172.17.0.2 port=5432 user=postgres password=password
QUIT
Connection closed by foreign host.
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
DBINSERT

DBINSE
DBINSERT OK (1)
hostaddr=172.17.0.2 port=5432 user=postgres password=password
QUIT
Connection closed by foreign host.
[root@localhost ~]# psql -h localhost -p 5432 -d postgres -U postgres
Mot de passe pour l'utilisateur postgres : 
psql (9.2.15, serveur 9.5.2)
ATTENTION : psql version 9.2, version du serveur 9.5.
         Certaines fonctionnalités de psql pourraient ne pas fonctionner.
Saisissez « help » pour l'aide.

postgres=# select * from statistique;
 id |        client        |        server        | temps_milli | temps_cur  
----+----------------------+----------------------+-------------+------------
  1 | 127.0.0.1            | 192.168.10.159       |     4035350 | 1460738997
  2 | 172.17.0.7           | 172.17.0.3           |     5405983 | 1460742112
  3 | 172.17.0.7           | 172.17.0.4           |     3369612 | 1460742123
(3 lignes)


postgres=# \quit

On va pouvoir faire notre programme de stress : client_stress.c. Voici le source que je vous propose (je ne regarde pas les réponses du serveur sur le socket afin de faire un programme court).

#include <sys/types.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int
socket_client (char *serveur, unsigned short port)
{
  int client_socket;
  struct hostent *hostent;
  struct sockaddr_in serveur_sockaddr_in;

  client_socket = socket (PF_INET, SOCK_STREAM, 0);
  if (client_socket == -1)
    {
      perror ("socket");
      exit (EXIT_FAILURE);
    }

  if (inet_addr (serveur) == INADDR_NONE)	/* nom */
    {
      hostent = gethostbyname (serveur);
      if (hostent == NULL)
	{
	  perror ("gethostbyname");
	  exit (EXIT_FAILURE);
	}
    }
  else				/* adresse IP */
    {
      unsigned long addr = inet_addr (serveur);

      hostent = gethostbyaddr ((char *) &addr, sizeof (addr), AF_INET);
      if (hostent == NULL)
	{
	  perror ("gethostbyaddr");
	  exit (EXIT_FAILURE);
	}
    }

  memset (&serveur_sockaddr_in, 0, sizeof (serveur_sockaddr_in));
  serveur_sockaddr_in.sin_family = AF_INET;
  serveur_sockaddr_in.sin_port = htons (port);
  memcpy (&serveur_sockaddr_in.sin_addr.s_addr, hostent->h_addr_list[0],
	  hostent->h_length);

  if (connect (client_socket, (struct sockaddr *) &serveur_sockaddr_in,
	       sizeof (serveur_sockaddr_in)) == -1)
    {
      perror ("connect");
      exit (EXIT_FAILURE);
    }

  return client_socket;
}

int
main (int argc, char **argv)
{
  char *serveur;
  unsigned short port = 80;
  int client_socket = -1;
  int i = 0;
  unsigned long letime = 0;

  if (argc != 3)
    {
      fprintf (stderr, "usage: %s serveur port\n", argv[0]);
      exit (EXIT_FAILURE);
    }

  serveur = argv[1];
  port = atoi (argv[2]);

  printf ("Start \n");
  letime = time (0);

  while (1)
    {

      client_socket = -1;
      client_socket = (int) socket_client (serveur, port);
      usleep (100);
      write (client_socket, "DBINSERT", strlen ("DBINSERT") * sizeof (char));
      usleep (100);
      write (client_socket, "QUIT", strlen ("QUIT") * sizeof (char));
      close (client_socket);
      i++;

      if (i % 500 == 0)
	{
	  printf ("Nombre %d le temps %d \n", i, time (0) - letime);
	}
    }

  exit (EXIT_SUCCESS);
}

/* EOF */

Avant de faire le test on vide la base de donnée :

postgres=# delete from statistique;

Et maintenant on passe à la compilation et la phase de test :

[root@localhost ~]# gcc -o client_stress client_stress.c
[root@localhost ~]# ./client_stress 127.0.0.1 80
Start 
Nombre 500 le temps 3 
Nombre 1000 le temps 6 
Nombre 1500 le temps 9 
Nombre 2000 le temps 12 
Nombre 2500 le temps 17 
Nombre 3000 le temps 25 
Nombre 3500 le temps 34 
Nombre 4000 le temps 38 
Nombre 4500 le temps 43 
gethostbyaddr: Invalid argument

Le programme fini par planter, je vous laisse voir pourquoi 😉 Et on contrôle que la répartition de charge c’est faites de façon équivalente entre tous les serveurs.

postgres=# select count(*),server from statistique group by server;
 count |        server        
-------+----------------------
  1238 | 172.17.0.5          
  1239 | 172.17.0.6          
  1239 | 172.17.0.3          
  1237 | 172.17.0.4          
(4 lignes)

Si vous êtes un PRO de SQL vous pouvez faire plus complexe en regardant le temps de traitement en fonction du server :

postgres=# select min(temps_milli),max(temps_milli),avg(temps_milli),count(*),server from statistique group by server;
 min  |   max   |        avg         | count |        server        
------+---------+--------------------+-------+----------------------
 1750 | 1037158 | 41649.365105008078 |  1238 | 172.17.0.5          
 1883 | 1029440 | 37218.885391444713 |  1239 | 172.17.0.6          
 1799 | 1032792 | 46888.554479418886 |  1239 | 172.17.0.3          
 1816 | 1046117 | 46996.953112368634 |  1237 | 172.17.0.4          
(4 lignes)

Pas de doute, il est plus facile pour moi de faire du code 😉 Je vous donne la solution pour ne pas avoir l’erreur.

[root@localhost ~]# ./client_stress localhost 80
Start 
Nombre 500 le temps 2 
Nombre 1000 le temps 4 
Nombre 1500 le temps 6 
Nombre 2000 le temps 8 
Nombre 2500 le temps 10 
Nombre 3000 le temps 12 
Nombre 3500 le temps 14 
Nombre 4000 le temps 17 
Nombre 4500 le temps 19 
Nombre 5000 le temps 21 
Nombre 5500 le temps 23 
Nombre 6000 le temps 26 
Nombre 6500 le temps 28 
Nombre 7000 le temps 30 
Nombre 7500 le temps 32 
Nombre 8000 le temps 35 
Nombre 8500 le temps 37 
Nombre 9000 le temps 39 
Nombre 9500 le temps 41 
Nombre 10000 le temps 43 
Nombre 10500 le temps 46 
Nombre 11000 le temps 63 
Nombre 11500 le temps 74 
Nombre 12000 le temps 77 

A noter le gros delta que j’ai eu entre 63 etc 46, mais vu que je n’ai pas de logs cela va rester un mystère. Voici les statistiques :

postgres=# select min(temps_milli),max(temps_milli),avg(temps_milli),count(*),server from statistique group by server;
 min  |   max   |        avg         | count |        server        
------+---------+--------------------+-------+----------------------
 1750 | 1037158 | 39815.738331678252 |  4028 | 172.17.0.5          
 1867 | 1029440 | 38359.346345101939 |  4022 | 172.17.0.6          
 1799 | 1032792 | 41384.980841005225 |  4019 | 172.17.0.3          
 1808 | 1046117 | 41427.165548098434 |  4023 | 172.17.0.4          
(4 lignes)

Avant de vous laissé, j’ai quand même envie de remettre NGINX afin de faire un petit test comparatif 😉

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1f22de2c194b        my-haproxy-v15      "/docker-entrypoint.s"   37 minutes ago      Up 37 minutes       0.0.0.0:80->80/tcp       mon-haproxy-v15b
eb76431e86e0        my-server5          "/sbin/server5"          39 minutes ago      Up 39 minutes       0.0.0.0:8083->80/tcp     my-server4-4
1e87ae6b009b        my-server5          "/sbin/server5"          39 minutes ago      Up 39 minutes       0.0.0.0:8082->80/tcp     my-server4-3
5b9099ae80d0        my-server5          "/sbin/server5"          39 minutes ago      Up 39 minutes       0.0.0.0:8081->80/tcp     my-server4-2
4fb8f79456af        my-server5          "/sbin/server5"          40 minutes ago      Up 40 minutes       0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   22 hours ago        Up 22 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker stop 1f22de2c194b
1f22de2c194b
[root@localhost ~]# docker run --name mon-nginx-v7 --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 -p 80:80 -v /root/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx 
b37844241909fb69646f02d3541428671a8024a5cfa0fa578bf5be0d8b957068
[root@localhost ~]# cat nginx.conf 
worker_processes  4;

events {
    worker_connections  8192;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
}

stream {
    upstream stream_backend {
	server my-server4-1:80 weight=5;
        server my-server4-2:80;
        server my-server4-3:80;
        server my-server4-4:80;
    }
    server {
        listen     80;
        proxy_pass stream_backend;
    }
}
[root@localhost ~]# psql -h localhost -p 5432 -d postgres -U postgres
Mot de passe pour l'utilisateur postgres : 
psql (9.2.15, serveur 9.5.2)
ATTENTION : psql version 9.2, version du serveur 9.5.
         Certaines fonctionnalités de psql pourraient ne pas fonctionner.
Saisissez « help » pour l'aide.

postgres=# delete from statistique;
DELETE 16092
postgres=# \quit
[root@localhost ~]# ./client_stress localhost 80
Start 
Nombre 500 le temps 1 
Nombre 1000 le temps 3 
Nombre 1500 le temps 5 
Nombre 2000 le temps 7 
Nombre 2500 le temps 9 
Nombre 3000 le temps 11 
Nombre 3500 le temps 13 
Nombre 4000 le temps 15 
Nombre 4500 le temps 17 
Nombre 5000 le temps 19 
Nombre 5500 le temps 21 
Nombre 6000 le temps 23 
Nombre 6500 le temps 25 
Nombre 7000 le temps 28 
Nombre 7500 le temps 30 
Nombre 8000 le temps 32 
Nombre 8500 le temps 34 
Nombre 9000 le temps 36 
Nombre 9500 le temps 42 
Nombre 10000 le temps 44 
Nombre 10500 le temps 50 
Nombre 11000 le temps 58 
Nombre 11500 le temps 75 
Nombre 12000 le temps 122 

J’ai 122 sec (pauses comprises) pour 12000 inserts … alors qu’avec HAProxy c’était 77 sec. Maintenant je regarde en base de donnée :

postgres=# select min(temps_milli),max(temps_milli),avg(temps_milli),count(*),server from statistique group by server;
 min  |   max    |        avg         | count |        server        
------+----------+--------------------+-------+----------------------
 1596 |  7035984 | 51478.137139311201 |  3223 | 172.17.0.3          
 1723 |  8038108 | 68590.102406267487 |  1787 | 172.17.0.5          
 1660 |  7043045 | 67068.732963988920 |  1805 | 172.17.0.6          
 1680 | 16047502 | 76722.983117613956 |  1777 | 172.17.0.4          
(4 lignes)
postgres=# select count(*) from statistique;
 count 
-------
  8592
(1 ligne)

La répartition n’a pas été homogène, je pense que mon fichier de configuration n’est pas bon. En plus nous avons un grand nombre de perte : 12000-8592 🙁 Et pour finir le temps de traitement est plus long quand cela fonctionne. On voit donc l’utilité du programme de charge, quand on fait les tests de façon unitaire il est rare de tomber sur un problème. Et quand on commence à faire de la charge, les vrais problèmes apparaissent.

Docker : neuvième pas

Attention ceci est mon brouillon avant de faire une belle documentation sur Docker (il y a à boire et à manger). Sachant que celui-ci c’est 100% échec 🙁 .

Cette fois je vais m’attaquer au logs, et pour ce faire je vais monter un container faisant uniquement du syslog. Voici l’architecture cible que je veux :

Capture d’écran 2016-04-22 à 09.53.32

Je vais partir sur un ubuntu pour faire plus simple.

[root@localhost ~]# cat Dockerfile
FROM ubuntu:14.04
RUN apt-get update -q
RUN apt-get install rsyslog
CMD rsyslogd -n
VOLUME /dev
VOLUME /var/log
[root@localhost ~]# docker build -t syslog .
Sending build context to Docker daemon 132.1 kB
Step 1 : FROM ubuntu:14.04
14.04: Pulling from library/ubuntu
759d6771041e: Pull complete 
8836b825667b: Pull complete 
c2f5e51744e6: Pull complete 
a3ed95caeb02: Pull complete 
Digest: sha256:28fd745dfe0a5f6e716437969c4927c2b4e44c13ce4230205e990608048edb6d
Status: Downloaded newer image for ubuntu:14.04
 ---> b72889fa879c
Step 2 : RUN apt-get update -q
 ---> Running in 2463796467f8
Ign http://archive.ubuntu.com trusty InRelease
Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]
Get:2 http://archive.ubuntu.com trusty-security InRelease [65.9 kB]
Hit http://archive.ubuntu.com trusty Release.gpg
Hit http://archive.ubuntu.com trusty Release
Get:3 http://archive.ubuntu.com trusty-updates/main Sources [344 kB]
Get:4 http://archive.ubuntu.com trusty-updates/restricted Sources [5217 B]
Get:5 http://archive.ubuntu.com trusty-updates/universe Sources [193 kB]
Get:6 http://archive.ubuntu.com trusty-updates/main amd64 Packages [948 kB]
Get:7 http://archive.ubuntu.com trusty-updates/restricted amd64 Packages [23.5 kB]
Get:8 http://archive.ubuntu.com trusty-updates/universe amd64 Packages [463 kB]
Get:9 http://archive.ubuntu.com trusty-security/main Sources [141 kB]
Get:10 http://archive.ubuntu.com trusty-security/restricted Sources [3920 B]
Get:11 http://archive.ubuntu.com trusty-security/universe Sources [40.9 kB]
Get:12 http://archive.ubuntu.com trusty-security/main amd64 Packages [570 kB]
Get:13 http://archive.ubuntu.com trusty-security/restricted amd64 Packages [20.2 kB]
Get:14 http://archive.ubuntu.com trusty-security/universe amd64 Packages [165 kB]
Get:15 http://archive.ubuntu.com trusty/main Sources [1335 kB]
Get:16 http://archive.ubuntu.com trusty/restricted Sources [5335 B]
Get:17 http://archive.ubuntu.com trusty/universe Sources [7926 kB]
Get:18 http://archive.ubuntu.com trusty/main amd64 Packages [1743 kB]
Get:19 http://archive.ubuntu.com trusty/restricted amd64 Packages [16.0 kB]
Get:20 http://archive.ubuntu.com trusty/universe amd64 Packages [7589 kB]
Fetched 21.7 MB in 2min 26s (148 kB/s)
Reading package lists...
 ---> 11e4b9b06a05
Removing intermediate container 2463796467f8
Step 3 : RUN apt-get install rsyslog
 ---> Running in e16959050268
Reading package lists...
Building dependency tree...
Reading state information...
rsyslog is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
 ---> ec6b5ccfe8c0
Removing intermediate container e16959050268
Step 4 : CMD rsyslogd -n
 ---> Running in 79e4a4eb00ff
 ---> 8ec0c5bb60d0
Removing intermediate container 79e4a4eb00ff
Step 5 : VOLUME /dev
 ---> Running in 347f8c6ade7e
 ---> 6420e9f77fba
Removing intermediate container 347f8c6ade7e
Step 6 : VOLUME /var/log
 ---> Running in de699807136f
 ---> be5bde4d6a85
Removing intermediate container de699807136f
Successfully built be5bde4d6a85
[root@localhost ~]# docker run --name syslog -d -v /tmp/syslogdev:/dev syslog
867a66d50ef7e8445955fe782592b628249ebeb6dfa80049e84a63d858ae2f54
docker: Error response from daemon: Container command '/bin/sh' not found or does not exist..
[root@localhost ~]# cat Dockerfile
FROM ubuntu:14.04
RUN apt-get update -q
RUN apt-get install rsyslog
RUN ln -snf /bin/bash /bin/sh
CMD rsyslogd -n
VOLUME /dev
VOLUME /var/log
[root@localhost ~]# docker build -t syslog2 .
Sending build context to Docker daemon 132.1 kB
Step 1 : FROM ubuntu:14.04
 ---> b72889fa879c
Step 2 : RUN apt-get update -q
 ---> Using cache
 ---> 11e4b9b06a05
Step 3 : RUN apt-get install rsyslog
 ---> Using cache
 ---> ec6b5ccfe8c0
Step 4 : RUN ln -snf /bin/bash /bin/sh
 ---> Running in 0fd64938ee85
 ---> 2c174cff7707
Removing intermediate container 0fd64938ee85
Step 5 : CMD rsyslogd -n
 ---> Running in 5fc415eaf75a
 ---> 16390b94ad90
Removing intermediate container 5fc415eaf75a
Step 6 : VOLUME /dev
 ---> Running in 308f5e2d6f4e
 ---> ed81f91fcda0
Removing intermediate container 308f5e2d6f4e
Step 7 : VOLUME /var/log
 ---> Running in 4daa6d206e65
 ---> 0bf88dc8c124
Removing intermediate container 4daa6d206e65
Successfully built 0bf88dc8c124
[root@localhost ~]# docker run --name syslog2 -d -v /tmp/syslogdev:/dev syslog2
1cd650a2bc99db13cea2561d25c68f4f5906110eb7659b62fe70cbb217ab1e4c
docker: Error response from daemon: Container command '/bin/sh' not found or does not exist..

Finalement je vais garder Fédora 😉 Misère. Ou alors je vais prendre une image minimale sur GitHub :

[root@localhost ~]# docker run -d -p 127.0.0.1:514:514/udp -v /var/log/syslog-ng:/var/log/syslog-ng --name syslog-ng bobrik/syslog-ng
Unable to find image 'bobrik/syslog-ng:latest' locally
latest: Pulling from bobrik/syslog-ng
c862d82a67a2: Pull complete 
41325d62a122: Pull complete 
b986d6a20615: Pull complete 
c91b20352765: Pull complete 
a3ed95caeb02: Pull complete 
Digest: sha256:c4067389b0e3846438a22856c731158b5ce35bdee691756c48feb4e557240597
Status: Downloaded newer image for bobrik/syslog-ng:latest
698b673be5ac4f0b0b1d2f0c7b8e040b44f183c55171b946a9e592dba439fe49

Ensuite on va modifier la configuration de HAproxy pour envoyer les logs dans ce container.

J’aurais pu utiliser d’autres techniques mais j’aime bien savoir que tous les logs sont au même endroit. Cela permet de recouper plus facilement les informations. Par exemple en faisant des liens :

RUN ln -sf /dev/stdout /var/log/nginx/access.log 
RUN ln -sf /dev/stderr /var/log/nginx/error.log

Mais je préfère l’idée du container à logs. On sais que c’est uniquement que lui qui va grossir et plus d’avoir des recoupements simplifiés.
Avec la configuration modifié cela donne :

[root@localhost ~]# cat haproxy.cfg 
global
    maxconn 400

defaults
    log syslog-ng global
    mode    tcp
    option  tcplog
    option  dontlognull
    retries 4
    maxconn 200
    timeout connect  5000
    timeout client  50000
    timeout server  50000

frontend http-in
    bind *:80	
    log syslog-ng local0	
    default_backend serveur

backend serveur
        mode tcp
        balance roundrobin
        server server1 my-server4-1:80
        server server2 my-server4-2:80
        server server3 my-server4-3:80
        server server4 my-server4-4:80

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                             NAMES
698b673be5ac        bobrik/syslog-ng    "/usr/sbin/syslog-ng "   3 minutes ago       Up 3 minutes        514/tcp, 127.0.0.1:514->514/udp   syslog-ng
78f6bc54152e        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8083->80/tcp              my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8082->80/tcp              my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8081->80/tcp              my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8080->80/tcp              my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   16 hours ago        Up 16 hours         0.0.0.0:5432->5432/tcp            postgres2
[root@localhost ~]# docker run -d --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 --link syslog-ng -p 80:80 --name mon-haproxy-v16 my-haproxy-v15
ebbe54ce6794f7075f9a43c30903f508c2200098ccd2f530b7925c131e94e56e
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
IP

eth0
QUIT
Connection closed by foreign host.
[root@localhost ~]# docker logs 698b673be5ac
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                             NAMES
ebbe54ce6794        my-haproxy-v15      "/docker-entrypoint.s"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp                mon-haproxy-v16
698b673be5ac        bobrik/syslog-ng    "/usr/sbin/syslog-ng "   5 minutes ago        Up 5 minutes        514/tcp, 127.0.0.1:514->514/udp   syslog-ng
78f6bc54152e        my-server4          "/sbin/server4"          6 hours ago          Up 6 hours          0.0.0.0:8083->80/tcp              my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          6 hours ago          Up 6 hours          0.0.0.0:8082->80/tcp              my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          6 hours ago          Up 6 hours          0.0.0.0:8081->80/tcp              my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          6 hours ago          Up 6 hours          0.0.0.0:8080->80/tcp              my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   16 hours ago         Up 16 hours         0.0.0.0:5432->5432/tcp            postgres2
[root@localhost ~]# docker logs ebbe54ce6794
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 

Je vais essayer sur un autre port …

[root@localhost ~]# docker stop syslog-ng
syslog-ng
[root@localhost ~]# docker rm syslog-ng
syslog-ng
[root@localhost ~]# docker run -d -p 127.0.0.1:514:515/udp     -v /var/log/syslog-ng:/var/log/syslog-ng     --name syslog-ng bobrik/syslog-ng
6307a2a148b1323c5cddc2f4acb14b0e667e63fd3f98e85bd6a35bad358a551d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
6307a2a148b1        bobrik/syslog-ng    "/usr/sbin/syslog-ng "   22 seconds ago      Up 21 seconds       514/tcp, 514/udp, 127.0.0.1:514->515/udp   syslog-ng
ebbe54ce6794        my-haproxy-v15      "/docker-entrypoint.s"   9 minutes ago       Up 9 minutes        0.0.0.0:80->80/tcp                         mon-haproxy-v16
78f6bc54152e        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8083->80/tcp                       my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8082->80/tcp                       my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8081->80/tcp                       my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8080->80/tcp                       my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   16 hours ago        Up 16 hours         0.0.0.0:5432->5432/tcp                     postgres2
[root@localhost ~]# docker logs 6307a2a148b1
[root@localhost ~]# logger -n 127.0.0.1 -P 516 -p auth.notice "Mon message" -s -d

Je n’ai toujours rien dans le dossier /var/log/syslog-ng/. Même sans redirection de port je n’ai pas de logs :

[root@localhost ~]# docker run -d -v /var/log/syslog-ng:/var/log/syslog-ng     --name syslog-ng bobrik/syslog-ng
6b798602b6610a4046129ccae1338358da8ea27334dbab37fa8ca606f1fc0d4a
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
6b798602b661        bobrik/syslog-ng    "/usr/sbin/syslog-ng "   4 seconds ago       Up 3 seconds        514/tcp, 514/udp         syslog-ng
ebbe54ce6794        my-haproxy-v15      "/docker-entrypoint.s"   17 minutes ago      Up 17 minutes       0.0.0.0:80->80/tcp       mon-haproxy-v16
78f6bc54152e        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          6 hours ago         Up 6 hours          0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   16 hours ago        Up 16 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker exec -t syslog-ng tail -f /var/log/syslog-ng/*
tail: can't open '/var/log/syslog-ng/*': No such file or directory
tail: no files

Je pense que cela ne va pas être trivial. J’ai pu lire un article « 6 million ways to log in docker« . J’ai du en tester 10 sans succès … La communauté Docker c’est la modestie avant tout 😉 .

Je vais essayer avec rsyslog.

[root@localhost ~]# docker run -d -v /tmp:/var/log/syslog -p 127.0.0.1:5514:514/udp  --name rsyslog voxxit/rsyslog
Unable to find image 'voxxit/rsyslog:latest' locally
latest: Pulling from voxxit/rsyslog
6d6a6a7dae29: Pull complete 
117d78ae6306: Pull complete 
de74d1b16221: Pull complete 
8c510761e859: Pull complete 
Digest: sha256:2a874ed2f56e5854714ce68ef905f5e1c428aed92cf92e19e8c925d5faf4f277
Status: Downloaded newer image for voxxit/rsyslog:latest
44f6508471599f22cbbaae8464d9925878300198c32aca388a4eaf27bb89c655

Dans un premier temps je vais essayer d’envoyer vers le syslog local.

[root@localhost ~]# docker run -d --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 --log-driver=syslog --log-opt syslog-address=udp://127.0.0.1:514 --log-opt syslog-facility=daemon --log-opt syslog-tag=mon-haproxy -p 80:80 --name mon-haproxy-v16 my-haproxy-v15 
3aa83e6ee91344caafa858d637810a01546dd9aee330383c0d66379ecdfc0126
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
3aa83e6ee913        my-haproxy-v15      "/docker-entrypoint.s"   5 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp       mon-haproxy-v16
78f6bc54152e        my-server4          "/sbin/server4"          7 hours ago         Up 7 hours          0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          7 hours ago         Up 7 hours          0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          7 hours ago         Up 7 hours          0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          7 hours ago         Up 7 hours          0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   17 hours ago        Up 17 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
IP

eth0
QUIT
Connection closed by foreign host.
[root@localhost ~]# tail -f /var/log/messages 
Apr 15 14:17:01 localhost NetworkManager[554]:   (docker0): bridge port vethd376d33 was attached
Apr 15 14:17:01 localhost NetworkManager[554]:   (vethd376d33): enslaved to docker0
Apr 15 14:17:01 localhost kernel: eth0: renamed from vethd8906f7
Apr 15 14:17:01 localhost kernel: IPv6: ADDRCONF(NETDEV_CHANGE): vethd376d33: link becomes ready
Apr 15 14:17:01 localhost kernel: docker0: port 6(vethd376d33) entered forwarding state
Apr 15 14:17:01 localhost kernel: docker0: port 6(vethd376d33) entered forwarding state
Apr 15 14:17:01 localhost NetworkManager[554]:   (vethd8906f7): failed to disable userspace IPv6LL address handling
Apr 15 14:17:01 localhost NetworkManager[554]:   (vethd376d33): link connected
Apr 15 14:17:01 localhost docker: time="2016-04-15T14:17:01.191761817+01:00" level=warning msg="Using log tag from deprecated log-opt 'syslog-tag'. Please use: --log-opt tag=\"mon-haproxy\""
Apr 15 14:17:16 localhost kernel: docker0: port 6(vethd376d33) entered forwarding state
[root@localhost ~]# docker stop mon-haproxy-v16
mon-haproxy-v16
[root@localhost ~]# docker rm mon-haproxy-v16
mon-haproxy-v16
[root@localhost ~]# docker run -d --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 --log-driver=syslog --log-opt syslog-address=udp://127.0.0.1:514 --log-opt syslog-facility=daemon -p 80:80 --name mon-haproxy-v16 my-haproxy-v15 
123df78c2db1ec010b9348049ae58519cf5f656a6a433c27e8a6b966bd57ed67
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
QUIT
Connection closed by foreign host.
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
QUIT
Connection closed by foreign host.
[root@localhost ~]# tail -f /var/log/messages 
Apr 15 14:19:44 localhost NetworkManager[554]:   (veth36cbbad): new Veth device (carrier: OFF, driver: 'veth', ifindex: 337)
Apr 15 14:19:44 localhost NetworkManager[554]:   (docker0): bridge port veth36cbbad was attached
Apr 15 14:19:44 localhost NetworkManager[554]:   (veth36cbbad): enslaved to docker0
Apr 15 14:19:44 localhost kernel: eth0: renamed from veth5611685
Apr 15 14:19:44 localhost NetworkManager[554]:   (veth5611685): failed to disable userspace IPv6LL address handling
Apr 15 14:19:44 localhost NetworkManager[554]:   (veth36cbbad): link connected
Apr 15 14:19:44 localhost kernel: IPv6: ADDRCONF(NETDEV_CHANGE): veth36cbbad: link becomes ready
Apr 15 14:19:44 localhost kernel: docker0: port 6(veth36cbbad) entered forwarding state
Apr 15 14:19:44 localhost kernel: docker0: port 6(veth36cbbad) entered forwarding state
Apr 15 14:19:59 localhost kernel: docker0: port 6(veth36cbbad) entered forwarding state

Aie j’ai oublié de refaire le build …

[root@localhost ~]# cat haproxy.cfg 
global
    maxconn 400

defaults
    log 127.0.0.1 local0
    mode    tcp
    option  tcplog
    option  dontlognull
    retries 4
    maxconn 200
    timeout connect  5000
    timeout client  50000
    timeout server  50000

frontend http-in
    bind *:80	
    log 127.0.0.1 local0	
    default_backend serveur

backend serveur
        mode tcp
        balance roundrobin
        server server1 my-server4-1:80
        server server2 my-server4-2:80
        server server3 my-server4-3:80
        server server4 my-server4-4:80

[root@localhost ~]# docker build -t my-haproxy-v15 .
Sending build context to Docker daemon 132.1 kB
Step 1 : FROM haproxy:1.5
 ---> 011e001101c0
Step 2 : COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> 3579ba8e9e3c
Removing intermediate container 37aab30df069
Step 3 : EXPOSE 80
 ---> Running in 2e94185ce8bd
 ---> 824e19a4591a
Removing intermediate container 2e94185ce8bd
Successfully built 824e19a4591a

J’ai aussi essayé :

[root@localhost ~]# cat haproxy.cfg 
global
    maxconn 400

defaults
    log 127.0.0.1 local0
    log 127.0.0.1 local1 notice
    mode    tcp
    option  tcplog
    option  dontlognull
    retries 4
    maxconn 200
    timeout connect  5000
    timeout client  50000
    timeout server  50000

frontend http-in
    bind *:80
    default_backend serveur

backend serveur
        mode tcp
        balance roundrobin
        server server1 my-server4-1:80
        server server2 my-server4-2:80
        server server3 my-server4-3:80
        server server4 my-server4-4:80

Et dernièrement :

[root@localhost ~]# cat haproxy.cfg 
global
    maxconn 400

defaults
    log 127.0.0.1 local0
    log 127.0.0.1 local1 notice
    log 127.0.0.1 local5 debug
    mode    tcp
    option  tcplog
    option  dontlognull
    retries 4
    maxconn 200
    timeout connect  5000
    timeout client  50000
    timeout server  50000

frontend http-in
    bind *:80
    default_backend serveur

backend serveur
        mode tcp
        balance roundrobin
        server server1 my-server4-1:80
        server server2 my-server4-2:80
        server server3 my-server4-3:80
        server server4 my-server4-4:80

Sans succès… mais je me suis rendu compte que rsyslog n’écoutais pas en local, j’ai donc modifié la configuration dans : /etc/rsyslog.conf.

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
# Ajout
local1.*                                                /var/log/docker-1.log
local5.*                                                /var/log/docker-5.log
[root@localhost ~]# systemctl restart rsyslog.service
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
QUIT
Connection closed by foreign host.
[root@localhost ~]# tail -f /var/log/
anaconda/           btmp                dmesg.old           lastlog             ppp/                syslog-ng/          wpa_supplicant.log  
audit/              cron                firewalld           maillog             secure              tallylog            wtmp                
boot.log            dmesg               grubby              messages            spooler             tuned/              yum.log             
[root@localhost ~]# tail -f /var/log/messages 
Apr 15 14:44:13 localhost rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="17977" x-info="http://www.rsyslog.com"] exiting on signal 15.
Apr 15 14:44:13 localhost rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="17996" x-info="http://www.rsyslog.com"] start
Apr 15 14:44:13 localhost systemd: Stopping System Logging Service...
Apr 15 14:44:13 localhost systemd: Starting System Logging Service...
Apr 15 14:44:13 localhost systemd: Started System Logging Service.

Mon dernier test :

[root@localhost ~]# cat haproxy.cfg 
global
    maxconn 400

defaults
    log 127.0.0.1 local5 debug
    mode    tcp
    retries 4
    maxconn 200
    timeout connect  5000
    timeout client  50000
    timeout server  50000

frontend http-in
    bind *:80
    default_backend serveur

backend serveur
        mode tcp
        balance roundrobin
        server server1 my-server4-1:80
        server server2 my-server4-2:80
        server server3 my-server4-3:80
        server server4 my-server4-4:80
...
[root@localhost ~]# docker run -d --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 --log-driver=syslog --log-opt syslog-address=udp://127.0.0.1:514 --log-opt tag=haproxy -p 80:80 --name mon-haproxy-v16 my-haproxy-v15 
86bbca2ce9cdb141a286a96b79ecbd350abb171a2b35280d509ef19b82b11504

Misère.

Docker : le huitième pas.

Attention ceci est mon brouillon avant de faire une belle documentation sur Docker (il y a à boire et à manger).

Je me suis planté complètement avec HAProxy, pour l’instant je n’ai pas compris mes erreurs car je n’ai pas réussi à avoir accès au logs. Mon étape va être de voir si avec l’autre server de répartition de charge : nginx, j’arrive à faire mieux.

On commence par le téléchargement de la version :

[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
efd26ecc9548: Already exists 
a3ed95caeb02: Pull complete 
83f52fbfa5f8: Pull complete 
fa664caa1402: Pull complete 
Digest: sha256:12127e07a75bda1022fbd4ea231f5527a1899aad4679e3940482db3b57383b1d
Status: Downloaded newer image for nginx:latest

Ensuite on doit faire la configuration, on va faire une configuration en mode « stream » car notre protocole n’est pas du HTTP, HTTPS ou SMTP.

Et c’est partie pour une première version :

[root@localhost ~]# cat nginx.conf 
worker_processes  4;

events {
    worker_connections  8192;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
}

stream {
    upstream stream_backend {
	server my-server4-1:8080 weight=5;
        server my-server4-2:8081;
        server my-server4-3:8082;
        server my-server4-4:8083;
    }
    server {
        listen     80;
        proxy_pass stream_backend;
    }
}

[root@localhost ~]# docker run --name mon-nginx-v1 --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 -p 80:80 -v /root/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx 
95adc730e7b2e1164d1c25aee18b0077e122f02aa8197d52f7ed6c3cfa8ca77a
[root@localhost ~]# docker logs 95adc730e7b2e1164d1c25aee18b0077e122f02aa8197d52f7ed6c3cfa8ca77a
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
95adc730e7b2        nginx               "nginx -g 'daemon off"   12 seconds ago      Up 12 seconds       0.0.0.0:80->80/tcp, 443/tcp   mon-nginx-v1
78f6bc54152e        my-server4          "/sbin/server4"          4 hours ago         Up 4 hours          0.0.0.0:8083->80/tcp          my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          4 hours ago         Up 4 hours          0.0.0.0:8082->80/tcp          my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          4 hours ago         Up 4 hours          0.0.0.0:8081->80/tcp          my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          4 hours ago         Up 4 hours          0.0.0.0:8080->80/tcp          my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   14 hours ago        Up 14 hours         0.0.0.0:5432->5432/tcp        postgres2
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.

J’ai l’impression que cela va être long 🙁 Par contre la bonne nouvelle c’est qu’il y a des logs !

[root@localhost ~]# docker logs 95adc730e7b2e1164d1c25aee18b0077e122f02aa8197d52f7ed6c3cfa8ca77a
2016/04/15 10:11:32 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: 0.0.0.0:80, upstream: "172.17.0.3:8080", bytes from/to client:0/0, bytes from/to upstream:0/0
2016/04/15 10:11:32 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: 0.0.0.0:80, upstream: "172.17.0.4:8081", bytes from/to client:0/0, bytes from/to upstream:0/0
2016/04/15 10:11:32 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: 0.0.0.0:80, upstream: "172.17.0.5:8082", bytes from/to client:0/0, bytes from/to upstream:0/0
2016/04/15 10:11:32 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: 0.0.0.0:80, upstream: "172.17.0.6:8083", bytes from/to client:0/0, bytes from/to upstream:0/0
[root@localhost ~]# telnet 172.17.0.3 8080
Trying 172.17.0.3...
telnet: connect to address 172.17.0.3: Connection refused
[root@localhost ~]# telnet 127.0.0.1 8080
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
IP

eth0
QUIT
Connection closed by foreign host.

J’ai compris je dois toujours attaquer le port 80 car je dois penser en terme de container. Et à l’intérieur du container c’est le port 80 qui est ouvert.

[root@localhost ~]# cat nginx.conf
worker_processes  4;

events {
    worker_connections  8192;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
}

stream {
    upstream stream_backend {
	server my-server4-1:80 weight=5;
        server my-server4-2:80;
        server my-server4-3:80;
        server my-server4-4:80;
    }
    server {
        listen     80;
        proxy_pass stream_backend;
    }
}

[root@localhost ~]# docker run --name mon-nginx-v2 --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 -p 80:80 -v /root/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx 
304ce9e61abbd21e413a465018d79c285877b0fcc6bcb229444c8883b7e8e54d
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
IP

eth0
INTERFACE

172.17.0.3
QUIT
Connection closed by foreign host.
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
INTERFACE

172.17.0.3
QUIT
Connection closed by foreign host.
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
INTERFACE

172.17.0.4
QUIT
Connection closed by foreign host.
[root@localhost ~]# docker logs 304ce9e61abbd21e413a465018d79c285877b0fcc6bcb229444c8883b7e8e54d

Champagne ! Cela fonctionne quand je fais un telnet, je tombe de façon aléatoire sur un des serveurs. Par contre dans les logs je n’ai rien si cela fonctionne, il va falloir que je comprenne comment fonctionne les logs sous Docker. Je vais d’abord revenir sur HAProxy afin de voir si c’est pas le mauvais port qui causait un problème.

[root@localhost ~]# cat haproxy.cfg 
global
    maxconn 400

defaults
    log global
    mode    tcp
    option  tcplog
    option  dontlognull
    retries 4
    maxconn 200
    timeout connect  5000
    timeout client  50000
    timeout server  50000

frontend http-in
    bind *:80
    log 127.0.0.1 local0	
    default_backend serveur

backend serveur
        mode tcp
        balance roundrobin
        server server1 my-server4-1:80
        server server2 my-server4-2:80
        server server3 my-server4-3:80
        server server4 my-server4-4:80

[root@localhost ~]# docker build -t my-haproxy-v15 .
Sending build context to Docker daemon 131.1 kB
Step 1 : FROM haproxy:1.5
 ---> 011e001101c0
Step 2 : COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> 596df11f08ac
Removing intermediate container 40b11ef3c4bc
Step 3 : EXPOSE 80
 ---> Running in b955fb86c4b3
 ---> 921af748062e
Removing intermediate container b955fb86c4b3
Successfully built 921af748062e

[root@localhost ~]# docker run -d --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 -p 80:80 --name mon-haproxy-v15b my-haproxy-v15
1fd7d0db42301042d221e4765a38480cf91281be6ac859069894fa96856f311f

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1fd7d0db4230        my-haproxy-v15      "/docker-entrypoint.s"   5 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp       mon-haproxy-v15b
78f6bc54152e        my-server4          "/sbin/server4"          4 hours ago         Up 4 hours          0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          4 hours ago         Up 4 hours          0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          4 hours ago         Up 4 hours          0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          4 hours ago         Up 4 hours          0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   15 hours ago        Up 15 hours         0.0.0.0:5432->5432/tcp   postgres2

[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
IP

eth0
INTERFACE

172.17.0.3
QUIT
Connection closed by foreign host.
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

HELLO
INTERFACE

172.17.0.4
QUIT
Connection closed by foreign host.
[root@localhost ~]# docker logs 1fd7d0db42301042d221e4765a38480cf91281be6ac859069894fa96856f311f
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 

Super cela fonctionne aussi avec HAProxy, reste maintenant à voir les logs !

Docker : le septième pas.

Attention ceci est mon brouillon avant de faire une belle documentation sur Docker (il y a à boire et à manger). Sachant que celui-ci c’est 100% échec 🙁 .

J’ai repoussé plusieurs fois l’installation de HAproxy maintenant je vais devoir le faire. Pour cela je vais m’appuyer sur mon server4.c qui va recevoir la charge du HAproxy. Je vais lancer 4 server4 qui vont écouter sur 4 ports différents (8080/tcp, 8081/tcp, 8082/tcp, 8083/tcp) .

[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08c524d398af my-server4 "/sbin/server4" 49 minutes ago Up 49 minutes 0.0.0.0:80->80/tcp my-server4.1
2fc533c55725 postgres "/docker-entrypoint.s" 10 hours ago Up 10 hours 0.0.0.0:5432->5432/tcp postgres2
[root@localhost ~]# docker stop 08c524d398af
08c524d398af
[root@localhost ~]# docker run -p 8080:80 --link postgres2:postgres2 --name my-server4-1 -d my-server4
eacf3e4bc897f94c6cf5feee71194637c44708f85aaa497531e8f2d2ea6d2e0f
[root@localhost ~]# docker run -p 8081:80 --link postgres2:postgres2 --name my-server4-2 -d my-server4
a75937eb980dc24e260f1e7cfeb3611e3a93c339a0ff68202e4c483c0f768301
[root@localhost ~]# docker run -p 8082:80 --link postgres2:postgres2 --name my-server4-3 -d my-server4
fce6865343f1bf46d9089fb005624955f550d078d583711a23f85748e034421b
[root@localhost ~]# docker run -p 8083:80 --link postgres2:postgres2 --name my-server4-4 -d my-server4
78f6bc54152e1c5d7a8608a03f2a1937ec19ba05535f725445b203e42f3c6430
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78f6bc54152e my-server4 "/sbin/server4" 4 seconds ago Up 3 seconds 0.0.0.0:8083->80/tcp my-server4-4
fce6865343f1 my-server4 "/sbin/server4" 14 seconds ago Up 14 seconds 0.0.0.0:8082->80/tcp my-server4-3
a75937eb980d my-server4 "/sbin/server4" 24 seconds ago Up 24 seconds 0.0.0.0:8081->80/tcp my-server4-2
eacf3e4bc897 my-server4 "/sbin/server4" 35 seconds ago Up 34 seconds 0.0.0.0:8080->80/tcp my-server4-1
2fc533c55725 postgres "/docker-entrypoint.s" 10 hours ago Up 10 hours 0.0.0.0:5432->5432/tcp postgres2
[root@localhost ~]# df
Sys. de fichiers blocs de 1K Utilisé Disponible Uti% Monté sur
devtmpfs              360876       0     360876   0% /dev
tmpfs                 378400       0     378400   0% /dev/shm
tmpfs                 378400   10016     368384   3% /run
tmpfs                 378400       0     378400   0% /sys/fs/cgroup
/dev/sda2            4278272 2122616    2155656  50% /
/dev/sda1           17825792 2027556   13935068  13% /docker
tmpfs                  75680       0      75680   0% /run/user/0

J’ai maintenant tous mes serveurs server4 en place. On va partir sur cette configuration de HAProxy.

[root@localhost ~]# cat haproxy.cfg 
frontend docker-haproxy
        bind 127.0.0.1:80
        mode tcp
        log global
        option tcplog
        timeout client 3600s
        backlog 4096
        maxconn 50000
        default_backend dockers-server4

backend dockers-server4
        mode  tcp
        option log-health-checks
        option redispatch
        option tcplog
        balance roundrobin
        server server1 127.0.0.1:8080
        server server2 127.0.0.1:8081
	server server3 127.0.0.1:8082
	server server4 127.0.0.1:8083
        timeout connect 2s
        timeout queue 6s
        timeout server 3600s

Après le fichier de configuration, on doit faire le Dockerfile, puis le build.

[root@localhost ~]# cat Dockerfile
FROM haproxy:1.5
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

[root@localhost ~]# docker build -t my-haproxy .
Sending build context to Docker daemon   130 kB
Step 1 : FROM haproxy:1.5
1.5: Pulling from library/haproxy
efd26ecc9548: Already exists 
a3ed95caeb02: Pull complete 
545a1e51c226: Pull complete 
4f8fd706ca7d: Pull complete 
c7652a33f7e1: Pull complete 
Digest: sha256:8970d415c69e563a2729b2d1d123f743daef86757b965686f12b1f840cab13da
Status: Downloaded newer image for haproxy:1.5
 ---> 011e001101c0
Step 2 : COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> d22222a2d97a
Removing intermediate container da366b06caf8
Successfully built d22222a2d97a
[root@localhost ~]# docker run -p 80:80 -d --name mon-haproxy-server4 my-haproxy
dcfe4d416951e10592ef2025e569c742f0853e2026713c0a65edb37b2f5b5c1f
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
dcfe4d416951        my-haproxy          "/docker-entrypoint.s"   5 seconds ago       Up 4 seconds        0.0.0.0:80->80/tcp       mon-haproxy-server4
78f6bc54152e        my-server4          "/sbin/server4"          46 minutes ago      Up 46 minutes       0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          46 minutes ago      Up 46 minutes       0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          46 minutes ago      Up 46 minutes       0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          47 minutes ago      Up 47 minutes       0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   11 hours ago        Up 11 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.

J’ai du mal comprendre, ou alors le HAProxy n’est pas lancé. Je vais donc commencé par tester le fichier de configuration.

[root@localhost ~]# docker run -it --rm --name haproxy-syntax-check haproxy:1.5 haproxy -c -f /usr/local/etc/haproxy/haproxy.cfg
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -c -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
[ALERT] 105/062529 (6) : Could not open configuration file /usr/local/etc/haproxy/haproxy.cfg : No such file or directory
haproxy-systemd-wrapper: exit, haproxy RC=256
[root@localhost ~]# docker run -it --rm --name haproxy-syntax-check haproxy:1.5 haproxy -c -f ./haproxy.cfg
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -c -f ./haproxy.cfg -Ds 
[ALERT] 105/062620 (6) : Could not open configuration file ./haproxy.cfg : No such file or directory
haproxy-systemd-wrapper: exit, haproxy RC=256
[root@localhost ~]# docker run -it --rm --name haproxy-syntax-check haproxy:1.5 haproxy -c -f haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -c -f haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg -Ds 
[ALERT] 105/062638 (6) : Could not open configuration file haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg : No such file or directory
haproxy-systemd-wrapper: exit, haproxy RC=256
[root@localhost ~]# locate haproxy.cfg
/docker/btrfs/subvolumes/5ca530873be0b9de105bf5ed3d05288a32c39d376d07c48c02a7182f2a58c3be/usr/local/etc/haproxy/haproxy.cfg
/docker/btrfs/subvolumes/9e5cabf00aa9cbc5c34e864f828f6e4e125f6a200c35781b746a4078b4506d00/usr/local/etc/haproxy/haproxy.cfg
/docker/btrfs/subvolumes/9e5cabf00aa9cbc5c34e864f828f6e4e125f6a200c35781b746a4078b4506d00-init/usr/local/etc/haproxy/haproxy.cfg
/docker/btrfs/subvolumes/e541302d054ad41122dfc8f8537da225d57db270e750f23cc34e9ff29298d15b/usr/local/etc/haproxy/haproxy.cfg
/docker/btrfs/subvolumes/e541302d054ad41122dfc8f8537da225d57db270e750f23cc34e9ff29298d15b-init/usr/local/etc/haproxy/haproxy.cfg
/root/haproxy.cfg
/usr/local/etc/haproxy/haproxy.cfg

J’ai l’impression d’avoir déjà eu ce problème… en fait le fichier est en local mais il n’est pas dans le container. Pourtant dans le Dockerfile je demande bien la copie. Je vais donc m’en sortir avec la commande -v mais cela ne me plait pas 🙁 , j’ai du louper un épisode.

[root@localhost ~]# docker run -it --rm --name haproxy-syntax-check haproxy:1.5 haproxy -c -f /usr/local/etc/haproxy/haproxy.cfg -v ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -c -f /usr/local/etc/haproxy/haproxy.cfg -v ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro -Ds 
HA-Proxy version 1.5.17 2016/04/13
Copyright 2000-2016 Willy Tarreau <willy@haproxy.org>

haproxy-systemd-wrapper: exit, haproxy RC=0

Maintenant il me faut voir les logs de HAproxy, pour cela je vais devoir refaire le fichier de configuration.
Je recommande et j’en profile pour signaler le port 80 dans le Dockerfile :

[root@localhost ~]# cat Dockerfile
FROM haproxy:1.5
COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
EXPOSE 80
[root@localhost ~]# cat haproxy.cfg 
frontend docker-haproxy
        bind 127.0.0.1:80
        mode tcp
	log /dev/log local2
        option tcplog
        timeout client 3600s
        backlog 4096
        maxconn 50000
        default_backend dockers-server4

backend dockers-server4
        mode  tcp
        option log-health-checks
        option redispatch
        option tcplog
        balance roundrobin
        server server1 127.0.0.1:8080
        server server2 127.0.0.1:8081
	server server3 127.0.0.1:8082
	server server4 127.0.0.1:8083
        timeout connect 2s
        timeout queue 6s
        timeout server 3600s
[root@localhost ~]# cat Dockerfile
FROM haproxy:1.5
COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
EXPOSE 80
[root@localhost ~]# docker run -d -p 80:80 --name mon-haproxy--v2 my-haproxy-v2 -v /dev/log:/dev/log
64ccfb0eaec9681e52150830a38b52b0d4dcff91c6a66ab3c45ee4b18d40064d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   11 hours ago        Up 11 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   11 hours ago        Up 11 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker run -d -p 80:80 --name mon-haproxy---v2 my-haproxy-v2 
4147ceb13680a33e0c3e8b2f8e8d8f10a195fead10c10d7a1ea21e208e103a59
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
4147ceb13680        my-haproxy-v2       "/docker-entrypoint.s"   2 seconds ago       Up 1 seconds        0.0.0.0:80->80/tcp       mon-haproxy---v2
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   11 hours ago        Up 11 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker logs 4147ceb13680
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
[ALERT] 105/065612 (6) : sendto logger #1 failed: No such file or directory (errno=2)

C’est l’échec quand je lance avec l’option -v . Je vais donc apporter quelques modifications.

[root@localhost ~]# cat haproxy.cfg 
global
    	log 127.0.0.1   local0
    	log 127.0.0.1   local1 notice
    	debug
    	stats timeout 30s
    	maxconn 1024

frontend docker-haproxy
        bind *:80
        mode tcp
        option tcplog
        timeout connect 50
        timeout client 50
        timeout server 50
        default_backend dockers-server4

backend dockers-server4
        mode  tcp
        option log-health-checks
        option redispatch
        option tcplog
        balance roundrobin
        server server1 127.0.0.1:8080
        server server2 127.0.0.1:8081
	server server3 127.0.0.1:8082
	server server4 127.0.0.1:8083
        timeout connect 10s
        timeout queue 10s

[root@localhost ~]# docker build -t my-haproxy-v3 .
Sending build context to Docker daemon   130 kB
Step 1 : FROM haproxy:1.5
 ---> 011e001101c0
Step 2 : COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> ca38be6976c3
Removing intermediate container fdeadde5c6fe
Step 3 : EXPOSE 80
 ---> Running in 31e17c430e2e
 ---> 4285c0689948
Removing intermediate container 31e17c430e2e
Successfully built 4285c0689948
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
4147ceb13680        my-haproxy-v2       "/docker-entrypoint.s"   9 minutes ago       Up 9 minutes        0.0.0.0:80->80/tcp       mon-haproxy---v2
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   11 hours ago        Up 11 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker stop 4147ceb13680
4147ceb13680
[root@localhost ~]# docker run -d -p 80:80 --name mon-haproxy-v3 my-haproxy-v3 
53d881348b237a33324da593a070f566ef9af1fffeceb01ffab56f4c270c7268
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
53d881348b23        my-haproxy-v3       "/docker-entrypoint.s"   8 seconds ago       Up 8 seconds        0.0.0.0:80->80/tcp       mon-haproxy-v3
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   11 hours ago        Up 11 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.
[root@localhost ~]# docker logs 53d881348b23
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
[WARNING] 105/070623 (6) : parsing [/usr/local/etc/haproxy/haproxy.cfg:12] : 'timeout connect' will be ignored because frontend 'docker-haproxy' has no backend capability
[WARNING] 105/070623 (6) : parsing [/usr/local/etc/haproxy/haproxy.cfg:14] : 'timeout server' will be ignored because frontend 'docker-haproxy' has no backend capability
[WARNING] 105/070623 (6) : config : frontend 'GLOBAL' has no 'bind' directive. Please declare it as a backend if this was intended.
[WARNING] 105/070623 (6) : config : log format ignored for frontend 'docker-haproxy' since it has no log address.
[WARNING] 105/070623 (6) : config : missing timeouts for backend 'dockers-server4'.
   | While not properly invalid, you will certainly encounter various problems
   | with such a configuration. To fix this, please ensure that all following
   | timeouts are set to a non-zero value: 'client', 'connect', 'server'.

Un nouveau test :

[root@localhost ~]# cat haproxy.cfg 
global
    	log 127.0.0.1   local0
    	log 127.0.0.1   local1 notice
    	debug
    	stats timeout 30s
    	maxconn 1024

frontend docker-haproxy
        bind 127.0.0.1:80 
        mode tcp
        option tcplog
        timeout client 50
        default_backend dockers-server4

backend dockers-server4
        mode  tcp
        option tcplog
        balance roundrobin
        server server1 127.0.0.1:8080
        server server2 127.0.0.1:8081
	server server3 127.0.0.1:8082
	server server4 127.0.0.1:8083
        timeout connect 10s
        timeout queue 10s

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
53d881348b23        my-haproxy-v3       "/docker-entrypoint.s"   5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp       mon-haproxy-v3
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   11 hours ago        Up 11 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker stop 53d881348b23
53d881348b23
[root@localhost ~]# docker build -t my-haproxy-v4 .
Sending build context to Docker daemon   130 kB
Step 1 : FROM haproxy:1.5
 ---> 011e001101c0
Step 2 : COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> 1d1b5ce9efa3
Removing intermediate container 8552d9644f69
Step 3 : EXPOSE 80
 ---> Running in 74b056413e7e
 ---> a81f74591597
Removing intermediate container 74b056413e7e
Successfully built a81f74591597
[root@localhost ~]# docker run -d -p 80:80 --name mon-haproxy-v4 my-haproxy-v4 
8067ac57b6240b376d6d783d61e5345e0e3a4d0296a4b91ea0740eadf859257d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
8067ac57b624        my-haproxy-v4       "/docker-entrypoint.s"   3 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp       mon-haproxy-v4
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   11 hours ago        Up 11 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker logs 8067ac57b624
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
[WARNING] 105/071212 (6) : config : frontend 'GLOBAL' has no 'bind' directive. Please declare it as a backend if this was intended.
[WARNING] 105/071212 (6) : config : log format ignored for frontend 'docker-haproxy' since it has no log address.
[WARNING] 105/071212 (6) : config : missing timeouts for backend 'dockers-server4'.
   | While not properly invalid, you will certainly encounter various problems
   | with such a configuration. To fix this, please ensure that all following
   | timeouts are set to a non-zero value: 'client', 'connect', 'server'.

Je vais prendre une autre syntaxe pour le HAproxy :

[root@localhost ~]# cat haproxy.cfg 
global
        debug
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice

defaults
        log global
        mode    tcp
        timeout connect 5000
        timeout client 5000
        timeout server 5000

listen http :80
        mode tcp
        balance roundrobin
        server server1 127.0.0.1:8080 check
        server server2 127.0.0.1:8081 check
        server server3 127.0.0.1:8082 check
        server server4 127.0.0.1:8083 check

[root@localhost ~]# docker build -t my-haproxy-v5 .
Sending build context to Docker daemon 129.5 kB
Step 1 : FROM haproxy:1.5
 ---> 011e001101c0
Step 2 : COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> f0e298916916
Removing intermediate container bde8ad053d88
Step 3 : EXPOSE 80
 ---> Running in 91e7630a2f2b
 ---> 33fd422d7c01
Removing intermediate container 91e7630a2f2b
Successfully built 33fd422d7c01
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
8067ac57b624        my-haproxy-v4       "/docker-entrypoint.s"   7 minutes ago       Up 7 minutes        0.0.0.0:80->80/tcp       mon-haproxy-v4
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   11 hours ago        Up 11 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker stop 8067ac57b624
8067ac57b624
[root@localhost ~]# docker run -d -p 80:80 --name mon-haproxy-v5 my-haproxy-v5 
36dc1d1c8699fd628909c3c4e064991b8ff011ffb42620066374eb14c5b5617a
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
36dc1d1c8699        my-haproxy-v5       "/docker-entrypoint.s"   6 seconds ago       Up 6 seconds        0.0.0.0:80->80/tcp       mon-haproxy-v5
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   11 hours ago        Up 11 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker logs 36dc1d1c8699
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.

Je n’ai plus de Warning mais ce n’est pas pour autant que cela fonctionne 🙁 . Je tourne en rond ..

[root@localhost ~]# cat haproxy.cfg 
global
        debug
	log /dev/log local2

defaults
        log global
        mode    tcp
        timeout connect 5000
        timeout client 5000
        timeout server 5000

listen http :80
        mode tcp
        balance roundrobin
        server server1 127.0.0.1:8080 check
        server server2 127.0.0.1:8081 check
        server server3 127.0.0.1:8082 check
        server server4 127.0.0.1:8083 check
[root@localhost ~]# docker build -t my-haproxy-v6 .
Sending build context to Docker daemon 129.5 kB
Step 1 : FROM haproxy:1.5
 ---> 011e001101c0
Step 2 : COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> 39b1812d0aa2
Removing intermediate container 51a78465fe7c
Step 3 : EXPOSE 80
 ---> Running in c29ce6db7d20
 ---> 7aa5797d1258
Removing intermediate container c29ce6db7d20
Successfully built 7aa5797d1258
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
36dc1d1c8699        my-haproxy-v5       "/docker-entrypoint.s"   10 minutes ago      Up 10 minutes       0.0.0.0:80->80/tcp       mon-haproxy-v5
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   12 hours ago        Up 12 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker stop 36dc1d1c8699
36dc1d1c8699
[root@localhost ~]# docker run -d -v /dev/logs:/dev/logs -p 80:80 --name mon-haproxy-v6 my-haproxy-v6
58cf965e6ccf1d538c736493d6bd1b6829bfb1bb345aa470e60e9290ece54d7d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
58cf965e6ccf        my-haproxy-v6       "/docker-entrypoint.s"   4 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp       mon-haproxy-v6
78f6bc54152e        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   12 hours ago        Up 12 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.
[root@localhost ~]# docker logs 58cf965e6ccf
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
[ALERT] 105/073135 (6) : sendto logger #1 failed: No such file or directory (errno=2)

Je vais essayer de mettre tous les fichiers en local ..

[root@localhost ~]# mkdir /docker/mon-haxproxy
[root@localhost ~]# mkdir /docker/mon-haxproxy/log
[root@localhost ~]# mkdir /docker/mon-haxproxy/run
[root@localhost ~]# mkdir /docker/mon-haxproxy/lib
[root@localhost ~]# cat haproxy.cfg 
global
        debug
	log 127.0.0.1 local2

defaults
        log global
        mode    tcp
        timeout connect 5000
        timeout client 5000
        timeout server 5000

listen http :80
        mode tcp
        balance roundrobin
        server server1 127.0.0.1:8080 check
        server server2 127.0.0.1:8081 check
        server server3 127.0.0.1:8082 check
        server server4 127.0.0.1:8083 check

[root@localhost ~]# docker build -t my-haproxy-v7 .
Sending build context to Docker daemon 129.5 kB
Step 1 : FROM haproxy:1.5
 ---> 011e001101c0
Step 2 : COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> de4df4115d0d
Removing intermediate container 865acfb251bb
Step 3 : EXPOSE 80
 ---> Running in 90bcecb3e4a2
 ---> b7437c93d09a
Removing intermediate container 90bcecb3e4a2
Successfully built b7437c93d09a
[root@localhost ~]# docker run -d -v /dev/logs:/dev/logs -v /docker/mon-haxproxy/log:/var/log -v /docker/mon-haxproxy/lib:/var/lib/haproxy -v /docker/mon-haxproxy/run:/run  -p 80:80 --name mon-haproxy-v7 my-haproxy-v7
936562384c2f2a5d688dc3888bf9fb292b07f4966d7ee84d37315cee9861cf19
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
936562384c2f        my-haproxy-v7       "/docker-entrypoint.s"   4 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp       mon-haproxy-v7
78f6bc54152e        my-server4          "/sbin/server4"          2 hours ago         Up 2 hours          0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          2 hours ago         Up 2 hours          0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          2 hours ago         Up 2 hours          0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          2 hours ago         Up 2 hours          0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   12 hours ago        Up 12 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.
[root@localhost ~]# docker logs 936562384c2f
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
[root@localhost ~]# vi /docker/mon-haxproxy/
lib/ log/ run/  
[root@localhost ~]# ls -l /docker/mon-haxproxy/*/*
-rw-r--r-- 1 root root 2 15 avril 08:54 /docker/mon-haxproxy/run/haproxy.pid

Je commence à comprendre pourquoi je gardais HAproxy pour la fin. Un dernier test …

[root@localhost ~]# cat /proc/sys/net/unix/max_dgram_qlen
10
[root@localhost ~]# echo "1000" > /proc/sys/net/unix/max_dgram_qlen
[root@localhost ~]# cat /proc/sys/net/unix/max_dgram_qlen
1000
[root@localhost ~]# cat haproxy.cfg 
global
        debug
	log /dev/stdout local0

defaults
        log global
        mode    tcp
        timeout connect 5000
        timeout client 5000
        timeout server 5000

listen http :80
        mode tcp
        balance roundrobin
        server server1 127.0.0.1:8080 check
        server server2 127.0.0.1:8081 check
        server server3 127.0.0.1:8082 check
        server server4 127.0.0.1:8083 check
...
[root@localhost ~]# docker logs e0c59b830250
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
[ALERT] 105/081317 (6) : sendto logger #1 failed: Connection refused (errno=111)

Pas si facile d’avoir les logs et de comprendre le problème. Je pense que je vais voir si Nginx est aussi simple 😉 .

Oups, je viens de réaliser que j’avais fait la même erreur que hier ! Je n’ai pas raisonné en terme de container.

 

[root@localhost ~]# cat haproxy.cfg 
global
        debug
	log 127.0.0.1 local0
	log 127.0.0.1 local2 notice

defaults
        log global
        mode    tcp
        timeout connect 5000
        timeout client 5000
        timeout server 5000

listen http :80
        mode tcp
        balance roundrobin
        server server1 server1:8080 check
        server server2 server2:8081 check
        server server3 server3:8082 check
        server server4 server3:8083 check

[root@localhost ~]# docker build -t my-haproxy-v10 .
Sending build context to Docker daemon 129.5 kB
Step 1 : FROM haproxy:1.5
 ---> 011e001101c0
Step 2 : COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> 846ccc0764d9
Removing intermediate container 92573d92d290
Step 3 : EXPOSE 80
 ---> Running in 1dd245964801
 ---> 3405838fec48
Removing intermediate container 1dd245964801
Successfully built 3405838fec48
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e0c59b830250        my-haproxy-v8       "/docker-entrypoint.s"   28 minutes ago      Up 28 minutes       0.0.0.0:80->80/tcp       mon-haproxy-v8.b
78f6bc54152e        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   13 hours ago        Up 13 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# docker stop e0c59b830250
e0c59b830250
[root@localhost ~]# docker run -d --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 -p 80:80 --name mon-haproxy-v10 my-haproxy-v10
6f6208ac6a76e77de937eac6085c1d715b9775852dcf1e7a0ae43d5293f80e7d
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
78f6bc54152e        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   13 hours ago        Up 13 hours         0.0.0.0:5432->5432/tcp   postgres2

Il ne se lance pas …

[root@localhost ~]# docker logs 6f6208ac6a76e77de937eac6085c1d715b9775852dcf1e7a0ae43d5293f80e7d
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
[ALERT] 105/084348 (6) : parsing [/usr/local/etc/haproxy/haproxy.cfg:16] : 'server server1' : invalid address: 'server1' in 'server1:8080'

[ALERT] 105/084348 (6) : parsing [/usr/local/etc/haproxy/haproxy.cfg:17] : 'server server2' : invalid address: 'server2' in 'server2:8081'

[ALERT] 105/084348 (6) : parsing [/usr/local/etc/haproxy/haproxy.cfg:18] : 'server server3' : invalid address: 'server3' in 'server3:8082'

[ALERT] 105/084348 (6) : parsing [/usr/local/etc/haproxy/haproxy.cfg:19] : 'server server4' : invalid address: 'server3' in 'server3:8083'

[ALERT] 105/084348 (6) : Error(s) found in configuration file : /usr/local/etc/haproxy/haproxy.cfg
[ALERT] 105/084348 (6) : Fatal errors found in configuration.
haproxy-systemd-wrapper: exit, haproxy RC=256

Voici la commande inspect qui va nous permettre de savoir ce qu’il y a dans /etc/hosts :

[root@localhost ~]# docker inspect 6f6208ac6a76e77de937eac6085c1d715b9775852dcf1e7a0ae43d5293f80e7d
[
    {
        "Id": "6f6208ac6a76e77de937eac6085c1d715b9775852dcf1e7a0ae43d5293f80e7d",
        "Created": "2016-04-15T08:43:48.407165954Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "haproxy",
            "-f",
            "/usr/local/etc/haproxy/haproxy.cfg"
        ],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2016-04-15T08:43:48.569704841Z",
            "FinishedAt": "2016-04-15T08:43:48.747782328Z"
        },
        "Image": "sha256:3405838fec481ca60b848eb230c4b1af27e74eb729494329bad6209c1cc79371",
        "ResolvConfPath": "/docker/containers/6f6208ac6a76e77de937eac6085c1d715b9775852dcf1e7a0ae43d5293f80e7d/resolv.conf",
        "HostnamePath": "/docker/containers/6f6208ac6a76e77de937eac6085c1d715b9775852dcf1e7a0ae43d5293f80e7d/hostname",
        "HostsPath": "/docker/containers/6f6208ac6a76e77de937eac6085c1d715b9775852dcf1e7a0ae43d5293f80e7d/hosts",
        "LogPath": "/docker/containers/6f6208ac6a76e77de937eac6085c1d715b9775852dcf1e7a0ae43d5293f80e7d/6f6208ac6a76e77de937eac6085c1d715b9775852dcf1e7a0ae43d5293f80e7d-json.log",
        "Name": "/mon-haproxy-v10",
        "RestartCount": 0,
        "Driver": "btrfs",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "80/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "80"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "",
            "Cgroup": "",
            "Links": [
                "/my-server4-2:/mon-haproxy-v10/my-server4-2",
                "/my-server4-3:/mon-haproxy-v10/my-server4-3",
                "/my-server4-4:/mon-haproxy-v10/my-server4-4",
                "/my-server4-1:/mon-haproxy-v10/my-server4-1"
            ],
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "StorageOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": -1,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "BlkioIOps": 0,
            "BlkioBps": 0,
            "SandboxSize": 0
        },
        "GraphDriver": {
            "Name": "btrfs",
            "Data": null
        },
        "Mounts": [],
        "Config": {
            "Hostname": "6f6208ac6a76",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "HAPROXY_MAJOR=1.5",
                "HAPROXY_VERSION=1.5.17",
                "HAPROXY_MD5=98340e8ba4eeb376d301adc8f235b043"
            ],
            "Cmd": [
                "haproxy",
                "-f",
                "/usr/local/etc/haproxy/haproxy.cfg"
            ],
            "Image": "my-haproxy-v10",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "eccd857f9928a21e6823e3865eb63e573f759f391492a9619ac8acde9e65e475",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": null,
            "SandboxKey": "/var/run/docker/netns/eccd857f9928",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "55fda48e57b67e66f6c0a55a123956056b9eb2c9dec518dbab92f946bc52a4c6",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": ""
                }
            }
        }
    }
]
[root@localhost ~]# cat /docker/containers/6f6208ac6a76e77de937eac6085c1d715b9775852dcf1e7a0ae43d5293f80e7d/hosts 
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.3	my-server4-1 eacf3e4bc897
172.17.0.4	my-server4-2 a75937eb980d
172.17.0.5	my-server4-3 fce6865343f1
172.17.0.6	my-server4-4 78f6bc54152e
172.17.0.7	6f6208ac6a76

Effectivement j’ai mis n’importe quoi, mais je voulais tester la commande inspect.

[root@localhost ~]# cat haproxy.cfg 
global
        debug
	log 127.0.0.1 local0
	log 127.0.0.1 local2 notice

defaults
        log global
        mode    tcp
        timeout connect 5000
        timeout client 5000
        timeout server 5000

listen http :80
        mode tcp
        balance roundrobin
        server server1 my-server4-1:8080 check
        server server2 my-server4-2:8081 check
        server server3 my-server4-3:8082 check
        server server4 my-server4-4:8083 check

[root@localhost ~]# docker build -t my-haproxy-v11 .
Sending build context to Docker daemon 129.5 kB
Step 1 : FROM haproxy:1.5
 ---> 011e001101c0
Step 2 : COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
 ---> 04fbe6ce4329
Removing intermediate container 6b45d6c95aa7
Step 3 : EXPOSE 80
 ---> Running in a4b36ea1b4cc
 ---> d7608471e969
Removing intermediate container a4b36ea1b4cc
Successfully built d7608471e969
[root@localhost ~]# docker run -d --link my-server4-1 --link my-server4-2 --link my-server4-3 --link my-server4-4 -p 80:80 --name mon-haproxy-v11 my-haproxy-v11
818819b23e72b2672b55dba19d22e36dd830ce05c1b1f43acce50bc4122ef10b
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
818819b23e72        my-haproxy-v11      "/docker-entrypoint.s"   3 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp       mon-haproxy-v11
78f6bc54152e        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8083->80/tcp     my-server4-4
fce6865343f1        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8082->80/tcp     my-server4-3
a75937eb980d        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8081->80/tcp     my-server4-2
eacf3e4bc897        my-server4          "/sbin/server4"          3 hours ago         Up 3 hours          0.0.0.0:8080->80/tcp     my-server4-1
2fc533c55725        postgres            "/docker-entrypoint.s"   13 hours ago        Up 13 hours         0.0.0.0:5432->5432/tcp   postgres2
[root@localhost ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Connection closed by foreign host.
[root@localhost ~]# docker logs 818819b23e72
haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 

Cette fois je pense que j’attaque les bons containers par contre cela ne marche pas et j’ai toujours aucun logs

Misère.

J’ai essayé de supprimer le check mais cela ne fonctionne toujours pas.

[root@localhost ~]# cat haproxy.cfg 
global
        debug
	log 127.0.0.1 local0
	log 127.0.0.1 local2 notice

defaults
        log global
        mode    tcp
        timeout connect 5000
        timeout client 5000
        timeout server 5000

listen http :80
        mode tcp
        balance roundrobin
        server server1 my-server4-1:8080 
        server server2 my-server4-2:8081 
        server server3 my-server4-3:8082 
        server server4 my-server4-4:8083 

En suite j’ai changé le format de fichier haproxy.cfg, mais sans succès.

[root@localhost ~]# cat haproxy.cfg 
global
    maxconn 400

defaults
    log global
    mode    tcp
    option  tcplog
    option  dontlognull
    retries 4
    maxconn 200
    timeout connect  5000
    timeout client  50000
    timeout server  50000

frontend http-in
    bind *:80
    log 127.0.0.1 local0	
    default_backend serveur

backend serveur
        mode tcp
        balance roundrobin
        server server1 my-server4-1:8080
        server server2 my-server4-2:8081
        server server3 my-server4-3:8082
        server server4 my-server4-4:8083

Le problème se sont les logs, débugger sans logs c’est pas possible.