Jump to content
Sheepux

Docker / Conteneurisation

Recommended Posts

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

 

Edited by Sheepux
  • Haha 2

Share this post


Link to post
Share on other 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/

 

Share this post


Link to post
Share on other 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)

Edited by Sheepux

Share this post


Link to post
Share on other sites

Outils de gestion bien pratiques :

Propose une interface graphique web pour observer vos conteneurs et mener des actions.
Gere aussi un catalogue de déploiement et propose la gestrion de docker-compose mais seulement en V2

Share this post


Link to post
Share on other sites

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 !

 

Edited by Ayak973
Ca ressemble pas du tout à ce que j'ai écris... Volume 2
  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×
×
  • Create New...