{"id":1056,"date":"2026-04-30T13:02:36","date_gmt":"2026-04-30T13:02:36","guid":{"rendered":"https:\/\/pythonia.fr\/?page_id=1056"},"modified":"2026-04-30T14:19:09","modified_gmt":"2026-04-30T14:19:09","slug":"docker","status":"publish","type":"page","link":"https:\/\/pythonia.fr\/index.php\/docker\/","title":{"rendered":"Docker"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1056\" class=\"elementor elementor-1056\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e1e4777 e-grid e-con-boxed e-con e-parent\" data-id=\"e1e4777\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2381a52 elementor-widget elementor-widget-heading\" data-id=\"2381a52\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Containeuriser une application Python avec  Docker<\/h2>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5461b06 e-flex e-con-boxed e-con e-parent\" data-id=\"5461b06\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9ed8958 elementor-widget elementor-widget-heading\" data-id=\"9ed8958\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><div style=\"display:flex;gap:40px;flex-wrap:wrap;font-family:sans-serif\">\n  <!-- Colonne gauche : Objectifs -->\n  <div style=\"flex:2;min-width:300px\">\n    <h3 style=\"color:#FFFFFF;font-weight:bold;margin-top:25px;margin-bottom:10px;font-size:16px\">\n      Objectifs :\n    <\/h3>\n    <ul style=\"font-size:14px;color:#FFFFFF;line-height:2;margin-left:20px\">\n      <li>Comprendre les fondamentaux de Docker et la diff\u00e9rence avec une machine virtuelle<\/li>\n      <li>\u00c9crire un Dockerfile efficace, s\u00e9curis\u00e9 et reproductible pour une application Python<\/li>\n      <li>Orchestrer plusieurs services avec docker-compose (API, base de donn\u00e9es, Redis)<\/li>\n      <li>Optimiser ses images avec multi-stage builds et le cache Docker<\/li>\n      <li>Publier ses images sur un registry et d\u00e9ployer un conteneur sur le cloud<\/li>\n    <\/ul>\n  <\/div>\n  <!-- Colonne droite : Tarif + liens -->\n  <div style=\"flex:1;min-width:200px;background:#0B1D33;padding:25px;border-radius:12px;height:fit-content\">\n    <div style=\"padding:12px 0;border-bottom:1px solid #1a3a5c\">\n      <span style=\"color:#8899AA;font-size:12px;text-transform:uppercase;letter-spacing:0.5px\">Tarif inter \/ participant<\/span>\n      <div style=\"color:#FFFFFF;font-size:22px;font-weight:bold;margin-top:4px\">\n        1 400 \u20ac <span style=\"font-size:13px;font-weight:normal;color:#8899AA\">HT<\/span>\n      <\/div>\n    <\/div>\n    <a href=\"http:\/\/pythonia.fr\/wp-content\/uploads\/2026\/04\/Programme_Cloud_5_Docker_Python_Pythonia.pdf\" target=\"_blank\" style=\"display:block;color:#FFFFFF;font-size:15px;text-decoration:none;padding:12px 0;border-bottom:1px solid #1a3a5c\">\n      \ud83d\udcc4 Programme (PDF)\n    <\/a>\n    <a href=\"#\" id=\"btn-dates\" style=\"display:block;color:#FFFFFF;font-size:15px;text-decoration:none;padding:12px 0;border-bottom:1px solid #1a3a5c\">\n      \ud83d\udcc5 Voir les dates\n    <\/a>\n    <button id=\"btn-contact\" style=\"display:block;width:100%;margin-top:20px;padding:15px 20px;background:#5DADE2;color:#FFFFFF;font-size:15px;font-weight:bold;border:none;border-radius:8px;cursor:pointer\">\n      \u2709\ufe0f Demande d'information\n    <\/button>\n  <\/div>\n<\/div><\/h2>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-97b2303 e-grid e-con-boxed e-con e-parent\" data-id=\"97b2303\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b17abff elementor-widget elementor-widget-heading\" data-id=\"b17abff\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><div style=\"display:flex;gap:40px;flex-wrap:wrap\">\n\n  <!-- Colonne gauche : Contenu -->\n  <div style=\"flex:2;min-width:300px\">\n\n    <h3 style=\"font-size:24px;color:#FFFFFF;font-weight:bold;margin-top:25px;margin-bottom:10px\">Public vis\u00e9<\/h3>\n    <ul style=\"font-size:14px;color:#FFFFFF;line-height:1.8;margin-left:20px\">\n      <li>D\u00e9veloppeurs Python souhaitant industrialiser le d\u00e9ploiement de leurs applications<\/li>\n      <li>Data scientists et ML engineers confront\u00e9s \u00e0 des probl\u00e9matiques de portabilit\u00e9 d'environnement<\/li>\n      <li>DevOps juniors souhaitant ma\u00eetriser l'\u00e9cosyst\u00e8me Docker c\u00f4t\u00e9 Python<\/li>\n    <\/ul>\n\n    <h3 style=\"font-size:24px;color:#FFFFFF;font-weight:bold;margin-top:25px;margin-bottom:10px\">Objectifs p\u00e9dagogiques<\/h3>\n    <ul style=\"font-size:14px;color:#FFFFFF;line-height:1.8;margin-left:20px\">\n      <li>Comprendre ce qu'est un conteneur et ses diff\u00e9rences avec une VM<\/li>\n      <li>Installer et configurer Docker Desktop et son \u00e9cosyst\u00e8me<\/li>\n      <li>Utiliser la ligne de commande Docker : images, conteneurs, volumes, r\u00e9seaux<\/li>\n      <li>\u00c9crire un Dockerfile efficace pour une application Python<\/li>\n      <li>Appliquer les bonnes pratiques : images l\u00e9g\u00e8res, s\u00e9curit\u00e9, reproductibilit\u00e9<\/li>\n      <li>Utiliser docker-compose pour orchestrer plusieurs services<\/li>\n      <li>Conteneuriser une API Python (FastAPI ou Flask) avec base de donn\u00e9es<\/li>\n      <li>Optimiser les images avec multi-stage builds et cache Docker<\/li>\n      <li>Publier ses images sur un registry (Docker Hub, GHCR, Azure, AWS)<\/li>\n      <li>D\u00e9ployer un conteneur Python sur une plateforme cloud<\/li>\n      <li>Diagnostiquer et d\u00e9boguer les probl\u00e8mes courants<\/li>\n    <\/ul>\n\n    <h3 style=\"font-size:24px;color:#FFFFFF;font-weight:bold;margin-top:25px;margin-bottom:10px\">Pr\u00e9requis<\/h3>\n    <ul style=\"font-size:14px;color:#FFFFFF;line-height:1.8;margin-left:20px\">\n      <li>Python interm\u00e9diaire : avoir d\u00e9j\u00e0 \u00e9crit et ex\u00e9cut\u00e9 des scripts et petites applications<\/li>\n      <li>Aisance en ligne de commande (Linux, macOS ou WSL sous Windows)<\/li>\n      <li>Notions de base sur les environnements virtuels Python (venv, virtualenv)<\/li>\n      <li>Notions de Git : clone, commit, push<\/li>\n      <li>Poste avec droits admin pour installer Docker Desktop<\/li>\n      <li>Aucune connaissance pr\u00e9alable de Docker n'est exig\u00e9e<\/li>\n    <\/ul>\n\n    <h3 style=\"font-size:24px;color:#FFFFFF;font-weight:bold;margin-top:25px;margin-bottom:10px\">M\u00e9thodes p\u00e9dagogiques<\/h3>\n    <ul style=\"font-size:14px;color:#FFFFFF;line-height:1.8;margin-left:20px\">\n      <li>Alternance de th\u00e9orie (30%) et de pratique (70%)<\/li>\n      <li>Live coding : construction en direct de Dockerfiles et de stacks docker-compose<\/li>\n      <li>P\u00e9dagogie par l'erreur : d\u00e9monstration des anti-patterns Python \/ Docker fr\u00e9quents<\/li>\n      <li>P\u00e9dagogie par la comparaison : m\u00eame application dockeris\u00e9e de 3 mani\u00e8res diff\u00e9rentes<\/li>\n      <li>Projet fil rouge : chaque participant conteneurise et d\u00e9ploie son propre projet<\/li>\n      <li>Cheat sheet Docker, templates de Dockerfiles Python et guide de bonnes pratiques remis aux stagiaires (acc\u00e8s p\u00e9renne)<\/li>\n    <\/ul>\n\n    <h1 style=\"font-size:24px;color:#FFFFFF;font-weight:bold;margin-top:40px;margin-bottom:20px\">Programme d\u00e9taill\u00e9<\/h1>\n\n    <h3 style=\"font-size:16px;color:#FFFFFF;font-weight:bold;margin-top:25px;margin-bottom:10px\">JOUR 1 \u2014 Fondamentaux Docker et premier conteneur Python<\/h3>\n    <ul style=\"font-size:14px;color:#FFFFFF;line-height:1.8;margin-left:20px\">\n      <li>Qu'est-ce qu'un conteneur ? Diff\u00e9rence avec une VM<\/li>\n      <li>Cas d'usage : reproductibilit\u00e9, d\u00e9ploiement, isolation<\/li>\n      <li>Anatomie : image, conteneur, layer, registry<\/li>\n      <li>Installation et configuration de Docker Desktop<\/li>\n      <li>Premi\u00e8re image : docker run hello-world, docker pull python<\/li>\n      <li>Commandes essentielles : images, ps, exec, logs, stop, rm<\/li>\n      <li>Volumes : persistance des donn\u00e9es, montage<\/li>\n      <li>R\u00e9seaux : bridge, host, cr\u00e9ation d'un r\u00e9seau personnalis\u00e9<\/li>\n      <li>Explorer Docker Hub : choisir une image de base<\/li>\n      <li>Structure d'un Dockerfile : instructions essentielles<\/li>\n      <li>FROM : choisir la bonne image de base (python:3.12-slim vs alpine)<\/li>\n      <li>WORKDIR, COPY, RUN : construire son environnement<\/li>\n      <li>Gestion des d\u00e9pendances Python : requirements.txt, pyproject.toml<\/li>\n      <li>ENTRYPOINT vs CMD : quand utiliser quoi<\/li>\n      <li>Variables d'environnement : ENV, ARG, build-time vs runtime<\/li>\n      <li>Bonnes pratiques s\u00e9curit\u00e9 : utilisateur non-root, scan d'image<\/li>\n      <li>Le fichier .dockerignore : ce qu'il ne faut pas embarquer<\/li>\n      <li>Premier build et premier run d'une application Python conteneuris\u00e9e<\/li>\n    <\/ul>\n    <p style=\"font-size:14px;color:#FFFFFF;margin-left:20px;margin-top:15px\"><strong>\u25a0 Travaux pratiques :<\/strong><br>\n    \u2192 TP1 : Dockeriser un script Python simple (ex. scraping ou traitement de fichiers)<br>\n    \u2192 TP2 : Dockeriser une application FastAPI minimaliste et l'ex\u00e9cuter localement<br>\n    \u2192 TP3 : Ajouter la gestion des variables d'environnement et des volumes persistants<\/p>\n\n    <h3 style=\"font-size:16px;color:#FFFFFF;font-weight:bold;margin-top:25px;margin-bottom:10px\">JOUR 2 \u2014 docker-compose, optimisation et d\u00e9ploiement<\/h3>\n    <ul style=\"font-size:14px;color:#FFFFFF;line-height:1.8;margin-left:20px\">\n      <li>Pourquoi docker-compose : orchestrer plusieurs services<\/li>\n      <li>Anatomie d'un fichier docker-compose.yml<\/li>\n      <li>Networks : communication entre services<\/li>\n      <li>Volumes nomm\u00e9s : persistance des bases de donn\u00e9es<\/li>\n      <li>Health checks et depends_on : ordre de d\u00e9marrage et r\u00e9silience<\/li>\n      <li>Profiles : activer \/ d\u00e9sactiver des services selon les environnements<\/li>\n      <li>Cas concret : FastAPI + PostgreSQL + Redis orchestr\u00e9s en une commande<\/li>\n      <li>Optimiser les images Python : multi-stage builds<\/li>\n      <li>Cache Docker : ordonner les instructions pour optimiser les rebuilds<\/li>\n      <li>Mesurer et r\u00e9duire la taille d'une image (de 1 Go \u00e0 150 Mo)<\/li>\n      <li>Publier une image sur un registry<\/li>\n      <li>Docker Hub : comptes publics et priv\u00e9s, taux limite<\/li>\n      <li>GitHub Container Registry (GHCR) : int\u00e9gration avec GitHub Actions<\/li>\n      <li>Azure Container Registry et AWS ECR : introduction<\/li>\n      <li>Tags et versioning : latest vs tags explicites, bonnes pratiques<\/li>\n      <li>Pipeline GitHub Actions : build et push automatique d'une image Python<\/li>\n      <li>D\u00e9ployer un conteneur sur le cloud : Render, Railway, Fly.io<\/li>\n      <li>Azure Container Apps et AWS App Runner : introduction rapide<\/li>\n      <li>D\u00e9bogage : docker logs, docker exec, inspection d'image<\/li>\n      <li>Probl\u00e8mes classiques : permissions, port, volumes, r\u00e9seau<\/li>\n    <\/ul>\n    <p style=\"font-size:14px;color:#FFFFFF;margin-left:20px;margin-top:15px\"><strong>\u25a0 Travaux pratiques \u2014 Projet final :<\/strong><br>\n    \u2192 Chaque participant conteneurise son propre projet Python<br>\n    \u2192 Dockerfile optimis\u00e9 en multi-stage + docker-compose pour l'environnement de dev<br>\n    \u2192 Image publi\u00e9e sur un registry et conteneur d\u00e9ploy\u00e9 sur Render ou Railway<br>\n    \u2192 D\u00e9monstration individuelle et revue collective des choix techniques<\/p>\n\n    <h3 style=\"font-size:16px;color:#FFFFFF;font-weight:bold;margin-top:25px;margin-bottom:10px\">\u00c9valuation<\/h3>\n    <ul style=\"font-size:14px;color:#FFFFFF;line-height:1.8;margin-left:20px\">\n      <li>Test de positionnement en d\u00e9but de formation<\/li>\n      <li>\u00c9valuations formatives : revue individuelle des Dockerfiles, d\u00e9bogage collectif<\/li>\n      <li>QCM final de 25 questions (Jour 2) \u2014 crit\u00e8re de r\u00e9ussite : 60%<\/li>\n      <li>Pr\u00e9sentation et d\u00e9monstration live du projet conteneuris\u00e9<\/li>\n      <li>Attestation de fin de formation d\u00e9livr\u00e9e<\/li>\n    <\/ul>\n\n  <\/div>\n<\/div><\/h2>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Containeuriser une application Python avec Docker Objectifs : Comprendre les fondamentaux de Docker et la diff\u00e9rence avec une machine virtuelle [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1056","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/pythonia.fr\/index.php\/wp-json\/wp\/v2\/pages\/1056","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pythonia.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/pythonia.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/pythonia.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pythonia.fr\/index.php\/wp-json\/wp\/v2\/comments?post=1056"}],"version-history":[{"count":19,"href":"https:\/\/pythonia.fr\/index.php\/wp-json\/wp\/v2\/pages\/1056\/revisions"}],"predecessor-version":[{"id":1087,"href":"https:\/\/pythonia.fr\/index.php\/wp-json\/wp\/v2\/pages\/1056\/revisions\/1087"}],"wp:attachment":[{"href":"https:\/\/pythonia.fr\/index.php\/wp-json\/wp\/v2\/media?parent=1056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}