Aller au contenu

Docker / Conteneurisation


Sheepux

Messages recommandés

Sujet de partage de vos trucs et astuce autour de la conteneurisation.

L'objectif de ce sujet n'est pas de faire un tutoriel mais de recenser nos travaux communs autour de nos approches de conteneurisation.

N'hésitez pas à partager dans sujet et je gérerai un sommaire sur ce premier post

Sommaire:

Installer https://forum.nextinpact.com/topic/174848-docker-conteneurisation/?do=findComment&comment=2911190
Exposer avec Traefik : https://forum.nextinpact.com/topic/174848-docker-conteneurisation/?do=findComment&comment=2911191
Outils pratiques: https://forum.nextinpact.com/topic/174848-docker-conteneurisation/?do=findComment&comment=2911192

 

Modifié par Sheepux
  • Haha 2
Lien vers le commentaire
Partager sur d’autres sites

Etape 1: installer docker

1.1 Coté client (poste)

Principalement vous allez travailler sur dockerpour linux.

Coté client; si vous êtes sous windows, il vous faudra installer docker. Pour cela une version packagée est gérée par docker:
https://docs.docker.com/docker-for-windows/install/ (ce dernier créé une VM via hyperv pour créer un hote local).
Cependant avec WSL2 docker a introduit une nouvelle version en cours de construction
https://www.docker.com/blog/new-docker-desktop-wsl2-backend/
https://docs.docker.com/docker-for-windows/wsl-tech-preview/

1.2 Coté serveur (Linux)

Il suffit de suivre le guide avec la remarque pertinente de supprimer les anciens package (pas mal de changements de nom toutes ces années)
https://docs.docker.com/install/linux/docker-ce/debian/

Pour Ubuntu/Debian un point particulier: le package docker.io était à l'abandon mais est de retour depuis 2018
https://www.collabora.com/news-and-blog/blog/2018/07/04/docker-io-debian-package-back-to-life/
Ce package est fait selon les regles debian: les dépendances sont installées indépendamment (par dépendance) plutôt que packager en dur dans le package.

1.3 Outils

L'indispensable docker-compose
https://docs.docker.com/compose/install/

 

  • Merci 1
Lien vers le commentaire
Partager sur d’autres sites

Traefik, le load balancer.

Pour exposer votre serveur sur internet, je recommande l'utilisation de Traefik https://containo.us/traefik/ et notemment la v2

Il s'agit d'un  reverse proxy/load balancer assez magique car s’intègre bien avec docker notamment avec les mécanismes d'auto-découverte (autodiscovery).

Un petit docker-compose d'exemple que nous utilisons (penser à changer les valeurs)

version: '3'

services:
  reverse-proxy:
    # The official v2.1 Traefik docker image
    image: traefik:v2.1
    container_name: "traefik"
    # Enables the web UI and tells Traefik to listen to docker
    command: 
      - --api.dashboard=true
      - --providers.docker
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.myhttpchallenge.acme.httpchallenge=true
      - --certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web
      - --certificatesresolvers.myhttpchallenge.acme.email=mail@example.fr
      - --certificatesresolvers.myhttpchallenge.acme.storage=/letsencrypt/acme.json
    ports:
      # The HTTP port
      - "80:80"
      - "443:443"
      # The Web UI (enabled by --api)
      # - "8080:8080"
    labels:
      - traefik.enable=true
      - traefik.http.routers.api.rule=Host(`traefik.example.fr`)
      - traefik.http.routers.api.entrypoints=websecure
      - traefik.http.routers.api.tls.certresolver=myhttpchallenge
      - traefik.http.routers.api.tls
      - traefik.http.routers.api.service=api@internal
      - traefik.http.routers.api.middlewares=auth
      - traefik.http.middlewares.auth.basicauth.users=LoginAdmin:PasswordEncodéEnBasicAuth
      - traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)
      - traefik.http.routers.http-catchall.entrypoints=web
      - traefik.http.routers.http-catchall.middlewares=redirect-to-https@docker
      - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
    volumes:
      # So that Traefik can listen to the Docker events
      - ./letsencrypt:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock:ro

Ce déploiement utiliser le challenge http pour générer les certificats letsencrypt. Pour faire du challenge DNS regardez le guide suivant <demander à Minikea>

