Bien comprendre et utiliser Docker

a marqué ce sujet comme résolu.

Bonjour à tous,

J'ai entendu parlé de Docker il y a déjà plusieurs années et sans savoir ce que c'était dans le détail je me suis dit que sa avait l'air sympathique et que peut-être un jour il serai intéressant que je mette mon nez dedans.
Récemment pour un besoin précis la solution idéale aurai été d'avoir deux systèmes distinct pour éviter tout conflits entre différentes applications, de base je me suis dit que je devrai avoir des machines virtuelles (évitons de payer deux machines physique si une à largement la puissance pour faire les deux ^^ ) puis je me suis rappelé l’existence de Docker.
J'ai donc parcouru la toile et ce que j'ai retenu de Docker c'était que cela permettait d'isoler totalement les applications en étant super léger par rapport à une machine virtuelle complète, bref finalement ce que je recherche. :)

Je me suis monter une machine virtuelle linux son mon poste de travail pour commencer à appréhender le monde de Docker, sauf que je suis face à un obstacle.

Lorsque je lis les tutoriaux sur le net (en tout cas ceux en français, parce-que l'anglais et moi on est pas spécialement copain) on trouve des exemples mais ils parlent tous de un et un seul site (je cherche à mettre en place un serveur nginx + php + mysql), hors dans mon cas j'ai plusieurs sites.

Au départ je me suis dit, il suffit d'installer mysql dans un container, php dans un autre, nginx dans un autre et enfin chaque site dans un container indépendant et dans nginx je fais les liens avec les container "site".

Le problème avec cette solution c'est que quand je créée ou change la configuration d'un site je dois à la fois joué avec le container du site et le container nginx, bon sa à la limite pourquoi pas.

Puis en lisant d'autre tutoriel je me suis rendu compte que le point de vue utilisé était en fait le point de vue de l'application (du site), chaque site lance son nginx, son mysql, son php, enfin bref ses dépendances et du coup si un site à des dépendances particulière, le simple fait de copier le docker-compose garanti qu'une application donnée tournera toujours dans les mêmes conditions.

Si sa à l'air très séduisant ainsi, se pose la question de la consommation des ressources d'une telle structure… si on a 10 sites qui utilise la même version de nginx et de php sa n'empêche pas qu'on à 10 container de nginx et de php qui tourne.

Par ailleurs, par de la l'aspect http, vient se greffer la gestion du ftp et des mails. Si pour le http on peu placer un container nginx qui écoute le port 80 de la machine physique et qui redirige dans le bon container, suis pas sur que c'est possible pour le ftp et les mails.

Bref… je suis perplexe sur la façon de structurer les containers docker dans l'objectif d'avoir plusieurs sites web indépendant sur le même serveur.

Quel serai la bonne méthode à adopter celons vous ?

Merci d'avance pour votre aide.
Cordialement, La source.

+0 -0

Je me suis monter une machine virtuelle linux son mon poste de travail pour commencer à appréhender le monde de Docker

Tu commences en te compliquant la vie… en effet, il existe une solution pour se passer de Linux, Docker Machine (anciennement Boot2Docker) contenu dans le pack Docker Toolbox (qui comporte aussi Docker Compose). C'est un package de logiciels officiel de Docker qui permet d'utiliser ce dernier sur Windows et MacOS. Il est disponible à l'adresse suivante : https://www.docker.com/products/docker-toolbox. En fait, il va installer une image de linux optimisée sur VirtualBox.
A noter également que Docker Machine est également disponible pour Linux : https://github.com/docker/machine/releases

+0 -0

Bonsoir,

Bon, philosophiquement je ressent mieux une application = une pile logicielle, de cette manière les configurations précise que l'on établis sur un projet sont toujours garantie et des configurations incompatible l'une avec l'autre ne peuvent pas arrivé vu que chacun des projets à la sienne.

J'essaie d'utiliser docker avec nginx et php sauf que cela ne fonctionne pas, pour tout dire j'arrive même pas à faire aller nginx tout seul, j'ai tester pas mal de combinaison glanée sur le web sans qu'aucune ne fonctionne correctement.

Je suis donc sur une machine debian 8.x (la dernière dispo sur le site de debian) sur laquelle j'ai installé docker.

Dans un dossier j'y ai établis l'architecture suivante:

  • www/
    • index.html
    • phpinfo.php
  • default
  • docker-compose.yml
  • nginx.conf

Le fichier docker-compose contient ceci: (la mise en commentaire correspond à l'utilisation de php, mais comme nginx seul ne fonctionne pas…)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
front:
  image: nginx
  ports:
    - 80:80
#  links:
#    - engine
  volumes:
    - "./www:/var/www:rw"
    - "./default:/etc/nginx/sites-enabled/default:ro"

#engine:
#  image: php:5.6-fpm

Le fichier default contient ceci:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
server {
    listen  80;

    root /var/www;

    location / {
        try_files $uri $uri/ =404;
    }

#    location ~ \.php$ {
#        fastcgi_pass engine:9000;
#        include fastcgi_params;
#        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#    }
}

Lorsque je lance docker et que je vais voir le site, j'obtiens la page par défaut de nginx, quand je regarde les logs je me rend compte qu'il ne trouve pas ma page index.html car il la cherche dans le dossier /usr/share/nginx/html/, si je modifie mon docker-compose pour que le dossier .www pointe dans le répertoire par défaut de nginx là je retrouve bien ma page.

Ma conclusion est que pour une raison qui m'est obscure mon fichier default n'est pas lu puisque c'est la dedans que je défini que le root est /var/www.

C'est pour cette raison que dans mon arborescence il y a un fichier nginx.conf, je me suis dit que celui par défaut ne devait pas allé piocher dans le dossier sites-enables, sauf que malgré l'écrasement du fichier rien n'y fait.

Que fais-je de mal ?

Merci d'avance pour votre aide.
Cordialement, La source.

+0 -0

TL;DR : Nginx ne lit pas ton fichier de conf, car il ne lit pas les fichiers dans /etc/nginx/sites-enabled/.

Hello,

J'ai réussi à faire fonctionner Nginx avec la conf suivante :

  • docker-compose.yml :
1
2
3
4
5
6
7
front:
  image: nginx
  ports:
    - 80:80
  volumes:
    - "./www:/var/www:rw"
    - "./default:/etc/nginx/nginx.conf:ro"
  • default :
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
worker_processes 4;

events { worker_connections 1024; }

http {
    server {
        listen  80;

        location / {
            root /var/www;
        }
    }
}

En fait /etc/nginx/sites-enabled/* n'est pas inclu dans la conf (tu peux lancer un docker nginx en interractif et cat les fichiers de conf de nginx pour voir).

Donc ce qui se passe avec ma conf, c'est que j'écrase la conf par défaut de nginx. L'idéal serait de mettre cette conf dans /etc/nginx/conf.d/fichier.conf, mais je n'ai pas réussi à le faire marcher.

Un tout grand merci pour ta réponse, effectivement cela à bien réglé mon problème avec nginx :)

Du coup je suis passé à l'étape suivante, l'intégration de php, et là aussi je rencontre des difficultés.

Lorsque je tente d'accéder à mon phpinfo le système me retourne une 404, mais pas formaté comme une 404 classique, du coup je me suis bêtement dit que c'était du au fait que php n'avait pas accès au fichier php à interpréter.

J'ai donc édité mon fichier docker-compose comme suit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
front:
  image: nginx
  ports:
    - 80:80
  links:
    - engine
  volumes:
    - "./www:/var/www:rw"
    - "./nginx.conf:/etc/nginx/nginx.conf:ro"

engine:
  image: php:5.6-fpm
  volumes:
    - "./www:/var/www:rw"

Le problème étant que lorsque j'écris docker-compose up il me retourne: ERROR: Container command not found or does not exist..

C'est sûr et certain c'est le paramètre volumes qu'il à du mal à avaler, sauf qu'il y a aucune raison, j'ai été voir plusieurs tutoriaux et ils utilise tous le paramètre volumes sur php.

Au cas où, voici mon fichier nginx.conf (mais je suis sur à 99.99% qu'il n'influe pas)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
worker_processes 4;

events { worker_connections 1024; }

http {
    charset UTF-8;

    server {
        listen  80;

        location / {
            root /var/www;
        }

        location ~ \.php$ {
            fastcgi_pass engine:9000;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
}
+0 -0

Hello, j'ai changé deux choses :

Pour commencer, dans docker-compose.yml, apparement docker n'aime pas le fait d'avoir deux volumes qui pointent au même endroit (oui, on a bien deux conteneur différents).

1
2
3
4
engine:
  image: php:5.6-fpm
  volumes:
    - "./www:/srv/http:rw"

Ici, /srv/http est un dossier choisi d'après les conseils d'un brave inconnu. Je pense que c'est le dossier de php par défaut.

Ensuite, j'ai modifié la conf de nginx :

1
2
3
4
5
# ...
        location ~ \.php$ {
# ...
            fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name;
         }

Un tout grand merci pour ton aide, effectivement cela fonctionne ainsi :)

J'ai pris un peu de temps pour répondre car j'ai beaucoup d'idées pour Docker…, enfin une simple idée en théorie: tout installer sur Docker.

N'étant pas habitué à Docker j'ai donc pris pas mal de temps pour me mettre dans le bain mais je commence à toucher le bon bout.

Mon premier objectif a été d'installer HyperFile (une base de données). A force d'essais je suis finalement parvenu à correctement procédé à l'installation (c'est plus dur qu'on pourrai le croire), j'ai créé une image à partir de mon container… et j'ai un problème.

Si je lance mon container basé sur debian avec le mode interactif tout va bien, sauf que pour lancer HyperFile il faut le lancer manuellement (me demandez par pourquoi mais sa veut pas démarrer avec la machine), du coup j'ai fait un script shell avec les commandes de démarrage, que je lance donc manuellement lorsque je démarre le container debian.

Lorsque j'ai créé l'image j'ai ajouté en option dans la commande commit -c "CMD start.sh". Lorsque je lance un nouveau container basé sur cette image le script est bien lancé… sauf que le container est immédiatement arrêté. :(

Voici une capture :

Arrêt immédiat

Du coup… je me rend bien compte que c'est à cause de la commande de démarrage, mais que dois-je faire pour que le container continue de fonctionner après l’exécution du script ?

+0 -0

Que dois-je faire pour que le container continue de fonctionner après l’exécution du script ?

La source

Sans aucun morceau de code ou fichier de conf ça va être difficile de répondre parfaitement (qu'y a t il exactement dans ce start.sh ?), mais en général tu met la commande qui démarre ce dont tu as besoin, service postgresql start, python manage.py runserver, …

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte