Bonsoir,

Je viens d'acquérir un VPS et un domaine où je compte faire tourner au moins quatre applis situés chacune dans un container docker. Je compte associer un sous domaine pour chaque appli. J'ai lu plusieurs tutos (http://blog.zol.fr/2015/06/08/proxifier-vagrant-docker-sur-une-meme-machine/) et il semble qu'il faut utiliser un reverse proxy Nginx sur le VPS pour cela. Est-ce bien le cas ? Si oui, auriez-vous un tuto qui rejoindrait ma config ? Tous ceux que j'ai vu était destiné pour une appli seulement.

Il y a toutefois une subtilité (sinon ce ne serait pas drôle...). Un site web doit tourner sur le domaine principal. Il faut installer un deuxième nginx dans un docker ?

Merci de vos précieux conseils 🙂

Bonjour,

Regarde ce post, plus précisément dans les quatre derniers messages
https://mondedie.fr/d/8307-Discussion-Nextcloud-version-docker

Tu trouveras un docker-compose exemple qui te permet de créer ton application (owncloud dans l'exemple) avec les certificats let'encrypt, ainsi qu'un reverse nginx qui te configure automatiquement tes vhosts avec tes noms de domaine. Nul besoin de créer plusieurs nginx, avec ca tu peux rajouter WordPress, Joomla ou autre le tout dans le meme docker-compose.

Je viens d'essayer d'adapter le docker-compose de l'exemple.

version: '2'

volumes:
nextcloud-db-data:
nextcloud-data:
nextcloud-config:
nextcloud-apps:


services:


nginx-proxy:
restart: always
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /srv/docker/nginx/certs:/etc/nginx/certs:ro
- /etc/nginx/vhost.d
- /usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro


nginx-proxy-companion:
  image: jrcs/letsencrypt-nginx-proxy-companion
  volumes:
     - /srv/docker/nginx/certs:/etc/nginx/certs:rw
     - /var/run/docker.sock:/var/run/docker.sock
  volumes_from:
     - nginx-proxy
  
database:
  image: mariadb
  volumes:
     - nextcloud-db-data:/var/lib/mysql
  environment:
     - MYSQL_ROOT_PASSWORD=motdepasse
     - MYSQL_DATABASE=nextcloud
     - MYSQL_USER=nextcloud
     - MYSQL_PASSWORD=motdepasse
  
cozy:
 image: cozy/full
 container_name: cozy
 restart: always
 links:
	- nginx-gen
 environment:
	- VIRTUAL_NETWORK=1
	- VIRTUAL_HOST=cloud.x.y
	- VIRTUAL_NETWORK=nginx-proxy
	- VIRTUAL_PORT=80
	- LETSENCRYPT_HOST=cloud.x.y
	- LETSENCRYPT_EMAIL=postmaster@x.y
	- DISABLE_SSL=true
 volumes:
  - "cozy-etc:/etc/cozy"
  - "cozy-local:/usr/local/cozy"
  - "cozy-var:/usr/local/var/cozy/"
  - "cozy-couchdb:/var/lib/couchdb"
  
site:
 image: linode/lamp
 build: site
 ports:
  - "80:80"
 volumes:
  - .:/var/www/public_html/
 links:
  - database

koel:
 label:   
  - devoply.type="site" \
  - devoply.cms="koel" \
  - devoply.framework="laravel" \
  - devoply.language="php" \
  - devoply.require="mariadb etopian/nginx-proxy" \
  - devoply.description="Koel music player." \
  - devoply.name="Koel" \
  - devoply.params="docker run -d --name {container_name} -e VIRTUAL_HOST={virtual_hosts} -v /data/sites/{domain_name}:/DATA etopian/docker-koel"


 RUN apk update \
	&& apk add bash less vim nginx ca-certificates nodejs \
	php-fpm php-json php-zlib php-xml php-pdo php-phar php-openssl \
	php-pdo_mysql php-mysqli \
	php-gd php-iconv php-mcrypt \
	php-mysql php-curl php-opcache php-ctype php-apcu \
	php-intl php-bcmath php-dom php-xmlreader php-xsl mysql-client \
	git build-base python \
	&& apk add -u musl

 RUN rm -rf /var/cache/apk/*

 ENV TERM="xterm" \
	DB_HOST="172.17.0.1" \
	DB_DATABASE="" \
	DB_USERNAME=""\
	DB_PASSWORD=""\
	ADMIN_EMAIL=""\
	ADMIN_NAME=""\
	ADMIN_PASSWORD=""\
	APP_DEBUG=false\
	AP_ENV=production


 VOLUME ["/DATA/music"]

 RUN sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/php.ini && \
	sed -i 's/nginx:x:100:101:Linux User,,,:\/var\/www\/localhost\/htdocs:\/sbin\/nologin/nginx:x:100:101:Linux User,,,:\/DATA:\/bin\/bash/g' /etc/passwd && \
	sed -i 's/nginx:x:100:101:Linux User,,,:\/var\/www\/localhost\/htdocs:\/sbin\/nologin/nginx:x:100:101:Linux User,,,:\/DATA:\/bin\/bash/g' /etc/passwd-

 ADD files/nginx.conf /etc/nginx/
 ADD files/php-fpm.conf /etc/php/
 ADD files/run.sh /
 RUN chmod +x /run.sh && chown -R nginx:nginx /DATA

 RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer 

 RUN su nginx -c "git clone https://github.com/phanan/koel /DATA/htdocs &&\
	cd /DATA/htdocs &&\
	npm install &&\
	composer config github-oauth.github.com  2084a22e9bdb38f94d081ab6f2d5fd339b5292e8 &&\
	composer install"

 #clean up
 RUN apk del --purge git build-base python nodejs

 COPY files/.env /DATA/htdocs/.env

 RUN chown nginx:nginx /DATA/htdocs/.env

 #RUN su nginx -c "cd /DATA/htdocs && php artisan init"

 EXPOSE 80
 CMD ["/run.sh"]













Mon adaptation étant plus que partielle, j'ai d'abord essayé de faire un premier docker-compose sans koel. Voilà le résultat :

version: '2'

services:

nginx-proxy:
  restart: always
  image: jwilder/nginx-proxy
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - /srv/docker/nginx/certs:/etc/nginx/certs:ro
    - /etc/nginx/vhost.d
    - /usr/share/nginx/html
    - /var/run/docker.sock:/tmp/docker.sock:ro
  
nginx-proxy-companion:
  image: jrcs/letsencrypt-nginx-proxy-companion
  volumes:
    - /srv/docker/nginx/certs:/etc/nginx/certs:rw
    - /var/run/docker.sock:/var/run/docker.sock
  volumes_from:
    - nginx-proxy

database:
  image: mariadb
  container_name: database
  volumes:
	- ./database:/var/lib/mysql
  environment:
	- MYSQL_ROOT_PASSWORD=motdepasse
	- MYSQL_DATABASE=mariadb
	- MYSQL_USER=mariadb
	- MYSQL_PASSWORD=mdp
 
cozy:
  image: cozy/full
  container_name: cozy
  restart: always
  links:
    - database
  environment:
	- VIRTUAL_NETWORK=1
	- VIRTUAL_HOST=cozy.cloud.fr
	- VIRTUAL_NETWORK=nginx-proxy
	- VIRTUAL_PORT=80
	- LETSENCRYPT_HOST=cozy.cloud.fr
	- LETSENCRYPT_EMAIL=admin@cozy.cloud.fr
	- DISABLE_SSL=true		  
  volumes:
	- "cozy-etc:/etc/cozy"
	- "cozy-local:/usr/local/cozy"
	- "cozy-var:/usr/local/var/cozy/"
	- "cozy-couchdb:/var/lib/couchdb"	
site:
  image: linode/lamp
  container_name: site
  build: site
  ports:
	- "80:80"
  volumes:
	- .:/var/www/public_html/
  links:
	- database

Avec Koel :

version: '2'

services:

nginx-proxy:
  restart: always
  image: jwilder/nginx-proxy
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - /srv/docker/nginx/certs:/etc/nginx/certs:ro
    - /etc/nginx/vhost.d
    - /usr/share/nginx/html
    - /var/run/docker.sock:/tmp/docker.sock:ro
  
nginx-proxy-companion:
  image: jrcs/letsencrypt-nginx-proxy-companion
  volumes:
    - /srv/docker/nginx/certs:/etc/nginx/certs:rw
    - /var/run/docker.sock:/var/run/docker.sock
  volumes_from:
    - nginx-proxy

database:
  image: mariadb
  container_name: database
  volumes:
	- ./database:/var/lib/mysql
  environment:
	- MYSQL_ROOT_PASSWORD=motdepasse
	- MYSQL_DATABASE=mariadb
	- MYSQL_USER=mariadb
	- MYSQL_PASSWORD=mdp
 
cozy:
  image: cozy/full
  container_name: cozy
  restart: always
  links:
    - database
  environment:
	- VIRTUAL_NETWORK=1
	- VIRTUAL_HOST=cozy.cloud.fr
	- VIRTUAL_NETWORK=nginx-proxy
	- VIRTUAL_PORT=80
	- LETSENCRYPT_HOST=cozy.cloud.fr
	- LETSENCRYPT_EMAIL=admin@cozy.cloud.fr
	- DISABLE_SSL=true		  
  volumes:
	- "cozy-etc:/etc/cozy"
	- "cozy-local:/usr/local/cozy"
	- "cozy-var:/usr/local/var/cozy/"
	- "cozy-couchdb:/var/lib/couchdb"	
site:
  image: linode/lamp
  container_name: site
  build: site
  ports:
	- "80:80"
  volumes:
	- .:/var/www/public_html/
  links:
	- database
db:
  image: mysql:latest
  environment:
	- MYSQL_DATABASE=koel
	- MYSQL_ROOT_PASSWORD=secret
	- MYSQL_PASSWORD=db
    - MYSQL_USERNAME=db
	
koel:
  image: nampnq/koel:feature-docker
  links:
	- db:db
  ports:
	- 8000:80
  volumes:
	- ~/Music:/home/koel/media
	- .env:/var/www/html/.env

Dans ton post précédent tu as mélangé du docker-compose avec des commandes dockerfile quand au dernier post dans la partie 'site' tu n'inclues pas les variables d'environnement 'virtualhost'

Que donne ce dernier docker-compose que tu présentes ? Si u veux me donner la liste des services que tu souhaites intégrer, je peux de mon coté regarder ce que je peux faire 🙂

    Bonsoir,

    Je souhaite à terme intégrer un serveur web (LEMP ou LAMP) sur le domaine principal. Ensuite, j'ai plusieurs sous-domaines sur lesquels je voudrais installer des services indépendant avec Docker. Est-il possible d'avoir une DB commune pour tous les dockers ? laster13 ainsi, ça donnerait :

    site1.fr : LAMP ou LEMP port 80

    sub1.site1 : Codiad port 1490
    sub2.site1 : Cozy port 734
    sub3.site1 : Koel port 1816
    sub4.site1 : Jitsi port 2000

      Glodi ok je m'y colle 🙂
      Si tu réussis de ton coté dis le moi que je ne poursuive pas pour rien

        Je vais essayer de m'occuper de ça ce WE 🙂 Il faut aussi que je paramètre le reverse proxy nginx et que je fasse un script shell pour activer les services. Par défaut, seul le site est démarré, les autres services se lanceront au cas par cas avec un script.

        laster13 Je te tiens au jus de l'avancée de mes travaux. 😉

        J'ai des erreurs sur mon fichier docker-compose.yml... J'ai pourtant vérifié toutes les tabulations et l'indentation, sans succès. Je verrais ça plus en détail demain et au besoin je retaperai tout le fichier à la main au lieu de le copier directement depuis notepad++ sous windows.

        root@scw-1e49a4:~/docker-compose# docker-compose up -d
        ERROR: yaml.scanner.ScannerError: while scanning for the next token
        found character '\t' that cannot start any token
          in "./docker-compose.yml", line 48, column 31

        L'idée au final étant de ne créer qu'un seul docker-compose dans lequel on mettra tout. Je te poste un début avec koel, histoire que tu essaies, et je continue pour la suite 🙂

        version: '2'
        
        services:
        
        nginx-proxy:
        restart: always
        image: jwilder/nginx-proxy
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /srv/docker/nginx/certs:/etc/nginx/certs:ro
          - /etc/nginx/vhost.d
          - /usr/share/nginx/html
          - /var/run/docker.sock:/tmp/docker.sock:ro
        
        nginx-proxy-companion:
        image: jrcs/letsencrypt-nginx-proxy-companion
        volumes:
           - /srv/docker/nginx/certs:/etc/nginx/certs:rw
           - /var/run/docker.sock:/var/run/docker.sock
        volumes_from:
           - nginx-proxy
        
          
        koel:
        container_name: koel
        image: etopian/docker-koel
        depends_on:
            - mariadb
        ports:
            - "9876:80"
        environment:
            - VIRTUAL_HOST=koel.domain.ldt
            - LETSENCRYPT_HOST=koel.domain.ldt
            - LETSENCRYPT_EMAIL=XXXXX@gmail.com
            - DB_HOST=mariadb
            - DB_DATABASE=forge
            - DB_USERNAME=root
            - DB_PASSWORD=XXXXXX
            - ADMIN_EMAIL=koel@example.com
            - ADMIN_NAME=admin
            - ADMIN_PASSWORD=admin
            - APP_DEBUG=true
            - AP_ENV=production
        volumes:
           - /mnt/music/:/DATA/music/:ro
        
        mariadb:
         image: mariadb:10.1
         container_name: mariadb
         environment:
           - MYSQL_ROOT_PASSWORD=XXXXXX
           - MYSQL_PASSWORD=XXXXXX
           - MYSQL_DATABASE=forge
         volumes:
           - /mnt/docker/mysql/db:/var/lib/mysql

        Une fois les containers lancés tu tapes la commande suivante

        docker exec koel su nginx -c "cd /DATA/htdocs && php artisan init"

        Tu n'as plus qu'à pointer sur ton sous domaine qui en plus sera en https

        Remplace par tes mots de passe, ton sous domaine etc.. pense à recaler le docker-compose au niveau tabulation

        Ok, je teste ça ce soir. J'ai essayé d'installer tous les services individuellement, ça marche. J'ai des problèmes seulement quand je commence à utiliser deux services et qu'il y en a un sur le port 80 et l'autre sur le 443...

        Merci beaucoup, je te tiens au courant 🙂

        J'ai une erreur avec ton docker-compose.

        ERROR: client and server don't have same version (client : 1.22, server: 1.18)

        Après avoir consulté les docs de docker-compose, il faut utiliser la variable d'environnement :

        COMPOSE_API_VERSION=auto

        D'après le site (http://stackoverflow.com/questions/29377853/how-to-use-environment-variables-in-docker-compose), il faut créer un troisième fichier template.yml mais ça ne marche pas...

        J'ai résolu mon problème en désinstallant docker et en le réinstallant avec la commande :

        curl -fsSL https://get.docker.com/ | sh

        Tout marche bien désormais, si ce n'est que Koel est en http et pas en https.

        Vérifie dans ce dossier si tes clés sont bien présentes

        /srv/docker/nginx/certs

        Par ailleurs as tu un service qui exploite deja le port 443 ? Ce qui pourrait peu etre expliquer pourquoi tu n'es pas en https

        Pour cosy tu rajoutes ça dans le docker-compose

        cozy:
        container_name: cozy
        image: cozy/full
        environment:
            - VIRTUAL_HOST=site.domaine.com
            - LETSENCRYPT_HOST=site.domaine.com
            - LETSENCRYPT_EMAIL=XXXXX@gmail.com

        J'ai maintenant une erreur PHP sur le sous domaine koel avec le nouveau docker-compose .

        RuntimeException in compiled.php line 7020: No supported encrypter found. The cipher and / or key length are invalid.
        
        in compiled.php line 7020
        at EncryptionServiceProvider->Illuminate\Encryption\{closure}(object(Application), array()) in compiled.php line 1284
        at Container->build(object(Closure), array()) in compiled.php line 1237
        at Container->make('encrypter', array()) in compiled.php line 1775
        at Application->make('Illuminate\Contracts\Encryption\Encrypter') in compiled.php line 1329
        at Container->resolveClass(object(ReflectionParameter)) in compiled.php line 1313
        at Container->getDependencies(array(object(ReflectionParameter)), array()) in compiled.php line 1299
        at Container->build('App\Http\Middleware\EncryptCookies', array()) in compiled.php line 1237
        at Container->make('App\Http\Middleware\EncryptCookies', array()) in compiled.php line 1775
        at Application->make('App\Http\Middleware\EncryptCookies') in compiled.php line 9577
        at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in compiled.php line 2983
        at CheckForMaintenanceMode->handle(object(Request), object(Closure))
        at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in compiled.php line 9577
        at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
        at call_user_func(object(Closure), object(Request)) in compiled.php line 9567
        at Pipeline->then(object(Closure)) in compiled.php line 2249
        at Kernel->sendRequestThroughRouter(object(Request)) in compiled.php line 2232
        at Kernel->handle(object(Request)) in index.php line 53

        Et après avoir fait la MaJ Cozy, j'ai une page 502 :

        502 Bad Gateway nginx/1.10.1

        C'est parce que tu as oublié de taper la ligne de commande

        docker exec koel su nginx -c "cd /DATA/htdocs && php artisan init"

          laster13 Effectivement ça marche. Par contre, les maj de Cozy m'ont fait planter mon docker...

          J'ai aussi réfléchi à un détail important. N'est-il pas intéressant d'héberger mon site chez un hébergeur (hébergeur gratuit type hostinger) et de faire pointer mon nom de domaine dessus ? Cela me permet d'éviter qu'on puisse remonter sur mon VPS et surtout cela économise de la place. Le seul soucis est l'impossibilité d'avoir un site en https...

            Glodi J'ai aussi réfléchi à un détail important. N'est-il pas intéressant d'héberger mon site chez un hébergeur (hébergeur gratuit type hostinger) et de faire pointer mon nom de domaine dessus ? Cela me permet d'éviter qu'on puisse remonter sur mon VPS et surtout cela économise de la place. Le seul soucis est l'impossibilité d'avoir un site en https...

            Le miens est également sur un VPS, la bande passante est bonne et il ne prend pas de place. Pense à le sécuriser avec fail2ban, portsentry, et interdit l'acces root dans le fichier sshd_config ainsi que le port.
            https://mondedie.fr/d/5318-Tuto-Securisation-Logs-V-3-nginx

            Je complète le docker-compose en considérant que tu as un site WordPress qui sera donc sur le domaine principal.
            Du coup la base de donnée de WordPress se crée toute seule. Au final que deux bases de données, une pour koel et l'autre pour WordPress. Les autres services n'en ont pas besoin.

            codiad:
             container_name: codiad
             image: wernight/codiad
             environment:
                - VIRTUAL_HOST=codiad.domaine.com
                - LETSENCRYPT_HOST=codiad.domaine.com
                - LETSENCRYPT_EMAIL=xxxxx@gmail.com
            
            wordpress:
            image: wordpress
            depends_on:
               - mariadb
            environment:
               - VIRTUAL_HOST=domaine.com
               - LETSENCRYPT_HOST=domaine.com
               - LETSENCRYPT_EMAIL=xxxxx@gmail.com
               - WORDPRESS_DB_HOST=mariadb
               - WORDPRESS_DB_PASSWORD=xxxxx
               - WORDPRESS_DB_USER=root
               - WORDPRESS_DB_NAME=wordpress
               - MYSQL_ROOT_PASSWORD=xxxxxxx
               - MYSQL_PASSWORD=xxxxxxx

            Effectivement cosy semble planter à la mise à jour .. je vais jeter un œil, quelques soucis aussi avec jitsi mais bon on avance 🙂