L'UI de tableau de bord de traefik est également disponible et sécurisée par HTTP Auth

 

Ensuite lorsque vous créez un conteneur ajoutez les labels suivant dans votre docker-compose pour que traefik comprenne

    networks:
        - frontend
    labels:
      - traefik.enable=true
      - traefik.docker.network=traefik_default
      - traefik.http.routers.nomduservice.rule=Host(`url.example.fr`)
      - traefik.http.routers.nomduservice.entrypoints=websecure
      - traefik.http.routers.nomduservice.tls.certresolver=myhttpchallenge
networks:
  frontend:
    external:
      name: traefik_default

D'abord les labels pour traefik (penser à changer le nomduservice) mais aussi l'association au network de traefik (changer le nom si vous l'avez créé avec un autre nom)

Modifié par Sheepux
  • Merci 1
Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bonjour,

Voici un Dockerfile pour une image PHP (php7-fpm), avec support PDO + Microsoft ODBC + Gettext (externationalisation) et envoi d'emails via relais externe (msmtp):

Image de base : php:7.4.1-fpm

Ports exposé: 9000 (pour écouter les requêtes apache/nginx)

Fichier:
 

FROM php:7.4.1-fpm

LABEL version="0.1"
LABEL description="PHP7 base image with MS-SQL ODBC - WARNING: TLSV1 for outdated sqlserver"
LABEL maintainer="ayak973@ayak973.io"

EXPOSE 9000

# for php PDO extensions
RUN set -x && DEBIAN_FRONTEND=noninteractive \
    && apt update && apt install gnupg unixodbc unixodbc-dev -y \
    && docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr \
    && docker-php-ext-install pdo_odbc \
    && docker-php-ext-configure gettext \
    && docker-php-ext-install gettext

# for emails:
RUN set -x && DEBIAN_FRONTEND=noninteractive \
    && apt install -y --no-install-recommends msmtp mailutils
RUN echo "sendmail_path = /usr/bin/msmtp -t -i" >> /usr/local/etc/php/conf.d/php-msmtp.ini
# test email from container: echo -e "Subject: Test Mail\r\n\r\nThis is a test mail" |msmtp --debug --from=php@****.com -t nicolas.***@***.com

# for msodbc, to connect to old MSSQL Server, disable modern TLS (BWAAAAAAAAAAAAAAAAAAAAAH !!)
RUN set -x && DEBIAN_FRONTEND=noninteractive \
    && apt install -y --no-install-recommends openssl \
    && sed -i 's,^\(MinProtocol[ ]*=\).*,\1'TLSv1.0',g' /etc/ssl/openssl.cnf \
    && sed -i 's,^\(CipherString[ ]*=\).*,\1'DEFAULT@SECLEVEL=1',g' /etc/ssl/openssl.cnf

# for MS ODBC
RUN set -x && DEBIAN_FRONTEND=noninteractive \
    && curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
    && curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt update \
    && ACCEPT_EULA=Y apt-get install -y msodbcsql17 \
    && rm /etc/apt/sources.list.d/mssql-release.list \
    && apt autoremove -y \
    && rm -rf /var/lib/apt/lists/*

 

Dans le docker-compose php, ajouter le fichier de conf msmtp via un volume (afin de pouvoir utiliser un relais mail par conteneur, mais il existe peut-etre un meilleur moyen, ici dans le répertoire ./php7/conf/msmtp.conf)

volumes:
- "./php7/conf/msmtp.conf:/etc/msmtprc"

Avec le fichier de conf MSMTP:

defaults
#tls on
tls_certcheck off
tls_starttls on
#tls_trust_file /etc/ssl/certs/ca-certificates.crt

account current_account
host 192.168.xx.xxx
port 587
timeout 10
from php@***.com

account default : current_account

 

Ce qui a été le plus galère, c'est de comprendre pourquoi php_PDO ne se connectait pas au serveur MSSQL2008: ce dernier est trop vieux, et ne gère pas de protocole TLS assez récent, et PHP, dans la version 7 il me semble, bloque les anciennes versions de TLS. Voila pourquoi il a fallu recourir a une image custom, sachant que la MAJ du serveur SQL n'est pas d'actualité (snif)

 

Au passage, si ca correpond pas au sujet ou ressemble trop a un tuto, n'hésitez pas à delete sans mon accord !

 

Bonne fin de journée à vous !

 

Modifié par Ayak973
Ca ressemble pas du tout à ce que j'ai écris... Volume 2
  • Aime 1
Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

TL;DR : https://github.com/dolanor/dsuite

J’avais YunoHost pendant un moment sur mon serveur, dans un conteneur LXC. La mise à jour était difficile, elle ne fonctionnait pas.

J’ai découvert Docker à cette période également, et après quelques années j’ai remplacé des services de YunoHost par plusieurs containers.

J’en ai fait un docker-compose et ça permet d’avoir:

- LDAP pour centraliser les comptes, mot de passe : un compte + un mot de passe peux te donner accès à plusieurs services

- serveur email : pour ne plus avoir tout sur gmail

- calendrier synchronisable sur mobile, liste de contact, fichiers synchro à la dropbox/google drive (nextcloud)

- un registre privé docker pour publier ses propres images

- un système d’intégration continue

- un système d’hébergement de source à la github

Lien vers le commentaire
Partager sur d’autres sites

Pour l'identité je suis en train de travailler à me créer un keycloack comme fournisseur d'identité je partagerai mon travail quand j'aurai eu le temps de finir.

Mon but est d'avoir un NextCloud et que l'identité soit gérée via keycloack (qui me permetra de rebondir sur d'autres service avec la même identitié).

Coté déploiement je regarde pour une approche gitops

Par contre j'ai quitté le socle docker et je fais plus mumuse sur kubernetes.

Lien vers le commentaire
Partager sur d’autres sites

  • 4 mois après...

pour traefik, j'ajoute quelques lignes pour un middleware universel (multi-services) pour passer correctement les headers de sécurité:

en TOML:

        [http.middlewares.secure_https]
            [http.middlewares.secure_https.headers]
                frameDeny = true
                sslRedirect = true
                ContentTypeNosniff = true
                STSSeconds = 31536000
                STSIncludeSubdomains = true
                BrowserXssFilter = true                
                ContentSecurityPolicy = "default-src 'self';frame-ancestors 'self';require-trusted-types-for 'script';"
                ReferrerPolicy = "no-referrer-when-downgrade"
                FeaturePolicy = "vibrate 'none';"
                [http.middlewares.secure_https.headers.customResponseHeaders]
                    X-Powered-By = ""
                    Server = ""
                    X-custom = ""
                    Permissions-Policy = "geolocation=(self), microphone=(), vibrate=()"

 

ancienne version : dans le docker-compose.yml:

labels:
  - "traefik.http.middlewares.secure_https.headers.framedeny=true"
  - "traefik.http.middlewares.secure_https.headers.sslredirect=true"
  - "traefik.http.middlewares.secure_https.headers.ContentTypeNosniff=true"
  - "traefik.http.middlewares.secure_https.headers.STSSeconds=31536000"
  - "traefik.http.middlewares.secure_https.headers.STSIncludeSubdomains=true"
  - "traefik.http.middlewares.secure_https.headers.BrowserXssFilter=true"
  - traefik.http.middlewares.secure_https.headers.ContentSecurityPolicy="default-src 'self'"

 

vérifiable sur https://observatory.mozilla.org/

 

Modifié par Minikea
nouvelle version
  • Merci 1
Lien vers le commentaire
Partager sur d’autres sites

Mes containers Debian n'étant jamais à l'heure (mauvais fuseau horaire), il a suffit d'ajouter ceci dans le Dockerfile :

# stage: mise à l'heure du container sur Europe/Paris
ENV TZ=Europe/Paris
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

 

Modifié par Ayak973
Correction
Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...
  • 3 mois après...
  • 1 an après...

Plop,
Je commence sérieusement à travailler une migration de mes services vers docker.
J'ai retenu Docker Swarm, je commence à comprendre le principe de l'orchestrateur qui seul ne suffit pas à assurer une redondance mais qui facilite grandement la gestion et déploiement des services.

J'aimerais tester un peu de haute disponibilité, chose qui concerne qu'à moitié docker en fait. Je me penche sur la cas des bases de données qui ont ces fonctions, mais sur le principe master (modifications) et slave (lectures).
Ca permet de garder les données répliquées mais je me demande comment on fait la bascule en cas de perte du master ? c'est peut être là que swarm doit agir pour changer le rôle du service sur le noeud/manager secondaire ?

Lien vers le commentaire
Partager sur d’autres sites

Bon je progresse tout seul ce weekend. Je laisse tomber le load balancing et la HA avec les fichiers, trop complexe.

Je prépare à la place un PRA rapide avec tout ce que j'ai compris :

Un seul manager placé sur une machine n'exposant aucun service à internet.
Un worker sur le NAS service serveur rsync et borg backup
Le NAS gère la sauvegarde incrémentielle des workers
Les VPS sont des workers
Les workers synchronisent leurs volumes de données vers le NAS avec rsync pour backup et redéploiement
Si le manager est down les workers restent up
Si un worker tombe on peux le supprimer et en recréer un dans l'heure avec la copie rsync
Si un worker est compromis on peut restaurer à une date antérieure avec borg backup
Si on perds les données du manager les workers ne seront plus gérables (le maillon faible)

Contraintes de placement des services avec les labels pour forcer l’exécution là où sont les données
Label Public_Web : site web, eshop, serveur mail
Label Private_Web : ERP, partage de fichiers

Exposition des services à définir :
    - Publication du port mode=host
    - Mode ingress mais filtrage avec traefik BasicAuth

Si quelqu'un passe par là qu'il me corrige si je me trompe

Lien vers le commentaire
Partager sur d’autres sites

Il y a 5 heures, L33thium a dit :

Les workers synchronisent leurs volumes de données vers le NAS avec rsync pour backup et redéploiement
...
Si un worker tombe on peux le supprimer et en recréer un dans l'heure avec la copie rsync

Je suis perplexe: quelle BDD te permet de faire un rsync disque à chaud? Ca m'étonne mais si ça marche, ça m'intéresse.

J'avais l'habitude de faire des dump logiques de MySQL (pas génial, très lourd). Sous SQL Server (pas ta tasse de thé, je sais) le mieux était de monter un lecteur cassette virtuel fair ele logiciel de backup - du coup les backups étaient transparents.

 

Pour le reste, pas de remarque, ça me paraît très bien (même si je ne connais pas docker/swarm).

J'avoue que je m'interroge sur la possibilité de passer plusieurs de mes conteneurs en docker pour rendre mon serveur plus "reproductible" (j'ai pas forcément tout noté quand j'ai monté chaque conteneur...)

Modifié par brice.wernet
Lien vers le commentaire
Partager sur d’autres sites

Pour les bdd je suis pas encore sûr.

Là je cherche un moyen de migrer les données du backup vers le noeud lorsque que le stack est déployé.

J'ai vu des exemples avec "command:" dans "deploy:" mais ce n'est pas documenté donc je doute.
Ce sera très facile dans ce cas : "command: rsync -a ssh://backup@nas:/volumeX/ ." en gros

je vais devoir experimenter

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Bonjour à tous,
Je reviens à la charge avec Docker. Swarm est abandonné pour l'instant à moins que je comprenne le fonctionnement de Flocker qui me parait intéressant mais trop obscur pour le moment.
J'aimerais bien étudier les plans de secours en cas de perte du quorum aussi
je dois mener des expériences à savoir si un worker peut quitter le swarm lorsqu'il n'y a plus de manager.

Sinon je partirais plutôt sur une config avec des docker standalone géré avec portainer et son agent.

Le truc qui m’embête le plus (et flocker pourrait être une solution) est de pouvoir migrer facilement et rapidement les services d'un hôte à un autre avec les volumes de données

Il y a la méthode décrite dans la doc pour sauvegarder/restaurer les volumes que je trouve trop laborieuse pour une migration d'hôtes.
Il y a le dockerfile qui permet de prendre une image d'un volume, dans ce cas je peux l'envoyer sur un registre privée pour le redéployer où je veux, c'est très intéressant mais visiblement pas une bonne pratique ?

Et dans tous les cas j'aimerais avoir un "stack", un compose qui va créer la copie des volumes et les rendre disponible par un moyen ou un autre
pour qu'un autre compose aille les chercher et les installer si disponible avec le container sur l'hôte de destination.

Je suis sûr que c'est possible mais je ne trouve pas de bonnes information à ce sujet

Lien vers le commentaire
Partager sur d’autres sites

il y a 10 minutes, Minikea a dit :

je vais me faire l'avocat de @Sheepux mais Kubernetes serait peut-être ta solution...

Je ne veux pas de HA/load balncing mais un moyen simple de gérer les services de plusieurs machines (pas assez pour faire un cluster), que l'admin de l'ensemble de mes services soit centralisée, simple et rapide avec un PRA mais pas de HA

Donc si Docker Swarm est déjà presque overkill, kubernetes l'est totalement

 

C'est un peu ce que devrait être docker pour moi mais plus je l'étudie pour le réalise qu'il est fait pour les developpeurs plus que pour les admins.

gérer et bouger des containers c'est très simple, mais pour les données, docker ne fournit pas vraiment de solution

Modifié par L33thium
Lien vers le commentaire
Partager sur d’autres sites

Ah j'avais raté le sujet de février

Il y a 12 heures, Minikea a dit :

je vais me faire l'avocat de @Sheepux mais Kubernetes serait peut-être ta solution...

Pas forcément bon avocat, car vu la demande c'est surtout une problématique de gestion disque/volume ce que kubernetes ne résout pas en tant que tel. C'est le point le plus compliqué en conteneurisation, le stockage.

Cependant des supers outils existent en complément pour kubernetes tel que Longhorn.

Pour le coté docker engine on as pas trop creusé mais p'tet qu'un MinIO (ne pas s'arréter au site aussi pour docker) en multinode et réplication active-active répondrai au besoin mais c'est du bloc storage et pas du volume classique (ou alors regarder du coté de minfs mais qui n'est plus maintenu. Le stockage par bloc est devenu la norme).

Néanmoins pour en revenir sur une vision kubernetes (ma spécialité) tu peux aussi voir le système comme un auto-pra sans vouloir forcément travailler le HA. Un mono conteneur (donc non redondé pour le HA) serait redémarré automatiquement sur un autre noeud en cas de crash entrainant le rebind de volume sur le nouveau noeud. 
Packager un k3s (kubernetes léger)  à 2 node avec longhorn ET minio c'est pas déconant. Un cluster n'est pas forcément gros. Kubernetes sert à des thématiques Edge/iot 🙂

Cependant la marche kubernetes étant grande, ce n'est pas forcément une préconisation que je ferai à moins d'avoir du temps et de l'envie à consacrer. (Mais tu as bien 2 sujets, kube/orchestrateur ET stockage distribué).

Pour t'illustrer je faisais tourner notre serveur de jeu Conan dans un conteneur dans mon cluster kubernetes sur scaleway mais le storage était une fonction scaleway managée  (driver CSI storage pour les volumes) 😛

Modifié par Sheepux
Lien vers le commentaire
Partager sur d’autres sites

J'ai pensé à une option toute bête en fait, faire une stack de chacun de mes services dans laquelle je vais mettre un container alpine avec une tache cron pour rsync les volumes et dumper les bdd à intervalle définit vers un serveur ssh(fs) (avec un borg coté serveur pour incrémenter).
Voilà pour un backup facile et automatique.

Ensuite pour redéployer en cas de catastrophe ou migration il faudrait, idéalement pouvoir instaurer des tests et conditions dans le stack (compose) à savoir tester si une copie de backup existe à l'adresse indiquée auquel cas copier puis déployer, sinon partir sur des volumes vierges.

Modifié par L33thium
Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Bon, après moult cheveux perdus je vais laisser tomber docker qui après toute cette lecture semble très instable (en terme de fonctionnalités), vraiment orienté développeurs et pas admin, ne faisant aucun cas des données.

Je viens de trouver en 10mn de lecture beaucoup plus d'informations pertinentes pour mes besoins avec proxmox où un tuto vieux de 5 ans est toujours applicable de nos jours. 🙂

J'en veucxui a sa cible (manque peut être de clarté) mais à moi qui n'ai pas su trouver plus vite une meilleure solution 🙂

Modifié par L33thium
Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...