Comment faire pour faire de la Dockerize de vos applications Python | Max S | Skillshare

Vitesse de lecture


1.0x


  • 0.5x
  • 0.75x
  • 1 x (normale)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Comment faire pour faire de la Dockerize de vos applications Python

teacher avatar Max S, Power through programming

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Leçons de ce cours

    • 1.

      Introduction au cours

      1:34

    • 2.

      Docker Intro

      9:28

    • 3.

      Création d'un fichier Docker

      35:45

    • 4.

      Construction multi-étages

      21:46

    • 5.

      Compose de Docker

      32:40

    • 6.

      Makefile

      12:21

  • --
  • Niveau débutant
  • Niveau intermédiaire
  • Niveau avancé
  • Tous niveaux

Généré par la communauté

Le niveau est déterminé par l'opinion majoritaire des apprenants qui ont évalué ce cours. La recommandation de l'enseignant est affichée jusqu'à ce qu'au moins 5 réponses d'apprenants soient collectées.

127

apprenants

--

projet

À propos de ce cours

Dans ce cours, vous apprendrez à utiliser votre code Python existant et à le lancer dans un conteneur de docker, à la fois à l'aide de docker et de docker.

Docker est une technologie très courante et importante à utiliser dans votre carrière de génie logiciel. Il vous aide à créer des images de vos applications dans un état reproductible. Vous pouvez donc être sûr que si elle fonctionne sur votre machine, elle fonctionnera dans un autre logiciel ainsi que dans le cloud.

En outre, elle vous permet également d'utiliser très facilement un logiciel existant, car vous pouvez facilement faire tourner une base de données Postgres ou un cache Redis sans travail supplémentaire en utilisant simplement cette image de docker.

Cela simplifie tout le développement car vous pouvez reproduire la configuration de production dans votre environnement local, ce qui signifie que vous pouvez mieux développer et tester votre application.

Vous pouvez suivre le code dans le GitHub ici : https://github.com/codingwithmax/PythonTutorialFastAPI/tree/58CreatingADockerfile

Rencontrez votre enseignant·e

Teacher Profile Image

Max S

Power through programming

Enseignant·e
Level: Beginner

Notes attribuées au cours

Les attentes sont-elles satisfaites ?
    Dépassées !
  • 0%
  • Oui
  • 0%
  • En partie
  • 0%
  • Pas vraiment
  • 0%

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

Chaque cours comprend de courtes leçons et des travaux pratiques

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

Suivez des cours où que vous soyez avec l'application Skillshare. Suivez-les en streaming ou téléchargez-les pour les regarder dans l'avion, dans le métro ou tout autre endroit où vous aimez apprendre.

Transcription

1. Introduction au cours: Salut, c'est Max et bienvenue dans mon cours sur la façon de rendre les yeux plus sombres sur vos applications Python. Maintenant, comme tout développeur de logiciels le sait, Darker joue un rôle très important dans votre carrière de développeur logiciel car il vous permet d'avoir l' assurance que tout ce que vous avez localement est en fait la même chose. Et il fonctionnera de la même manière sur une machine différente, également dans le cloud et dans un environnement de production. En outre, il vous fournira également de nombreux outils vraiment intéressants pour créer facilement différentes images afin que vous ayez toutes sortes de logiciels facilement disponibles. Mais nous voulons être en mesure d' utiliser correctement les foncés. Dans ce cours, nous allons donc apprendre les bases de l'écriture de votre premier fichier Docker, de la création en plusieurs étapes et de l'utilisation de docker-compose afin de pouvoir votre application Python. vraiment n'importe quel autre code. Mais dans ce cas, nous nous concentrons uniquement sur Python et nous l' exécutons utilisant Docker, en construisant l'image Docker, puis en exécutant le conteneur Docker, à la fois via les commandes Docker normales comme ainsi que sur Docker Compose. Maintenant, ce cours fait partie d' une plus grande série Python. Nous allons apprendre à créer une application Python complète à partir de zéro. Mais dans ce cas, nous allons nous concentrer uniquement sur la partie la plus sombre. Ainsi, le code que nous allons utiliser provient de cette plus grande série Python. Et vous pourrez y accéder en utilisant le lien GitHub ci-dessous dans la description du cours. Cependant, vous pouvez évidemment utiliser votre propre code Python aux mêmes fins. Vous pouvez également utiliser le code qui se trouve déjà sur GitHub si vous le souhaitez. Quoi qu'il en soit, vous trouverez également chacune de ces leçons sous différentes branches GitHub et du référentiel GitHub ci-dessous. Donc, si vous voulez suivre le code, assurez-vous de le consulter également. Alors sans plus attendre, je vous verrai à l'intérieur et heureuse d'apprendre. 2. Docker Intro: Très bien, dans cette section, nous allons commencer à en apprendre davantage sur Docker et nous allons intégrer Darker à notre application. Maintenant, Dr. est un programme vraiment cool et je vous recommande simplement de télécharger Docker sur Google ou d'accéder à cette URL ici, docker.com slash products slash Docker Desktop. Et pour moi, comme je suis sur un Mac, cela va me donner les options du Mac. Mais si vous utilisez Windows ou Linux, seront définis par défaut et assurez-vous simplement de le télécharger, car il fait quelques centaines de mégaoctets. téléchargement peut donc prendre quelques minutes. Je l' ai déjà fait. Donc oui. Pour Docker, Docker est vraiment sympa car il nous aide à résoudre un autre type de problème que nous avions déjà commencé à résoudre lorsque nous parlions d'environnements virtuels. Donc, si vous vous souvenez des environnements virtuels, ou si votre principale motivation était de nous assurer que tout est cohérent. Et dans un certain sens, un peu isolé pour tous les paquets Python dont nous avons besoin. Ainsi, par exemple, si notre application a besoin d'une API rapide pour fonctionner, nous voulons nous assurer que tous ceux qui essaient exécuter notre code ont installé FastAPI , ainsi que tous les autres éléments dont ils ont besoin pour l' exécuter. demande. Et qu'il ne s'agit pas de leur dire : « Oh salut, il vous manque cette installation, vous manquez cette installation, ou ils essaient d'utiliser les installations locales. Et puis il y a une incompatibilité de version, par exemple nous utilisons une version comme je ne sais pas, dix points peu importe. Et ils utilisent une version à neuf points, peu importe. Et il y a une incompatibilité de version. donc essayé de résoudre tous ces Nous avons donc essayé de résoudre tous ces problèmes à l'aide d'environnements virtuels. Et c'est génial et extrêmement utile. Mais nous pouvons en fait faire davantage pour rendre les choses encore plus cohérentes. Et l'idée ici est qu'avec plus sombre, nous pouvons créer des conteneurs isolés. Donc, en gros, considérez-le comme une boîte que nous pouvons construire à partir de zéro, y compris le système d'exploitation. Et nous savons que peu importe où cela fonctionnera, si nous lui donnons les instructions appropriées, il aura la même apparence partout. Et maintenant, vous vous demandez peut-être pourquoi nous voudrions faire cela semble un peu exagéré. Eh bien, en fait, il existe certains scénarios et je l'ai rencontré moi-même plusieurs fois où vous pouvez installer quelque chose sur un Mac et cela peut ne pas fonctionner correctement, ou cela peut fonctionner différemment sur un Linux, ou des objets fonctionnent sur un Linux d'une manière, ils fonctionnent d'une manière différente, puis ils fonctionnent sur Windows comme une troisième méthode. Ou vous avez déjà installé des éléments locaux que vous avez peut-être oubliés parce que vous les avez installés six mois, un an ou deux ans. Et puis quelqu'un d'autre essaie d' exécuter votre code et se dit : « Hé, ces choses ne fonctionnent pas. Et c'est simplement parce qu'il y a des éléments que vous avez installés que vous avez oubliés et qu' ils n'ont pas. L'utilisation de Docker nous aide donc à résoudre tous ces problèmes. Et il y a en fait beaucoup plus de choses intéressantes que nous pouvons en faire et que nous examinerons plus tard. Mais nous allons nous concentrer maintenant. abord, il suffit d'utiliser Docker pour créer une boîte extrêmement propre contenant notre application qui, quel que soit l'endroit où vous l'exécutez, sera cohérente. En fait, Docker est utilisé dans le monde entier. Lorsque vous déployez du code, vous déployez généralement ce code sous forme d'image Docker qui sera exécutée quelque part. Donc oui, plus sombre, très important pour ça pour vraiment nous aider à tout rendre cohérent à partir de la base, ayant le même système d'exploitation qui fonctionne sur les mêmes versions du langage de programmation R, de même, puis en utilisant nos environnements virtuels pour installer des packages cohérents. Nous voulons donc simplement nous assurer que tout est identique, quel que soit l' endroit où vous l'exécutez et que l' obscurité nous permettra de le faire. Et c'est extrêmement, extrêmement utile parce qu'alors vous n' avez jamais à vous inquiéter, oh, y a-t-il quelque chose que j'ai oublié qui doit également être installé et que j'ai installé ou y en a-t-il variable d'environnement que j'ai définie et que j' ai peut-être oubliée ? Ou, tu sais, toutes ces sortes de bizarreries étranges qui peuvent survenir. Et puis surtout pour faire face à des problèmes tels que, Whoa, pourquoi cela ne fonctionne-t-il pas sur votre machine ? Cela fonctionne bien sur ma machine. Avez-vous correctement installé les éléments de l'environnement virtuel ? Oui, tu l'as fait. OK. C'est bizarre. Par exemple, pourquoi fonctionne-t-il sur ma machine et sur la vôtre ? Darker va nous aider à atténuer tous ces problèmes. Et puis, comme nous le verrons plus tard, il existe d'autres choses intéressantes que nous pouvons faire pour vous faciliter la vie avec Docker, par exemple créer une base de données que nous pouvons utiliser ou générer de l'argent que nous pouvons utiliser. Et plein de trucs sympas à venir. Mais nous allons d' abord nous concentrer sur l' isolation de notre application afin de pouvoir simplement donner cette image à quelqu'un, puis qu'il puisse l' exécuter et qu'il obtienne exactement la même chose que nous voyons de notre côté. Donc oui, avec ça, je recommande simplement Google, téléchargez Docker Desktop et votre moteur de recherche préféré ou rendez-vous sur ce site Web ici, qui peut changer avec le temps, probablement pas, mais Les produits docker.com slash slash Docker Desktop. Ensuite, allez-y et téléchargez la version plus sombre pour vous. Encore une fois, je l'ai déjà fait. Ensuite, pour moi, lorsque je déballe l'image, me suffit de la faire il me suffit de la faire glisser d'ici dans mes applications. Une fois que vous avez fait cela, allez-y et accédez à vos applications. Et maintenant, vous devez double-cliquer sur Dark et faire fonctionner pour moi parce que je l'ai déjà fait auparavant. Il va juste commencer à courir. Et vous pouvez vraiment voir si vous êtes sur un Mac et qu'en haut à droite, il y aura ce petit vaisseau qui ressemble à ceci, qui va commencer à rebondir sur un Windows. Nous allons passer en revue cela dans une seconde. Mais oui, attendez que ça s'ouvre. C'est la première fois que vous allez l'utiliser. Il vous sera demandé de lire et d'accepter les termes et conditions avant le début de l'application . Donc, chaque fois que cette fenêtre contextuelle apparaît, assurez-vous de le faire. Et encore une fois, sur un Mac en haut à droite, généralement dans votre barre d'outils là-haut, qui n'est actuellement pas sur mon écran, vous devriez voir une baleine comme celle-ci avec les conteneurs qui circulent, ce qui signifie que ça commençait. Et une fois qu'il prend une forme fixe, cela signifie qu'il démarre correctement. Et une fois que vous avez accepté les termes et conditions et que le démarrage a démarré, vous devriez pouvoir accéder à votre PyCharm. Maintenant, si vous tapez simplement dark ici, vous devriez voir une sortie indiquant que l'installation s' est déroulée avec succès. Si cela vous pose des problèmes, la première chose que je vous recommande est tout d'abord d' attendre que votre Docker ait fini de s'ouvrir. Et si les problèmes persistent, essayez de redémarrer votre PC, n'est pas nécessaire, mais c'est généralement une bonne chose d'essayer. Et puis, lorsque vous tapez dark ici, vous devriez voir qu'il répond à une sorte de sortie. Nous avons ici. Pour le côté Windows. Nous allons être sur la même longueur d' onde et nous pouvons voir ici me recommande déjà la version Windows. Allez-y et cliquez sur Télécharger à ce sujet, ce j'ai déjà fait car le téléchargement prend quelques minutes. Ensuite, vous allez ouvrir le programme d'installation. Il vous sera demandé Si vous souhaitez l'ouvrir, vous devez cliquer sur Oui. Ensuite, nous allons ouvrir le programme d'installation ou il y aura deux cases à cocher qui seront cochées par défaut. Laissez-les et cliquez sur Suivant. Ensuite, l'installation va démarrer, ce qui prend à nouveau quelques minutes. Donc je vais juste le laisser fonctionner en arrière-plan. Et c'est dans cet état que vous allez atteindre que l' installation a réussi. Ensuite, nous allons simplement cliquer sur Fermer et redémarrer. Nous allons donc redémarrer notre machine pour cela. Donc, après avoir redémarré du côté Windows, nous allons également être invités à afficher cette fenêtre contextuelle ici. Je vais accepter les conditions et continuer avec cela. Et maintenant, Docker va s'ouvrir au cas où vous auriez cette fenêtre contextuelle. Nous allons simplement suivre quelques instructions supplémentaires ici pour obtenir le processus d'installation. Alors allons-y rapidement et faisons-le. Écartez ça. Suivez les instructions ici. Donald, c'est ici, très vite. Ouvrez Execute et suivez simplement ce processus. Et puis j'ai déjà ouvert PyCharm ici. Je vais le prendre et je vais juste le copier. Accédez à PyCharm où le PowerShell est déjà ouvert. Collez ça dedans. Je vais juste appuyer sur Redémarrer une fois de plus. Et après avoir redémarré ici, si nous passons à notre Docker, nous devrions maintenant voir que Docker Desktop commence à ouvrir cette application. Si nous allons en bas à droite, alors aussi là, qui pour moi est actuellement hors écran. Mais il y en a aussi qui devraient être en mesure de voir si vous cliquez sur cette petite flèche de fenêtre que vous avez toujours, que vous avez ce vaisseau plus sombre ici. Et puis il y a les conteneurs qui devraient être déplacés. Et là aussi. Si vous cliquez dessus, cela devrait vous ramener à l'application Docker comme nous l'avons fait ici. OK, donc maintenant, allons dans notre PyCharm, si nous cliquons ou si nous tapons plus sombre ici. Et puis, du côté Windows, cette commande devrait maintenant être enregistrée avec quelque chose et nous vous verrons dans une seconde. Nous avons maintenant une sortie qui lui est associée. C'est ainsi que nous allons procéder au processus d'installation sous Windows. 3. Création d'un fichier Docker: Bien, maintenant que Docker est installé, allons-y et utilisons Docker pour pouvoir exécuter notre application dessus. Maintenant, avant d'entrer dans le vif du sujet, je voudrais vous montrer rapidement, de manière générale, où nous allons trouver ces systèmes d'exploitation de base ces packages préinstallés de base partir de ces packages préinstallés de base que nous allons utiliser. Pour ce faire, vous pouvez vous rendre sur hub.docker.com. Ensuite, vous devrez créer un compte ici. Donc, si vous n'en avez pas, allez-y et inscrivez-vous. Vous pouvez vous connecter et vous accéderez à une page qui ressemble probablement à ceci. Et vous pouvez vous rendre dans la section Explorer si vous le souhaitez. Et ici, nous pouvons déjà voir une liste des différents types de systèmes de base qui sont à notre disposition. Cela peut ou non signifier quoi que ce soit pour vous. Et nous pouvons voir ici que le python est l'un de ceux-là. Nous pouvons donc soit cliquer directement dessus soit si nous recherchons quelque chose de spécifique. Nous pouvons également effectuer une recherche ici, par exemple Python. Et nous allons utiliser une version de celui-ci. Et quand nous voyons ici, nous pouvons voir qu'il y a essentiellement des balises similaires qui leur sont associées. Et nous verrons dans un instant comment nous pouvons les utiliser. Mais toutes ces versions sont essentiellement différentes auxquelles nous avons accès et que nous pouvons utiliser. Et l'importance de l'utilisation de balises est qu'elle donne un sentiment de cohérence. Si nous utilisons un tag, nous sommes en mesure de toujours réutiliser la même chose. De cette façon, même si mises à niveau sont mises en place ou quelque chose comme ça, nous savons que notre système ne changera pas. Il fonctionnera toujours exactement dans les mêmes conditions, ce qui est évidemment très important pour nous. Donc, pour nous, je vais utiliser le Python ici. Mais juste pour votre information si vous avez besoin d'utiliser une base ou des images différentes de celles que vous recherchez exactement si vous n'êtes pas sûr de ce que vous recherchez exactement, un rapide Google ou utilisez votre moteur de recherche de choix, nous vous indiquerons probablement très rapidement la direction à suivre, mais sinon vous pouvez également simplement parcourir les images mises à la disposition du public en un seul endroit, il vous suffit de vous rendre dans le Docker Hub. Et vous verrez ici, par exemple, pour Python, il s'agit d'une image officielle et que c'est généralement un bon tag que vous souhaitez rechercher. Puisque ce sont généralement les plus fiables. Puisque cela ne constituera pas la base. Vous devez donc vous assurer que ce que vous avez installé est comme une version correcte et pas simplement créé par une personne au hasard qui peut être un peu moins fiable. Bien que la ligne verte, la ligne grise à cette zone, devienne également un peu discutable quant à savoir ce qui est fiable et ce qui ne l'est pas. Mais en général, comme bon indicateur, la première chose à faire est de rechercher les images officielles. Et quand ce n'est pas le cas, eh bien, il n'a pas cette étiquette. Assurez-vous simplement de bien comprendre ce que vous utilisez. Puisque c'est sur cela que vous allez exécuter votre application. Donc, il suffit d'en être conscient du point de vue de la sécurité. Cela étant dit, revenons à notre application. Et ce que je vais faire ici, je vais créer un nouveau fichier. Et je vais appeler ce fichier Docker comme ce fichier Docker D majuscule. Je vais juste appuyer sur Entrée. Et maintenant, ici, nous allons créer notre fichier Docker. La première chose à faire est donc de spécifier ce qui doit constituer la base de notre système. Donc, essentiellement, la façon dont nous allons créer ces conteneurs Docker, laquelle vous pouvez réfléchir. Nous expédions ces conteneurs bien structurés, emballés et isolés, presque comme dans un chantier naval. Chacun de ces conteneurs contiendra, dans notre cas, comme une application, mais il peut réellement contenir tout ce qui s'y trouve. Et cela semble autosuffisant, ou du moins inclut tout ce qui doit être inclus dans le package unique. La première chose à faire est donc de définir dans quoi se trouvera notre base. Nous avons donc besoin d'une sorte de système d'exploitation similaire. Mais en général, si nous partons d'un système d'exploitation, cela devient ennuyeux car nous devons ensuite installer toutes les dépendances Python supplémentaires pour être sûrs de pouvoir exécuter Python. Et ce qui est beaucoup plus simple pour nous, c' est qu'au lieu de simplement commencer par un système d'exploitation de base et de continuer à partir de là, nous pouvons aller plus loin et nous pouvons commencez par un système d'exploitation sur lequel Python est installé. Ensuite, il ne nous reste plus qu' à installer tout ce dont nous avons besoin et à exécuter notre application. C'est donc ce que nous allons faire. Nous allons commencer par ce mot clé, qui va définir par où nous voulons commencer. Je vais utiliser l'image Python. Et plus précisément, je vais utiliser le tag three point nine, qui, comme vous l'avez peut-être deviné, indique qu'il s'agit de la version 3.9 pour Python. Ensuite, je vais également ajouter un autre tiret ici et créer l' image alpine. Maintenant, l' image alpine est généralement un bon point de départ , car elle est relativement petite. Ce que vous ne voulez pas vraiment, c'est que vous ne voulez pas installer un énorme système d'exploitation installer un énorme système d'exploitation sur lequel un tas de choses sont installées, mais vous n' allez pas en utiliser beaucoup. Donc, en général, l'image alpine elle-même avec le Python suffira pour vos cas d'utilisation. Mais si jamais ce n'est pas le cas, il existe un autre truc appelé Slim Buster que vous pouvez essayer. Mais sinon, un rapide Google ou une utilisation rapide de votre moteur de recherche préféré, quel qu'il soit, vous indiquera très rapidement la bonne direction pour trouver la meilleure image à utiliser ce. Mais dans la plupart des cas, l'image alpine vous suffira. Encore une fois, l' avantage que nous en retirons est que nous ne nous contentons pas d'installer un tas de choses et que notre conteneur devient très grand. Mais nous voulons plutôt le garder aussi petit que possible afin de ne pas utiliser beaucoup de ressources de notre système simplement pour installer tous ces éléments que nous n'utilisons même pas. Nous allons donc partir de l'image Python en utilisant le tag 39 dash Alpine, qui est à nouveau une version de Python 3.9 et qui inclut tout cela et les dépendances préinstallées. Et nous utilisons la version Alpine ici car celle-ci est relativement petite. Très bien, c'est donc la première commande que nous avons, qui est la commande de front. Nous allons maintenant examiner la commande suivante, qui sera une commande d'exécution. Ici, nous pouvons donc utiliser ces commandes pour lancer certaines étapes. Et la façon dont nous procédons et Docker, c'est chaque commande que nous avons partout, chaque mot clé que vous utilisez ici, vous pouvez imaginer que vous ajoutez une couche supplémentaire à votre image. Nous avons donc notre première couche ici. Maintenant, lorsque nous aurons notre premier mot clé ici, exécutez, ce que nous verrons dans une seconde. Nous allons former notre deuxième couche. Nous avons un autre mot clé ici, disons une autre course. Je vais juste former notre troisième couche. Et avec cela, nous construisons en quelque sorte couche après couche. Maintenant, la raison pour laquelle c'est bien parce que Docker propose également une forme de mise en cache. Il reconnaîtra donc si vous n'avez apporté aucune modification à environ la moitié de vos données. Et en fait, seule la dernière étape est celle qui change, puis il peut réutiliser la plupart des éléments précédents et il suffit de changer la dernière couche. donc très important de garder cela à l'esprit, simplement parce que lorsque vous créez vos images Docker, vraiment les choses qui ne changent presque jamais, vous devez les placer tout en haut de la liste, et les éléments qui peuvent changer plus régulièrement, par exemple les packages que vous devez installer ou simplement le code de votre application. Tout cela devrait se situer plus en bas. D'accord, donc je commence par cette commande d'exécution. Ici, nous pouvons demander à Docker d' exécuter une commande spécifique et vous le reconnaîtrez. Nous allons lancer pip, installer pip. Nous allons donc exécuter cette commande ici, que vous avez probablement reconnue dans une leçon précédente, où nous allons installer pip end à l'aide de notre PIP. Et nous avons PIP disponible parce que nous installons cette image de base Python, qui contient déjà Python et tout ce dont nous avons besoin pour cela ou parce que tout est préinstallé. La version Python ici sera à nouveau 3.9, et nous avons également la commande pipa man qui l'accompagne immédiatement. Donc oui, nous allons installer R comme ça. Maintenant, une autre chose que nous allons faire est de créer un nouveau répertoire. Nous allons créer un nouveau dossier dans lequel nous pourrons conserver toutes nos informations. Parce qu'en fin de compte, nous créons ce conteneur et nous voulons mettre tout ce dont nous avons besoin en un seul endroit afin qu'il soit disponible pour nous comme nous l'avons ici dans notre fichier de projet, par exemple et ainsi de suite Pour ce faire, nous allons utiliser ce répertoire MK pour le répertoire make. Et nous allons avoir ce moins p, qui nous permet essentiellement de créer plusieurs dossiers à la fois. Ensuite, nous allons simplement utiliser ce chemin utilisateur SRC slash app. Et c'est là que nous allons mettre tout notre code pour notre application. Maintenant, je ne veux pas entrer dans les détails toutes les commandes Linux, car il existe en fait un cours distinct à ce sujet. Donc, je ne veux pas trop dérailler trop dérailler et me concentrer vraiment là-dessus. Mais en gardant à l'esprit que vous pouvez simplement réutiliser la syntaxe, que vous pouvez simplement réutiliser nous créons simplement ce répertoire ici, et nous créons ces dossiers. Donc, dans le dossier utilisateur, nous avons le dossier SRC, et là, nous avons l'application. Et si l'un d'entre eux n'existe pas, nous allons le créer. Nous recommençons donc, juste pour avoir un dossier dans lequel nous pouvons mettre nos affaires. La prochaine chose que nous allons faire est d'utiliser une nouvelle commande appelée loop work. Et cela va définir notre répertoire de travail actuel. Cela va nous aider car au lieu de toujours avoir à le taper partout, chaque fois que nous voulons exécuter quelque chose ou en une seconde, nous verrons copier quelque chose. Nous pouvons simplement dire en utilisant notre position actuelle. Cela va donc nous faciliter la tâche afin de ne pas avoir à répéter cette année tout le temps. Nous allons donc le vendre à cette application utilisateur SRC. Ce sera notre répertoire de travail ou le dossier dans lequel nous travaillons actuellement, dans lequel tout devrait être relatif. Maintenant que pip est installé, nous avons le dossier dans lequel nous allons mettre nos affaires. Et nous allons également simplement définir un emplacement relatif à cela. Maintenant, ce que nous devons faire, c'est avoir accès à nos fichiers, mais nous voulons les copier dans notre image et les placer au bon endroit. Nous allons utiliser cette commande de copie. Et maintenant, nous devons examiner ce que nous avons ici. Et essentiellement, nous voulons maintenant copier ceci. Et nous voulons avoir la même structure pour la plupart ici, sauf peut-être nous débarrasser de certains déchets dont nous n'avons pas besoin. Nous allons donc le faire en deux étapes. Nous allons commencer par le verrou de fichier pip et le fichier pip, ainsi que ce fichier main.py. Comme ce sont ceux qui sont le plus à l'extérieur, ils le sont un peu plus haut. Nous allons donc les copier. Nous allons donc copier notre fichier pip, notre fichier pip point loc. Et nous allons également copier notre fichier main.py. Et nous allons simplement l'utiliser parce que , plutôt que d' avoir à écrire le chemin complet de l'application SRC utilisateur dans laquelle nous voulons le copier, car nous avons défini notre répertoire de travail, nous pouvons simplement utiliser le chemin relatif, c' est-à-dire copié dans le répertoire de travail actuel. Donc ça va être copier, prendre ça, et ça va être copier ça pour nous. Bien, maintenant que nous avons copié ces fichiers, nous voulons maintenant copier tout ce qui se trouve dans notre dossier d'application ici. Malheureusement, nous ne pouvons pas simplement ajouter notre application ici car elle va prendre tout le contenu de l'intérieur et le copier sur la même couche, ce qui n'est pas ce que nous voulons. Nous allons donc ajouter une deuxième étape de copie ici. Et nous voulons copier le contenu de notre application dans un dossier d'application. Donc, ce que je vais faire, c'est créer un autre dossier d'applications ici. Notre structure de dossiers sera donc votre dossier principal est l'usr, puis nous allons vers SRc. Ensuite, nous avons le dossier de l'application, et à l'intérieur, nous avons un autre dossier d'applications. Vous pouvez donc l'imaginer avec ce nom de dossier au lieu d'être des offres, achetez-les, le projet serait lancé et nous avons une application ici et une application ici. Et maintenant, je voulais copier le contenu de ce dossier, qui est une application, dans le dossier de l'application qui se trouve ici. Très bien, nous avons donc copié nos trucs de premier niveau ici. Ce sera sur la même couche. Et maintenant, je veux m'assurer que tout le contenu et ici sont également dans ce format. Et encore une fois, si je l'utilisais simplement, cela reprendrait le contenu d'ici et le copierait au même niveau, ce qui n'est évidemment pas la structure actuelle que nous avons. Pour ce faire, je vais simplement ajouter un autre dossier dans lequel nous pouvons le copier. Bien, maintenant que nous avons ceci, allons-y et pour l'instant, apprenons simplement comment nous pouvons commencer notre image et examiner notre structure actuelle pour nous assurer que tout va bien. Et ensuite, ce que nous allons faire, c'est terminer avec le reste du matériel qui sera installé à l'aide de l'installation pip et qui exécutera également notre serveur. Mais pour l'instant, examinons simplement notre structure actuelle et voyons si elle est correcte. Et pour cela, je vais utiliser le ls minus l, qui, si vous utilisez un Mac ou Linux, devrait fonctionner pour vous. Je ne pense pas que cela fonctionnera sur Windows, mais ce n'est pas grave parce que cela fonctionnera ici parce que nous allons utiliser une version basée sur Linux de toute façon. Mais vous pouvez voir ce que fait cette commande, c'est qu'elle imprime le contenu du dossier actuel dans lequel je me trouve. Donc, essentiellement, nous pouvons voir ici que le contenu ici est exactement comme le contenu répertorié ici. Je vais donc l' exécuter pour l'instant, juste pour que nous puissions examiner l'image que nous construisons ici et nous assurer que notre structure est correcte. Très bien, maintenant que nous avons défini notre fichier Docker, qui définit l'ensemble des étapes que nous allons suivre, commençant par une image de base et copiant toutes nos informations pour obtenir cette image qui contient tout ce dont nous avons besoin pour exécuter notre application. Il n'y a pas encore tout, mais nous y arrivons. Maintenant que nous avons cette image à trouver ici, nous devons construire cette image. Nous n'avons donc pas eu besoin d'exécuter ces commandes et de les mettre dans un package prêt à l'emploi que nous pouvons simplement exécuter. ce faire, nous allons utiliser la commande appelée Docker build. Et maintenant, nous allons utiliser un moins t ici, qui sera la cible dans laquelle nous voulons le copier, le nom que nous voulons y associer. Et donc ici, je vais juste appeler cela ma première application. Et je vais donner une touche d'originalité au tag, au plus tard. Maintenant, le plus récent est un tag que vous verrez très souvent, qui est. Indique simplement qu'il s'agit de la dernière version de cette image. Maintenant, en général, vous aurez une balise associée à chaque image, puis vous aurez également une balise la plus récente. Ainsi, si vous souhaitez simplement exécuter la dernière version, vous pouvez utiliser la dernière balise, qui changera probablement avec temps si des mises à jour sont appliquées. Ainsi, vous êtes assuré de toujours utiliser la dernière version. Ou vous pouvez également faire référence à une balise spécifique, comme nous le faisons dans ce cas ici, qui signifie que même si plus de 3.10 est le nôtre, c'est 3.11, 13.12, 13 si cela sort ou quand Price et Four sortiront, cela n'aura aucun impact sur nous, car nous allons toujours nous en tenir à une image spécifique étiquetée avec cette étiquette ici. Cela nous garantit donc la cohérence du fait que même si les choses changent, nous utiliserons toujours la même base. Il y a donc évidemment des avantages et des inconvénients à chacun. Ainsi, vous pouvez facilement vous tenir courant de la dernière version chaque fois que vous la démarrez ou que vous la reconstruisez. Mais évidemment, ce sont aussi garde, car si les choses changent, elles peuvent devenir incompatibles et vos fichiers risquent de ne plus fonctionner, ce qui n' est évidemment pas une bonne chose. gardant cela à l'esprit, nous avons maintenant l' objectif dans lequel nous voulons dire, intégrer cela. Il ne nous reste plus qu'à donner l' emplacement de notre fichier Docker, dont je vais juste mettre le point ici, ce qui indiquera simplement qu'il se trouve dans le dossier actuel où nous nous trouvons actuellement. Je vais appuyer sur Entrée. Maintenant, pour vous, cela va probablement prendre un peu de temps puisque vous devez d'abord télécharger cette image. Ensuite, vous allez exécuter toutes ces commandes par-dessus. Pour moi, beaucoup de choses ont déjà été encaissées. Et vous pouvez voir ici que si nous faisons défiler l'écran vers le haut, bon nombre de ces étapes ont été encaissées. y a donc aucun véritable téléchargement en cours pour moi. Et le processus de construction se déroule en fait très, très rapidement, comme nous pouvons le voir. Une fois que vous l'avez exécuté pour la première fois, si vous le lancez à nouveau, il fonctionnera également très rapidement. Parce que, là encore, ces couches sont mises en cache. Maintenant que nous avons créé notre image, nous voulons maintenant l'exécuter. Nous avons donc ce package qui est prêt et nous voulons maintenant l'exécuter. ce faire, nous allons utiliser la commande docker run. Et nous allons maintenant fournir le nom ainsi que le tag que nous voulons exécuter. Nous voulons donc exécuter cette image ici. Et je vais également lui attribuer un nom. Nous allons donc l' exécuter, et cela va fonctionner comme un conteneur. Nous allons lancer cette image ici en tant que conteneur. Et nous allons donner un nom à ce conteneur en cours d'exécution afin de mieux le voir. C'est possible, lorsque nous examinons les choses qui fonctionnent, ce que nous examinerons dans une seconde. Nous saurons, d'accord, ça l' est, ce n'en est pas un. Nous pouvons donc en quelque sorte lui donner un nom lisible. Nous allons donc appeler cela notre première application peut-être soulignée. Vous n'avez pas besoin des traits de soulignement, mais je vais les utiliser. Et oui, il suffit d'appuyer sur Entrée ici. Et nous allons l' exécuter et nous pouvons voir qu'il a exécuté cette commande ici, qui ne fait que lister le contenu. Et la structure que nous avons est un fichier pip. Nous avons un fichier pip point loc. Nous avons le dossier de l'application, qui devrait contenir tous ces éléments. Et nous avons le fichier main.py. Voici à quoi ressemble notre dossier actuel. Maintenant, c'est bien parce que nous n'avons pas les tests, par exemple parce que nous n'en avons pas besoin si nous exécutons notre image ou pour exécuter ce code en tant qu'application. Parce que d'ici là, ou nos tests, j'ai effectué et nous n' plus besoin parce que nous n'allons pas les exécuter en tant qu'application en direct. Nous allons exécuter le test lorsque nous le ferons localement, nous exécuterons les tests plus tard, avant de créer notre image. Une fois notre image créée, nous n'avons plus besoin de tests. Nous pouvons donc nous en débarrasser et dire, économisons un peu d'espace ici aussi. Maintenant que cela fonctionne, allons-y et continuons notre configuration ici. Parce qu'en réalité, nous ne voulons pas simplement imprimer le contenu et en finir avec tout. Mais nous voulons plutôt avoir une application en cours d'exécution que nous pouvons réellement utiliser. Pour ce faire, nous devons encore prendre quelques mesures. La première chose à faire est de lancer notre installation pip afin d' installer toutes les dépendances dont nous avons besoin. Nous allons donc utiliser notre installation pip . Nous n'allons pas utiliser la balise def parce que ce sera essentiellement notre image de production. Nous ne voulons donc pas installer les dépendances de développement car nous n'en avons pas besoin. Nous allons simplement être une pure application. Cependant, nous allons utiliser un nouveau tag qui sera « dash, dash system ». Maintenant, cela va installer tout ce que nous utilisons à l' échelle du système, de sorte que nous l'exécutions ou lorsque nous essayons d'y accéder, nous n'avons pas à accéder à notre environnement virtuel, mais c'est juste va être installé pour tout un système, ce qui va nous faciliter la tâche car nous n' aurons pas à utiliser le PIP et les commandes plus tard, parce que essentiellement ce que nous avons dans cette image complète est un environnement virtuel. Nous le recréons à chaque fois et il n'y a rien d'autre dedans. Nous pouvons donc l'installer l'échelle du système parce que nous savons exactement de quoi il s'agit, parce que nous construisons tout. À partir de zéro. Nous allons donc installer nos dépendances comme d'habitude. Et maintenant, ce que nous devons faire, c'est exécuter notre application. Nous allons donc utiliser à nouveau la commande CMD pour cela. Et nous allons ouvrir et fermer les parenthèses. Et chacune des entrées correspond à chacun des éléments que nous aurons ici et qui constituera l'un des arguments que nous allons lancer. Donc, par exemple, lorsque nous exécutons l'application Unicorn Main Dash, que vous pouvez exécuter comme ceci. Mais la manière préférée de l' écrire serait la suivante. Donc, si nous faisons cela, ce sera la commande habituelle que nous utiliserons, sauf que d'habitude, nous avons aussi cette balise reload, whoops. Nous ne voulons pas l'utiliser en production car cela ralentirait considérablement l'application. Assurez-vous donc de ne pas utiliser ce tag en production. Lorsque nous l'exécutons localement, c'est bon. Cela rend le processus beaucoup plus facile. Mais lorsque je l'exécute en production, vous ne voulez plus utiliser ce tag. Donc pour l'instant, nous pouvons simplement garder comme ça si nous le voulons, nous pouvons l'essayer. Mais il y a encore quelques problèmes que nous verrons dans une seconde. Mais abordons-les quand nous y arriverons. Donc, ce que je vais faire, c'est reconstruire à nouveau mon image, puis accéder à ma première application, la plus récente. Je vais donc remplacer cette balise en utilisant la commande docker build. Et oups, j'ai oublié le point négatif. Donc, dans ce cas, cela va prendre un peu plus de temps car nous devons maintenant exécuter ce système d'installation pip. Donc, auparavant, nous ne l'exécutions pas, mais maintenant nous l'exécutons. Il doit donc exécuter ce processus qui doit télécharger et installer toutes les dépendances, installer toutes les dépendances jusqu'à ce que ce soit un peu plus lent, mais nous pouvons voir toutes les étapes précédentes ici, nous sommes en fait mis en cache et ils fonctionnent donc très, très rapidement. Et une fois que c'est fait , cela devrait être fait en une seconde. Oui, on y va. Maintenant que nous avons ce déversement, nous pouvons lancer Docker Run. Et nous allons donner notre nom, qui sera ma première application, la plus récente. Et réutilisons le même nom, qui sera notre première application. Nous voulons donner l'étiquette nominative ici. Nous allons rencontrer un problème car il se plaint que ce nom est déjà utilisé. Et nous aborderons ce problème dans une seconde. Mais pour l'instant, utilisons simplement un nom différent, par exemple comme celui-ci. Ce nom est désormais différent de celui-ci. Donc ça devrait aller. Mais nous aborderons ce problème dans une seconde. Alors allons-y et exécutons-le. Et ça va être, nous pouvons voir ici la commande que nous avons l'habitude de voir , à savoir que notre application démarre. Mais maintenant, voici le truc. Si nous essayons d' y accéder, nous cliquons ici. Nous n'y avons pas réellement accès. Ce qui est évidemment nul, car idéalement , même localement, nous voulons pouvoir utiliser Docker pour notre développement. De cette façon, nous pouvons être extrêmement sûrs que ce que nous exécutons localement sur notre machine correspond exactement à ce qui sera exécuté dans le Cloud plus tard. Nous n'allons pas rencontrer de problèmes liés à des éléments qui ne sont pas correctement installés ou qui ne sont pas disponibles. C'est donc ce que nous allons examiner maintenant. Très bien, donc je suis touché ici, contrôle C pour le tuer. Et maintenant, ce que je vais faire, c'est d'abord utiliser ce tag hôte Dash, Dash. Donc, plutôt que de l'exécuter sur 127 points, zéro point, point un, à la place, je vais l'exécuter sur 0000, qui signifie simplement que cela acceptera n'importe quelle interface provenant, ce qui la rendra simplement plus général, ce qui est encore une fois intéressant parce que nous ne voulons pas spécifier d'adresse précise, mais en gros, nous voulons simplement la créer, tant que nous y allons, nous voulons y avoir accès. Nous allons donc utiliser cet hôte à la place. Et maintenant, nous allons également définir un port spécifique que nous voulons utiliser pour des raisons de cohérence. Je vais donc utiliser les ports 80, 80 ici, par exemple, mais vous pouvez également en utiliser différents. Mais pour ce cas, je vais utiliser les ports 80, 80. Et maintenant, si nous reconstruisons notre image, il suffit de faire défiler la page vers le haut, de la reconstruire et d'attendre la fin du processus. Vous voyez que la plupart de nos couches sont mises en cache parce que la seule modification que nous avons apportée était en fait ici. Tout le reste a déjà été fait. rechargons donc essentiellement toutes ces étapes à partir de l'argent. Et maintenant, je vais juste attribuer un nouveau nom pour l'instant, puisque nous avons déjà eu cette collision de noms, que nous examinerons dans une seconde et cliquerons sur Exécuter. Très bien, maintenant nous pouvons voir qu'ici fonctionnent sur cet hôte et que nous fonctionnons sur ce port. Mais quand même, si je vais ici, on ne peut toujours pas y accéder. Et c'est parce que notre application s'exécute dans ce conteneur et qu'elle n'a actuellement pas accès au monde extérieur, même sur notre propre machine. Donc, ce que nous devons faire, c'est que dans notre commande Docker Run, je vais utiliser le drapeau moins P. Et cela va nous permettre de faire des redirections de port. Lorsque nous sortons de notre machine et que nous la regardons depuis notre port, elle l' achemine vers un port spécifique notre conteneur en cours d'exécution, par exemple je vais dire le port avant 808-02-8080 dans le récipient. Et de cette façon, maintenant que je lance ce nom existe déjà, vous devez changer ce nom pour le moment. Quand j'irai ici. Maintenant, il sera disponible. Et nous pouvons voir si nous allons sur la page des documents, aurons la documentation disponible car nous sommes sur le port 80. 80, qui est en fait acheminé vers le port à conteneurs. Maintenant, pour vous le montrer à nouveau, utilisons des chiffres différents ici. Utilisons le port 8 000, que nous allons transférer vers, oups, ce n'est pas ce que je voulais. 8 000, qui seront acheminés vers les ports 80, 80 et notre conteneur. N'oubliez donc pas que dans notre conteneur, l'application s'exécute sur le port 80, 80, mais à l'extérieur, nous allons la transférer depuis le port 8 000. Donc, si je lance ça, j'ai repris le nom. Je suis en train de le gérer. Si je clique ici, nous allons maintenant avoir un problème car rien ne fonctionne sur le port 80. 80. Mais si j'utilise le port 8 000, alors nous serons redirigés vers le port 80, 80 dans notre application. Ce n'est donc pas important. Oups, affiche à nouveau la commande. C'est une étape importante que nous devons franchir , car nous allons expédier ce que nous avons sur notre machine, nous permettant ainsi d' entrer dans le conteneur. Très bien, passons maintenant à ce problème de dénomination ici. Si nous utilisons cette commande docker ps, nous pouvons examiner tous les conteneurs en cours d'exécution, qui n'existent actuellement pas. Mais si je lance celui-ci à nouveau, le nom à nouveau. D'accord, si je lance celui-ci à nouveau, j'ouvre un nouveau terminal ici. Et attendez que cela finisse de préparer. Je vais sortir de mon environnement virtuel. Maintenant, si j'utilise à nouveau la commande, docker ps, nous pouvons voir ici que nous avons celui qui exécute le conteneur. Nous pouvons voir ici que c'est la commande qui est exécutée à l'intérieur. C'est la redirection de port que nous sommes en train de faire. Il s'agit du nom du conteneur en cours d'exécution. Quand il a été créé. La statistique est que nous devons ajouter l'image qu'il exécute. Dès qu'on aura tué. Il. Je peux le voir ici maintenant, il a également disparu. Mais si nous voulons examiner tous les conteneurs disponibles, nous retournerons à notre ancien terminal. Nous pouvons utiliser ce docker, ps dash, dash all, qui nous montrera tous les conteneurs que nous avons. Nous pouvons donc le voir ici, c' est le premier que nous avons créé. Ensuite, nous avons le deuxième, le troisième, le quatrième, le cinquième 161. Donc, ce que nous pouvons faire, c'est que si nous avons ces vieux conteneurs, lieu de simplement rester là à prendre de la place, nous pouvons les supprimer si nous le voulons, ce que nous pouvons faire en utilisant Docker Remove. Ensuite, nous allons spécifier l'ID du conteneur ici. Je vais donc appuyer sur Entrée et cela va le supprimer afin que nous puissions voir si je l'imprime à nouveau. Celui-ci est maintenant parti. Et je vais le faire pour celui-ci aussi. Et faisons-le également. Imprimons ceux-ci à nouveau ici. Et pour rendre cela un peu plus rapide, supprimons plusieurs. On y va. Je les imprime. Maintenant, nous pouvons voir qu'il ne nous reste que cinq applications, qui ne fonctionnent plus non plus. Donc, si nous voulons supprimer celui-ci, nous pouvons également supprimer Docker. Donc maintenant, nous n'avons plus de conteneurs et AlphaGo revient à, par exemple ou lancez une commande. Nous pouvons réutiliser le même nom car aucun conteneur ne lui est actuellement associé. Encore une fois, ça va fonctionner. Il y a cependant encore d'autres commandes ici que vous utiliserez probablement l'une d'entre elles. Et ce que je vais faire ici, c'est simplement enchaîner deux commandes. Donc, en fait, je dois d' abord obtenir son identifiant de conteneur et je vais le supprimer. Très bien, nous allons regarder ça dans une seconde. Mais d'abord, une chose qui va probablement faire est ce que nous ne voulons pas c'est que nous ne voulons pas que notre terminal soit bloqué par cela parce que nous voulons toujours pouvoir faire autre chose. Il y a donc un vol que nous pouvons utiliser, qui est ce minus d, qui va l'exécuter en tant que processus démon, ce qui signifie qu'il s' exécutera simplement en arrière-plan. Cela ne supprimera pas cet espace terminal au premier plan. Donc, si nous l' exécutons, nous pouvons voir ici maintenant si nous utilisons Docker PS, nous avons un conteneur en cours d'exécution. Et si nous accédons à notre navigateur Web, je clique sur Actualiser ici, alors nous pouvons voir. Que notre application est effectivement en cours d'exécution. étaient les autres, donc je vais juste les fermer. Celui-ci ne devrait pas non plus être en cours d'exécution car il est très important. Alors maintenant, nous allons juste courir en arrière-plan. Maintenant, la question est peut-être de savoir comment l'arrêter de fonctionner auparavant, nous pouvions appuyer sur Control C. Ce que nous pouvons faire maintenant, c'est utiliser la commande docker, tuer et donner l'identifiant du conteneur, appuyer sur Entrée. Et maintenant, si nous réessayons, notre application ne fonctionne plus. Nous ne pouvons voir ici aucun conteneur en marche. Et j'ai toujours le conteneur disponible. Je vais donc supprimer celui-ci. Comme ça. Nous pouvons également le faire en utilisant l'interface utilisateur du bureau si nous le voulons. Donc, si nous retrouvons celui-ci ici et que nous exécutons maintenant notre conteneur comme ceci, nous revenons à l'interface utilisateur. Nous pouvons voir ici maintenant que nous avons un conteneur en marche. Si nous le voulons, nous pouvons cliquer dessus. Nous pouvons en fait voir le résultat ici. Il y a des trucs avec lesquels tu peux jouer si tu le souhaites. Chaque fois que nous serons prêts. Je veux dire, nous avons vu comment nous pouvons le faire via le terminal. Si vous souhaitez utiliser l'interface, si vous voulez l'arrêter, par exemple, vous pouvez appuyer sur Arrêter ici, ce qui l' empêchera de fonctionner. Donc, si vous avez un docker ps, nous pouvons voir qu'il n'y a pas de conteneurs en cours d'exécution ou faire du docker ps moins, moins tout. Mais vous voyez que le conteneur est toujours disponible ? Et si nous cliquons sur Supprimer ici, par exemple , nous supprimerons également notre conteneur. C'était donc notre premier aperçu de Darker. Et je sais que nous avons couvert beaucoup de choses. Mais nous sommes arrivés à un point très intéressant, car nous pouvons maintenant exécuter correctement tout notre code, sauf pour apporter des modifications, auquel cas nous devons encore reconstruire. Mais nous pouvons vraiment exécuter notre application sur une image Docker, ce qui est génial car ce seront les spécifications exactes qui seront exécutées lorsqu'elle exécutée dans un environnement cloud quelque part. Nous savons donc que tout ce qui fonctionne ici est essentiellement la façon dont il fonctionnera lorsqu'il fonctionnera ailleurs. Ce qui est extrêmement bien car maintenant nous avons beaucoup de cohérence dans notre système et nous n'avons pas à nous soucier de la façon dont k, mais il fonctionne sur ma machine. Est-ce qu'il fonctionnera vraiment ailleurs ? Si nous utilisons des images Docker, nous savons que même si nous voulons les donner à un collègue, il peut les télécharger. Ils peuvent créer l' image Docker qui peut l'exécuter. Et ils vont voir exactement les mêmes choses que nous. Maintenant. De toute évidence, Darker est un logiciel très cool et il y a beaucoup de choses qui l'accompagnent. Et nous n'allons pas tous les couvrir. Nous allons également étudier Docker Compose. Il y a donc certaines choses que nous pouvons faire dans le noir que nous n'allons pas examiner ici parce que certaines choses que nous ferons en utilisant Docker Compose, par exemple, mais même avec cela, évidemment Il y a beaucoup de choses concrètes dans lesquelles vous pouvez vous lancer. Des choses vraiment sophistiquées et complexes pour avoir un système vraiment cool. Mais dans la plupart des cas, à toutes fins utiles, ce que nous faisons actuellement, c'est essentiellement ce que vous allez en avoir besoin ou que vous allez faire lorsque vous construisez et gérez applications d'accompagnement. Et si jamais vous avez besoin de choses spécifiques, que vous rencontrez des problèmes spécifiques à ceux de Google ou quel que soit votre moteur de recherche préféré, il vous aidera probablement le plus rapidement possible parce que vous savez exactement ce que vous recherchez, les éléments de base de ce que vous pouvez faire et ensuite vous pouvez le faire rapidement Il y a des trucs autour de vous. Mais oui, plus sombre encore une fois, c'est très , très important, très courant. Tout mon code que j' exécute essentiellement s' exécutera avec des couleurs plus sombres et d'une manière ou parce que c'est tellement agréable d'avoir cette cohérence d'avoir cette image que nous pouvons simplement déployer quelque part et je sais exactement comment ça va fonctionner. Et vous pouvez le donner à un collègue et il pourra l'exécuter sur sa machine et vous 4. Construction multi-étages: Nous avons donc déjà vu comment créer nos images Docker. Dans cette leçon, nous allons passer en revue certaines bonnes pratiques et l'adaptation est que vous pouvez effectuer sur cette image Docker que nous créons avec ce modèle d'image Docker que nous créons pour créer un récipient hors de. Et essentiellement, ce sont des choses que vous verrez très probablement utilisées dans de très nombreux endroits. Et juste en général. Tout d'abord, en guise de remarque, vous verrez probablement que si vous utilisez PyCharm, vous allez recevoir une sorte de demandes d'installation de plugins pour Docker. Si vous le souhaitez, vous pouvez simplement cliquer sur installer le plugin. Il y aura comme une barre bleue et je vais juste ajouter peu de formatage comme vous pouvez le voir ici. Mais si vous ne le souhaitez pas, vous pouvez simplement cliquer sur Ignorer. Mais pour faire une petite remarque, vous verrez probablement cette barre contextuelle. Quoi qu'il en soit, donc pour ces améliorations, vous allez voir cela généralement beaucoup. Et nous allons voir si nous allons d'abord créer un utilisateur. Cet utilisateur va nous aider car nous ne voulons pas faire fonctionner l'ensemble de notre système en tant qu' utilisateur root à la fin. Mais au contraire, si nous l'exécutons en tant qu' utilisateur avec des privilèges réduits, cela peut nous aider. Parce que si jamais notre image Docker ou un conteneur Docker est attaqué, l'utilisateur qui le pirate l'utilisateur qui le pirate n'aura pas un accès complet au système, mais un accès réduit, ce qui est bien. L'autre point, c'est que nous allons le considérer comme des constructions en plusieurs étapes. Et cela nous aide simplement à réduire la taille de l'image finale que nous allons afficher, ce qui contribue simplement à réduire la taille. Donc oui, et pour faire une remarque générale, pour les choses les plus sombres, nous allons passer en revue cela étape par étape afin que vous compreniez ce que nous faisons. Mais la plupart du temps vous aurez une sorte de modèle. Si vous travaillez dans une organisation, vous pouvez probablement être sûr qu'elle dispose d'une sorte de modèle Docker que vous pouvez utiliser pour travailler. S'ils n'en ont pas un officiel, vous pouvez simplement consulter un autre référentiel et l' utiliser comme modèle adapté à vos besoins. Et sinon, si vous savez ce que vous recherchez, il existe de nombreux modèles d'outils en ligne que vous pouvez utiliser pour ne pas avoir à mémoriser ces éléments par cœur. Vous allez probablement utiliser des modèles pour cela. Tu as juste besoin de savoir ce que tu veux, pourquoi c'est là. Et s'il manque quelque chose, ajoutez-le essentiellement. C'est donc ce que nous allons parcourir à partir de zéro. Mais la plupart du temps, lorsque vous le faites, vous pouvez l'écrire vous-même. Mais il est également facile d'utiliser un modèle car la plupart du temps, vous ferez des choses très similaires. Très bien, commençons par ajouter notre utilisateur. Nous allons donc ajouter une autre commande d'exécution ici. Et nous allons faire Ajouter un groupe moins S. Pour ajouter cela, nous allons créer un groupe dans lequel nous allons ajouter notre utilisateur dans une seconde. Nous allons l'ajouter à notre système. Et je vais juste appeler ce groupe mon application, mais tu peux l'appeler comme tu veux. Ensuite, nous utilisons ceci et, et qui nous permet d' enchaîner des commandes. Nous allons donc d'abord exécuter celle-ci, et maintenant nous allons exécuter une autre commande après celle-ci, qui sera add user. Et nous allons également en faire un utilisateur de notre système. Nous allons l'ajouter à notre groupe « Mes applications ». Nous allons donner à cet utilisateur le nom d'utilisateur, et nous allons également lui attribuer un identifiant. Faisons juste 1234. Maintenant, si nous voulons tout exécuter en tant qu'utilisateur, nous allons utiliser cette commande utilisateur Docker. Ensuite, nous pouvons soit donner le nom que nous avons attribué ici, soit nous verrons dans une seconde, nous verrons tous l'identifiant. Et ce que cela va faire, c' est rechercher cet utilisateur dans le système, et il va trouver cet identifiant. Et puis la prochaine commande ou point d'entrée que nous aurons, il s'exécutera en utilisant cet utilisateur à la place. qui est bien parce que nous ne l'exécutons plus Ce qui est bien parce que nous ne l'exécutons plus en tant qu'utilisateur root avec un accès complet, mais avec un accès réduit. Alors allons-y et faisons en sorte que cela fonctionne. Nous allons commencer par la version de Docker, moins t. Nous allons faire mon application la plus récente. Et en fait, je vais aussi l'utiliser et la main ici pour que vous puissiez voir ce qu'il fait. Mais essentiellement, nous l'exécutons d' abord. Et si, si cela fonctionne, alors nous allons passer à la prochaine étape ici. Et ça va être Docker, courez. Signez-lui un nom, mon test AP. Et nous pouvons cartographier les ports comme nous l' avons appris précédemment et l'image sur laquelle nous allons exécuter mon application, la plus récente, qui sera celle-ci ici. Appuyez sur Entrée. Maintenant, cela devrait être relativement rapide car les choses devraient être mises en cache et nous n'avons ajouté que deux commandes supplémentaires tout en bas, nous pouvons voir ici que le processus de construction s'est déroulé très rapidement. Et nous voilà en train de courir, et tout fonctionne correctement. C'est tellement excellent. Très bien, allons-y et éteignons ça. Contrôle C. Et oui, passez à la partie construction en plusieurs étapes. Et ici, nous allons ajouter d'autres modifications, que nous verrons dans un instant. Donc, la première chose que nous allons faire est de ne pas commander cela. Nous allons en fait lui attribuer un alias et nous l'appellerons notre base. Et ici, nous allons essentiellement faire notre installation et notre configuration. Et puis dans peu de temps, comme nous allons le voir, nous allons copier des éléments de cette base que nous avons créée dans notre image courante principale. Et maintenant, tout ce qui ne sera pas le dernier que nous utiliserons ne sera temporaire, puis il sera jeté, ce qui est bien parce que cela signifie tout ce que nous n'intégrons pas dans notre image finale sera jeté et elle ne prendra pas de place. Très bien, nous créons donc notre image de base ici. Alors maintenant, la première chose que nous voulons faire est toujours d'installer pip nth. Et maintenant, plutôt que parce que la première chose que nous voulons faire ou tout l'intérêt de ces images de base, nous voulons essentiellement installer certains de nos éléments. Donc ce que je vais faire, c'est prendre ça ici, je vais couper, je vais le mettre ici. Mais je n'ai pas besoin du fichier principal pour le moment parce que je veux juste notre fichier PIP et notre verrou de fichier PIP. Parce que je veux juste faire l'installation. Je vais juste pour l'instant créer une commande de copie supplémentaire ici. Et je vais prendre cette partie et la déplacer ici, et nous y reviendrons plus tard. Donc pour l'instant, je vais juste copier ou pip fichier, puis verrouiller le fichier pip. Sinon, nous pouvons utiliser le fichier pip star, qui recherchera tout ce qui correspond à ce format. Donc tout ce qui a un fichier pip à l'avance , puis tout fichier qui a quelque chose après cela. C'est donc par exemple que nous allons faire correspondre le fichier pip et le fichier pip point loc. Et si nous en avions un autre, comme pip file, file, cela correspondrait également à cela. Mais ça, oups, ce n'est pas ce que je voulais. Nous pouvons utiliser celui-ci ou l'autre. Mais ce n'est qu'un raccourci. Très bien, donc nous copions notre fichier PIP. Et maintenant, la prochaine chose que nous voulons faire est de lancer cette installation. Parce que nous voulons exécuter cette image créée et notre image de base. Ensuite, nous allons copier les fichiers installés afin de n' avoir aucun, rien d'autre. D'accord, donc nous allons conserver une syntaxe similaire, mais changer les choses un peu. Nous allons donc garder notre pip pour l'installer. Nous allons faire une installation à l'échelle du système. Rocks va ajouter un autre vol ici, qui sera le drapeau de déploiement. Et si vous voulez savoir à quoi servent ces drapeaux en particulier, nous pouvons, parce que nous avons installé pip, utiliser pip install moins h. Et cela va en fait afficher une recherche d'aide, qui vous donnera toutes les commandes accessibles. Nous pouvons donc voir si nous allons sur le système, par exemple nous allons l'installer uniquement sur notre système ou le déployer. Donc, cela va être une bonne chose parce que essentiellement, si quelque chose ne va pas, comme nos fichiers journaux sont obsolètes ou que la version de Python est incorrecte, cela va être abandonné. Ce qui est bien parce que nous voulons simplement nous assurer que tout fonctionne comme décrit. Donc, si quelque chose ne va pas ici, ça va tout simplement avorter. Ensuite, nous allons ajouter un autre drapeau qui sera d'ignorer les boucles de fichiers PIP. Ce qui signifie que nous allons construire spécifiquement à partir de l'écluse. Très bien, donc ce sera notre installation pip, qui est un peu différente, mais qui reste très similaire à ce que nous avions auparavant. Il y a encore quelques modifications à apporter ici dans une seconde, mais nous y reviendrons lorsque nous y arriverons. Nous allons maintenant ajouter un autre formulaire et nous allons tirer exactement de la même image ici. Et puis ici. Maintenant, nous allons, eh bien, nous voulons copier. Le fait est que nous l'avons déjà installé ici afin que tous les packages que nous avons installés soient copiés dans notre image principale dont nous aurons besoin. Maintenant, pour le faire correctement, il y a plusieurs choses que nous devons faire. Donc, tout d'abord, nous allons ajouter quelques variables d'environnement. En fait, pour Docker, nous pouvons simplement utiliser ce mot clé end qui va définir des variables d'environnement pour nous. Donc, la première variable d' environnement que je vais utiliser sera notre racine pi. Et je vais le définir pour avoir cette valeur racine de slash pi. Et cela va essentiellement, nous allons l'utiliser dans une seconde pour dire où nous voulons également installer les choses. Ensuite, nous allons créer une variable de base utilisateur Python. Maintenant, cette variable est importante car elle nous indique ou indique au système le répertoire de base de l'utilisateur. Et nous allons définir cette valeur cette variable d' environnement pirate. Et je peux référencer la valeur contenue dans cette variable en utilisant le signe dollar puis le nom de la variable. Si je le souhaite, je peux également le mettre entre crochets, ce qui peut être utile s'il y a d'autres éléments joints par la suite. Maintenant, ce que nous avons fait, c'est que nous avons défini cette variable d'environnement à cette valeur. Et nous avons défini cette variable d'environnement en fonction de la valeur qu'elle contient. Nous allons maintenant utiliser une autre variable d'environnement, qui sera le chemin. Maintenant, le chemin se trouve essentiellement une liste d'endroits où notre système d'exploitation recherchera des exécutables. Et comme nous allons procéder l'installation dans ce répertoire, nous voulons nous assurer de l'ajouter la liste des fichiers détectables pour rechercher des exécutables. Pour. Donc, pour ce faire, nous allons référencer notre variable path existante, et y ajouter nos pirates. Slash bin directory, en particulier parce que c'est là que vont vivre nos cuticules d'exécution. Encore une fois, comme je l'ai mentionné précédemment, vous n'avez pas à comprendre cela comme à l'envers. Vous n'avez pas besoin de pouvoir le reproduire par mémoire. Le fait est que vous comprenez pourquoi nous prenons ces mesures. Ici. Nous l'ajoutons parce que nous avons besoin d'une sorte de répertoire utilisateur de base où seront placées nos installations. Maintenant que nous ajoutons des installations, nous voulons également nous assurer que les exécutables peuvent être trouvés par système d'exploitation. Ce sont essentiellement les mesures que nous prenons ici. Et si nous ne prenons pas ces mesures, vous verrez. Et on peut essayer ça en une seconde. Ça ne va pas fonctionner. Il est donc important pour nous d'ajouter ces étapes pour qu'il fonctionne correctement. Et tout ce que nous faisons ici, c'est simplement créer des variables d' environnement. Très bien, nous avons donc notre installation de pip, extrémité de pip, que nous allons garder la même chose. Nous voulons donc toujours installer pip end. Nous allons copier nos fichiers Pip. Et maintenant, nous allons ajouter un drapeau supplémentaire devant ici. Ou nous allons définir notre variable d'environnement pour cette commande. Et nous allons définir la variable d'environnement utilisateur ici pour en avoir une. qui signifie qu'il va traiter cette installation comme une installation utilisateur. Ce qui signifie essentiellement les informations de localisation des utilisateurs que nous avons définies ci-dessus. Je vais prendre effet. Nous venons donc de le mettre à jour traiter désormais comme une installation utilisateur. Et voici la première partie. C'est donc en cela que sera composée notre base. Et encore une fois, le but est ici, c'est de faire la configuration. Et si vous avez besoin d'installer d'autres dépendances, vous devez le faire dans le composant de base. Donc, en installant tout ce dont nous avons besoin et que nous pouvons ensuite utiliser pour installer d'autres choses. Tout ça va entrer ici. Nous allons maintenant avoir notre deuxième stage Docker. Ici. Nous allons en fait assembler notre image finale et nous allons prendre en charge ce dont nous avons besoin à partir de là. Et tout ce que nous n'allons pas reprendre sera en fait jeté à la fin, ce qui est bien parce que cela nous permet de gagner un peu d'espace car nous ne prenons pas en charge des choses inutiles. Nous allons en fait définir ces trois variables exactement de la même manière ici. Je vais donc juste les copier. Maintenant, la prochaine chose que je vais faire est de prendre cette commande utilisateur. Et nous allons déplacer cela ici. Parce que lorsque nous faisons notre copie en une seconde, je veux vraiment m' assurer d'attribuer ces fichiers spécifiquement à l'utilisateur. Mais avant cela, nous allons avoir une commande de copie ici parce que nous voulons d'abord récupérer tous nos packages que nous avons installés avec notre PIP n dans cette image. Maintenant, je vais utiliser un CH own. Et ici, nous allons d'abord définir le groupe. Donc, le groupe ici est mon application, et il devrait être égal, pas deux points. Le côlon va ici. Ce sera donc le groupe, et ce sera l'utilisateur. Et nous allons ajouter un autre drapeau à partir de la base. Cet espace fait référence à cet alias que nous avons ici. Maintenant, nous allons copier le contenu du répertoire des pirates, de notre base vers notre répertoire pirate sur cette image. Donc, en gros , nous copions maintenant tous ces éléments que nous avons installés ici avec l'installation pip, nous copions tous ces paquets dessus parce que nous en avons besoin, parce que nous avons besoin ces éléments installés pour exécuter notre application. Et cette commande, cette syntaxe, ici, est quelque chose de spécial que nous pouvons ajouter pour Docker et les intérêts, signifie la copier et attribuer les privilèges pour ces éléments copiés à notre utilisateur. ici. Et c'est de là que nous voulons copier. Bien, maintenant que nous avons copié tous les packages que nous avons besoin d'installer, je vais les garder cette année parce que nous allons conserver notre répertoire. Je vais conserver notre attribution du répertoire de travail. Et plutôt que de simplement les copier directement, je vais maintenant les copier avec les privilèges attribués à cet utilisateur. Comme ça. Oui, c'est ça. C'est ça. Il s'agit de notre commande Docker mise à jour. Et exécutons-le pour nous assurer que cela fonctionne. Et puis revenons-en une fois de plus. Je vais donc, d'abord, supprimer l'image que nous avons affichée précédemment, est-à-dire oui, c'est le nom que nous lui avons attribué. Je dois donc d'abord supprimer celui-ci. Et je vais en fait l' utiliser et encore ici. Et ce que je vais faire, c'est parce que cela m'aide à le faire fonctionner plusieurs fois. Si tout passe, je vais supprimer l'image que j'ai créée précédemment. Cela ne fonctionne évidemment que si j'ai abord exécuté ces deux commandes. Mais une fois que j'ai lancé ce Docker, je veux juste le lancer avec le même nom encore et encore. Je vais supprimer cette image « désolé, pas » existante. Je vais retirer ce conteneur existant. Je vais créer une nouvelle image à partir de notre modèle de fichier Docker. Attribuez le même tag. Je vais exécuter cette image en tant que nouveau conteneur sous ce nom. Essayons donc ça. OK ? Nous pouvons donc voir ici que deux étapes différentes se déroulent également. Nous avons une étape de base et nous avons notre étape finale. Et nous y voilà. Heureusement, notre système fonctionne toujours. Mais nous avons intégré certaines bonnes pratiques en matière de presse plus sombre. Nous ne fonctionnons plus en tant qu'utilisateur root. Au lieu de cela, nous utilisions en tant qu'utilisateur que nous avons créé avec des privilèges réduits. Et il y a aussi une étape qui, pour nous, n' aura probablement pas d'impact aussi important. Mais une fois que vous avez besoin d'installer d'autres éléments binaires pour vous aider à installer d'autres bibliothèques, comme d'abord, vous devez installer certaines choses pour pouvoir en installer d'autres. Cela vous aidera car les éléments que vous avez installés précédemment, une fois que vous aurez installé votre bibliothèque, vous n'en aurez peut-être plus besoin. Donc, ce processus va juste vous aider car essentiellement, la plupart des éléments de configuration que nous pouvons avoir besoin d'installer, mais que nous n'avons peut-être pas réellement besoin fois l'installation terminée, nous pouvons nous débarrasser de tout cela. Donc, tout ce que nous ne reproduisons pas spécifiquement dans cette dernière étape. Il s'agit actuellement de notre dernière étape. Tout cela, y compris. Tout ce qui n'est pas copié ici sera jeté. Cela va donc nous aider à économiser de la mémoire. Et oui, il s'agit d'une construction en plusieurs étapes avec des éléments supplémentaires en cours d'exécution en tant qu'utilisateur, nous pouvons également le modifier à la place pour utiliser l'identifiant utilisateur que nous lui avons attribué ici. Et réexécutons-le pour nous assurer que cela fonctionne toujours. Si vous recherchez des modèles Docker, à la fois au sein d'une organisation ou en ligne ils suivront un format similaire à celui-ci. Ils peuvent avoir quelques différences quelque part, mais l'objectif principal est d'avoir une image de base et vous verrez souvent aussi comme une image de base. Vous verrez ensuite une image de générateur où se déroule réellement le processus de construction. Ensuite, vous verrez l'image finale laquelle les éléments sont copiés. Il peut y avoir plus de deux étapes, mais c'est la même idée de faire la configuration, puis de copier tout ce dont nous avons besoin et de supprimer le reste pour créer nos images finales un peu plus petit afin de ne pas utiliser de mémoire inutile dans nos images. fait que nous ne voulions essentiellement pas installer des éléments que nous n'allons pas utiliser est le but de tout cela. D'accord ? Donc, oui, il y a encore une optimisation que nous pouvons faire, ce que je vais faire maintenant. Nous avons deux étapes ici. Et en général, un bon objectif est d'avoir le moins d' étapes possible. Donc, ce que je vais faire, c'est qu'au lieu d' avoir le point principal py à l'extérieur, je vais le déplacer dans notre application ici. Comme ça. Copiez ceci. Et dans notre pot principal ici. Notre application est toujours définie ici. Et je ne pense pas que nous ayons vraiment besoin de changer quoi que ce soit ici, ce qui est formidable. Mais maintenant, dans notre fichier Docker, nous en avons besoin, nous pouvons maintenant essentiellement le supprimer. Nous pouvons également supprimer l'une de ces applications car maintenant tout sera contenu dans notre dossier d'applications ici. Nous pouvons également supprimer cette application si nous le voulons. Ou bien, on pourrait laisser ça dedans et le faire comme ça. Et créons-le et exécutons-le une fois de plus. Et j'espère avoir correctement mis à jour toutes les références. Je vais prendre un peu plus de temps car nous avons apporté quelques modifications à notre code ici. Et donc, à un moment donné, avant la copie, Oh, d'accord. Laissez-moi découvrir rapidement ce qui se passe ici. Main.py. Eh bien, je pense que c'est juste essayer comme ça. Et maintenant, je dois mettre à jour mon point d'entrée ici parce que notre répertoire de travail est supérieur d'un niveau. Je dois donc m'assurer d'aller dans ce dossier, puis de l' exécuter à partir de là. Oui, encore une fois. troisième ou une troisième fois, c'est un charme. Très bien, on y va. Donc, au cours de ces étapes, nous avons pu réduire d'une seule le nombre d'étapes que nous avons dans notre fichier Docker, ce qui est bien. Et en gros, nous avons simplement dû modifier certains des fichiers que nous avons créés dans certaines références de son nom ici pour nous assurer que tout est au bon endroit, que nous sommes en le référençant depuis le bon endroit. Maintenant, nous sommes essentiellement à ce niveau. Ici, nous allons dans notre dossier d'applications, dans notre dossier d'applications, nous référençons le fichier principal. Et ici, nous faisons toujours référence à cette application, cette application initialisée que nous avons créée ici. Donc, le processus est toujours le même, mais nous l'avons en quelque sorte mis dans une seule chose ici. Nous avons réduit le nombre de pas de nos États d'un, ce qui est tout simplement mieux. Moins vous avez de marches, mieux c'est. C'est juste une bonne chose générale à viser. Maintenant, avant de terminer cette leçon meilleures pratiques de Docker, nous avons remarqué que nous voulons également ajouter notre utilisateur équivaut à un vol ici, car nous voulons nous assurer que tous les sur les meilleures pratiques de Docker, nous avons remarqué que nous voulons également ajouter que notre utilisateur équivaut à un vol ici, car nous voulons nous assurer que tous les les installations que nous faisons vous aurez le même niveau d'utilisateur afin de ne pas installer certaines choses sur notre système et d'autres sur notre utilisateur. De plus, j'ai également remarqué une petite faute de frappe, à savoir que cela devrait être l'utilisateur d' abord, puis le groupe. Corrigons donc rapidement cela aussi. Et nous y voilà. 5. Compose de Docker: Très bien, nous avons donc précédemment approfondi ce fichier Docker et l'avons restructuré de manière à mieux suivre les meilleures pratiques. Nous allons maintenant jeter un œil à Docker Compose, car actuellement lorsque nous utilisons un fichier Docker, qui construit le fichier unique, puis nous l'exécutons. Mais en fait, ce qui sera bien et ce que vous verrez aussi lorsque nous y reviendrons plus tard, lorsque nous ajouterons des bases de données, de la mise en cache, etc. c'est que nous ne voulons pas seulement que notre application fonctionne, nous voulons aussi avoir un base de données en cours d'exécution que nous pouvons utiliser avec notre application. Et nous voulons probablement aussi avoir un cache séparé exécution que nous voulons utiliser avec notre application. Et donc pour pouvoir configurer l'ensemble ce système que nous pouvons réutiliser. Et il y a en fait beaucoup de choses intéressantes que vous pouvez configurer et bon, c'est un sujet approfondi à approfondir et nous n'allons évidemment pas tout couvrir, mais nous allons passer en revue les points principaux. Et au fur et à mesure que nous y reviendrons plus tard dans ce cours, nous allons également toucher à nouveau ce Docker Compose et y ajouter des composants. Par exemple, la base de données l'argent dont je viens de parler. Mais le fait est que parfois, nous ne voulons tout simplement pas gérer une chose isolée, mais nous voulons gérer plusieurs choses et peut-être ces choses ou même connectées. Pour nous faciliter la tâche, nous allons utiliser Docker Compose. Nous allons donc commencer par créer un nouveau fichier ici. Et je vais appeler cela Docker Compose. Un Docker, Compose point YAML, comme celui-ci. Si Docker est installé, Docker Compose doit également être installé. Tout devrait donc déjà être configuré pour vous. Très bien, nous allons d'abord écrire un code squelette , puis nous allons expliquer ce qui se passe. Et essentiellement, la première chose que nous allons essayer de faire est essayer de reproduire ce que nous avons connu avec dark. Mais maintenant, au lieu d' utiliser Docker Compose, nous voulons simplement disposer du même service qu' un conteneur Docker auquel nous pouvons toujours accéder via notre navigateur Web. Donc, la première chose que je dois définir ici est la version que nous allons utiliser de la syntaxe que nous allons utiliser ici, version 3. Ensuite, nous allons définir les services qui s' exécutent ici. Vous pouvez voir que j'ai installé le plugin Docker. Donc, certains de ces trucs se remplissent automatiquement. Si vous ne l'avez pas installé, il ne le sera pas. Et si vous avez toujours cette notification ici, le moyen le plus simple est évidemment d' appuyer sur Installer le plug-in et il l' installera pour vous. Mais encore une fois, pas vraiment nécessaire. Cela aide simplement, aide au remplissage automatique et à d'autres choses. Mais oui, d'accord, nous allons donc définir ici les différents services qui s'exécutent. L'un de ces services, par exemple , sera votre application. Nous allons définir un service. Je vais lui donner le nom app. Nous pouvons l'appeler comme nous voulons, mais je vais lui donner le nom d'application juste pour qu'il soit clair de quoi il s'agit. Et maintenant, nous allons définir plus en détail certains de ses aspects. Donc, la première chose que je voulais trouver est, comment puis-je créer cette application ? Quel est le fichier Docker que nous devons référencer ? Dans certains cas, il se peut que nous fassions référence un fichier Docker qui se trouve sur Docker Hub. Et dans d'autres cas, nous voulons référencer un fichier Docker ici que nous avons. Je vais donc avoir ce paramètre de facture et je vais juste le pointer vers le répertoire actuel. Donc, il suffit d'utiliser un seul point pour cela. Maintenant, l'autre chose que je veux faire pour y accéder, ce que nous avons également fait précédemment, c'est de définir les mappages de ports. Donc Docker, nous utilisons ce moins p ici. Nous allons faire en sorte que ce soit un port. Et nous pouvons voir ici qu'il le remplit déjà automatiquement pour moi. Mais en gros, nous aurons un côlon après. Nous allons prendre une nouvelle ligne. Ensuite, nous allons avoir un tiret qui indique que ce sera un tableau. Nous pouvons donc faire plusieurs mappages de ports car nous n'allons utiliser qu'un seul mappage de port, ici sera à nouveau du port 80 au port 80, 80, comme ceci. Et ici, nous pouvons voir que nous commençons cela sur les ports 80, 80. Nous voulons donc nous assurer que notre port externe est mappé vers le port d'aperçu approprié. La même chose que celle que nous avons abordée lorsque nous avons exécuté le fichier Docker individuel. Et c'est en fait cela, ce dont nous avons besoin pour essentiellement reproduire ce que nous avions avec notre version Docker. Alors allons-y et mettons ça en place. Donc, la première chose que nous devons faire pour cela fonctionne est d'utiliser la commande Docker Dash Composed. Ensuite, nous allons taper ici. Et nous allons également ajouter un drapeau supplémentaire qui sera inférieur à zéro. Cela signifie donc que nous allons faire tourner notre conteneur, mais nous allons également le construire en premier. Alors commencez par le construire plutôt que de le dépenser. Alors allons-y et exécutons-le. Je vais probablement prendre un peu de temps pour construire. La plus grande partie doit être mise en cache. Et voyons voir ici. Il est encore en train de le créer. Très bien, alors on y va. Notre conteneur est en marche. Et si je clique dessus, je devrais y avoir accès. Donc, si vous allez sur la page de documentation et que vous essayez l'un de ces points de terminaison. C'est bon, on y va, Cool. C'est donc la valeur par défaut que nous avons et elle fonctionne. Alors si nous voulons le redescendre, eh bien. Maintenant, nous ne l'exécutons pas en mode démon. Donc, si j'appuie simplement sur Control C, cela va vraiment l'arrêter, ce que nous pouvons voir si nous revenons ici, rafraîchissement est maintenant désactivé. Mais si nous voulons l'exécuter en mode démon, comme nous l'avons fait pour notre Docker. Donc, en le faisant fonctionner en arrière-plan et en ne prenant pas le premier plan ici, je vais faire la même chose, moins, moins de build. Ensuite, je vais ajouter un drapeau moins d ici et l'exécuter une fois de plus. Encore une fois, le tout doit être mis en cache, donc ça devrait aller assez rapidement. Et nous y voilà. Maintenant, il fonctionne toujours en arrière-plan. Je peux faire Docker PS pour voir que cela fonctionne bien. Et si je vais me rafraîchir, encore une fois, nous courrons. Maintenant, si je veux arrêter le service, je peux faire Docker Compose Down, ce qui va juste arrêter tout ça. Et encore une fois, si je rafraîchis cela, nous y voilà. Il ne court plus. D'accord, tout va bien pour l'instant, non ? Assez simple et très pratique. Mais jusqu'à présent, il n'y a pas beaucoup de différence par rapport à l'utilisation de la commande Docker, non ? C'est, c'est un peu plus court parce que nous pouvons en quelque sorte faire l'étape de construction et d' exécution en même temps ici, mais pas tellement plus courte. Alors allons-y un peu plus et voyons certaines des autres choses intéressantes que nous pouvons faire. Donc, l'une des choses supplémentaires que nous pouvons faire, par exemple, est de définir cette variable de point d'entrée. Et ici, nous allons utiliser la même syntaxe que celle que nous avions dans notre commande ici. Il va le prendre et le copier. Mais peut-être que ce que je veux réellement faire, je vais le copier ici, c' est quand nous créons notre fichier Docker et que nous voulons l'exécuter quelque part. Nous ne voulons évidemment pas l' exécuter avec le drapeau de rechargement Dash, Dash, car cela ajoutera beaucoup de frais généraux que nous ne voulons pas. Mais lorsque nous nous développons localement, c'est vraiment agréable d'avoir ce drapeau parce que nous pouvons changer les choses et créer des choses. Nous pouvons simplement développer plus rapidement car nous n'avons pas à le démonter si nous lançons notre application. Idéalement, nous serions en mesure d'utiliser ce drapeau de rechargement négatif ou négatif. Ainsi, si nous définissons un point d'entrée dans notre niveau Docker Compose, il utilisera en fait ce point d'entrée ou cette commande au lieu de la commande finale que nous avons ici. Donc, dans ce cas, si je le lance à nouveau, docker-compose, je le construis et l'exécute. Et le mode David, nous allons voir dans une seconde. En fait, nous n'allons pas. Je vais donc le retirer et l'exécuter pas en mode démon afin que nous puissions simplement voir la sortie directement. Faisons-le encore une fois. Nous voyons ici que nous avons commencé à recharger notre processus. C'est donc parce que ce drapeau de rechargement est désormais actif. Nous pouvons donc voir que cela fonctionne correctement. Malheureusement, parce que nous fonctionnons dans un conteneur Docker. Donc, si je rafraîchis ceci, cela fonctionne comme prévu. Mais si j'essaie d'apporter des modifications, par exemple en entrant ici et peut-être en mettant à jour le nom de ce point final, ajoutez simplement quelque chose de aléatoire ici. Nous pouvons déjà voir qu'il ne redémarre pas. Et si je rafraîchis ici, ce n'est pas non plus une mise à jour. Mais idéalement, ce que je voudrais, c'est pouvoir faire fonctionner ce logiciel et pouvoir modifier mon code. Et comme je suis en train d'éditer comme nous avons fait lorsque nous l'avons exécuté localement sans Docker, je veux pouvoir mettre à jour ces mises à jour. La façon dont nous allons le faire, c'est démonter à nouveau. Nous allons ajouter ici un composant supplémentaire , appelé volume ou volumes. Et ce que les volumes nous permettent de faire, c'est qu'ils nous permettent de cartographier essentiellement des entrepôts extérieurs vers des emplacements situés à l'intérieur de notre conteneur. Et les volumes sont extrêmement intéressants car ils nous fournissent une méthode de stockage persistante. Nos conteneurs peuvent donc tomber en panne, non ? Par exemple, si nous faisons fonctionner notre logiciel Docker et que nous sauvegardons des choses, idéalement, nous ne voulons rien enregistrer dans notre conteneur car ce conteneur peut s'arrêter. Et la façon dont nos conteneurs devraient fonctionner est que nous devrions simplement pouvoir en faire tourner un nouveau et qu'il devrait avoir exactement le même état que le précédent. Comme s'il ne devait pas évoluer avec le temps. Si nous voulons stocker des informations, nous allons soit les envoyer à des bases de données quelque part. Ou s'il s'agit d'une base de données elle-même, elle doit la stocker dans une sorte de stockage qui, même en cas de panne du conteneur, soit toujours disponible. C'est donc ce que ce volume nous permet de faire. Cela nous permet de cartographier des lieux de stockage externes vers des emplacements de notre conteneur Docker. Nous pouvons l'utiliser pour les bases de données que nous verrons plus tard pour conserver les données lorsque nous faisons tourner une instance de base de données de haut en bas. Mais nous allons en fait l'utiliser pour l'instant, c' est-à-dire que nous allons mapper nos états locaux de notre code sur l'état du code dans notre Docker Compose. Ce que je vais faire, c'est mapper notre répertoire actuel sur. Cet endroit, ici, dans notre dossier Docker. Et cela ne devrait pas être ici. Revoyons cela encore une fois, puis exécutons-le et voyons comment cela fonctionne. Ensuite, prenez peut-être encore quelques instants pour réfléchir à ce qui se passe réellement ici. Mais essentiellement, ce que nous avons fait, c'est que dans notre fichier Docker, nous avons créé une nouvelle application SRC utilisateur de localisation de dossiers. Et essentiellement parce que nous copions cette application dans ce dossier d'application, dans ce chemin, cet emplacement dans lequel nous nous trouvons dans ce dossier, ce répertoire représente essentiellement ce que nous avons ici. Nous n'avons pas tout copié, mais en gros, c'est ce que nous avons. Nous avons copié tout ce dont nous avions besoin. Donc, si j'ajoute le mappage ici, par exemple de notre position actuelle à cet emplacement dans le fichier Docker. Alors en fait, et je vais vous le montrer maintenant, et j'ajouterai à nouveau le drapeau moins d. Parce que maintenant nous pouvons le faire fonctionner en arrière-plan. Nous allons maintenant mapper cet endroit à l'intérieur de notre fichier Docker à cet endroit qui se trouve actuellement sur notre machine locale. Nous allons voir cela en action. Donc, si je rafraîchis ceci, supprimez-le. Ok, on y va. Maintenant, nous avons toujours ce que nous avons ici. Maintenant, allons-y et faisons un changement. Je vais ajouter un a supplémentaire ici, Enregistrer. Je vais rafraîchir la documentation. Nous pouvons maintenant voir que nos mises à jour ont réellement été prises en compte. Encore une fois, la raison pour laquelle nous avons pu le faire est qu' auparavant, nous ne pouvions pas y accéder après avoir créé notre image Docker et commencé avec le conteneur, nous étions Impossible d'accéder à son contenu en interne. Mais maintenant, nous avons créé un mappage entre ce dossier ici et ce dossier ici. Et ce que nous pourrions également faire, c'est être plus précis et simplement cartographier. Et je vais annuler ces modifications ici comme ceci. Et faisons de Docker Compose Down. Juste pour que nous repartions d'une table rase. Nous pouvons être plus précis et mapper le dossier d'application que nous avons ici avec l'application que nous avons là-bas. C'est ce que nous sommes en train de copier dans notre fichier Docker, comme ceci, qui se trouvera dans ce chemin. Nous allons cartographier le dossier de l'application ici jusqu'à l'emplacement où l'application sera copiée sur un et notre fichier Docker. Actualisez-le encore une fois. On y va. Donc, ce que nous avions, maintenant je vais le mettre à jour à nouveau ici, l'enregistrer, l'actualiser. Et nous y voilà. Encore une fois, les volumes nous permettent de mapper ces stockages depuis l'intérieur de notre conteneur vers une sorte de stockage externe. Et c'est vraiment bien, car de cette façon, nous pouvons également enregistrer des données à l'extérieur. Et si un conteneur tombe en panne, nous pouvons simplement le connecter au volume persistant. Vous n'avez pas accès exactement aux mêmes données. Ce qui est évidemment très bien si nous avons des bases de données qui fonctionnent, par exemple , et oui, gardez cela à l'esprit. Cela si vous utilisez un conteneur Docker et que vous enregistrez dans un fichier local. Une fois que ce conteneur est tombé en panne, ce fichier a disparu. Donc, si vous avez besoin de quelque chose, conservez-le toujours quelque part à l'extérieur de votre contenant, car vous n'y aurez pas vraiment accès très facilement à l'intérieur du contenant et une fois qu'il sera descendu, il disparaîtra. Donc, il suffit de garder cela à l'esprit. Et c'est là encore une fois que les volumes nous aident vraiment. OK ? Les volumes sont donc jolis, c'est un peu ce que nous avons en ce moment, qui est essentiellement l'application que nous avions auparavant. Laissez-moi le redescendre. Nous sommes désormais en mesure de faire beaucoup plus avec nous. Nous avons donc notre application actuelle. Mais ce que nous voulons également faire, c'est pouvoir exécuter nos tests unitaires, par exemple, idéalement, nous les exécuterions dans le conteneur Docker, car c'est exactement la configuration que nous allons utiliser à avoir lorsqu'il est en production. Parce que c'est tout l'intérêt de tout cela, que nous ayons cette configuration reproductible. Je vais donc créer un nouveau service. Je vais appeler cette application moins test, juste pour indiquer qu'il s' agit d'une version test de wrap. Je vais prendre ça ici. Et je vais juste copier la plupart de ça. Et je ne vais pas mettre à jour le point d'entrée. Cela n'a pas vraiment d' importance. Et je n'ai pas non plus besoin d'un mappage de ports car je ne veux rien faire avec notre conteneur de test. Et aussi, si j'utilise ce mappage de port, nous allons avoir un conflit car nous mappons déjà le port de notre système sur ce port. Et donc le conteneur Docker, et nous ne pouvons pas remapper deux fois le même port. Donc, cela va réellement poser problème. Nous devons donc le supprimer de toute façon. Et maintenant, au lieu de mapper l'application, juste le dossier de l'application, je vais mapper tout ce répertoire parce que si nous allons dans un fichier Docker, vous remarquerez que nous ne copions pas réellement sur le dossier de test, mais nous devons toujours y avoir accès à l' intérieur d'un conteneur Docker. Maintenant, lorsque nous exécuterons cela, nous aurons en fait deux conteneurs distincts en cours d'exécution. La première sera votre application que nous utilisons actuellement avec cet indicateur de rechargement de barre oblique, ce qui nous le permettra, car nous mappons notre dossier ici à cet endroit dans le Docker. conteneur pour faire du développement et le consulter dans notre navigateur Web et pouvoir jouer avec lui. Ce conteneur sera essentiellement chargé d' exécuter des tests unitaires afin que nous puissions réellement tester notre code. OK ? Très bien, il y a encore d'autres choses à régler car si nous allons dans notre fichier Docker, nous remarquons ici que nous n'installons aucune dépendance de développement et que nous avons besoin les dépendances de développement pour pouvoir exécuter nos tests unitaires. Maintenant, ce que nous devons faire, c'est mettre à jour notre fichier Docker afin que le processus d'installation qui se déroule ici soit différent selon que nous sommes dans notre application ou si nous sommes dans l'application qui est uniquement destinée à exécuter des tests. Alors faisons-le d'abord. Ce dont nous avons besoin, c'est d'une sorte de moyen d' indiquer où nous en sommes actuellement. Maintenant, une bonne chose que vous feriez généralement avec cela est d'utiliser des variables d' environnement. Malheureusement, nous n'avons pas accès à ceux qui se trouvent à l'intérieur de notre conteneur Docker, mais nous pouvons fournir des arguments de construction. La façon dont nous pouvons les fournir est qu' au lieu de simplement utiliser cette syntaxe de construction ici, nous pouvons réellement développer cela. Et je vais vous fournir deux autres mots-clés. Donc, le contexte sera à nouveau celui où notre fichier Docker ou l'endroit où nous allons exécuter ce fichier à partir de l'emplacement, qui sera simplement l'emplacement actuel. Alors. Maintenant, nous pouvons également fournir des arguments de construction. Et encore une fois, nous pouvons le fournir sous forme de tableau, alors que la liste , et nous allons fournir le nom, puis nous allons fournir la valeur. Donc, par exemple peux appeler ce nom environnement, environnement et m'assurer que je le dis correctement. Je pense que je le suis. La valeur ici va être testée. Donc je vais juste me créer un nom, ce que je vais appeler environnement. Et ce sera le test de valeur. Et maintenant, je dois faire la même chose ici parce que je ne veux pas que des dépendances de développement soient installées dans notre application. Et donc celui-ci, je vais appeler dev ou peut-être que je l'appellerai local. Maintenant, ce que je veux faire, c'est adopter cet argument relatif au projet de loi. Maintenant, je dois pouvoir y accéder à l'intérieur d'un conteneur Docker. Ensuite, je veux mettre à jour notre exécution ici afin que si c'est le cas, si cette variable d'environnement est test, je souhaite également installer des dépendances de développement. Sinon, je ne le ferai pas. Très bien, tout d'abord, pour avoir accès à cet argument du projet de loi. Je vais utiliser ce mot clé args. Ensuite, je vais mettre le nom de cette variable ici. C'est maintenant que je vais nous donner accès à cet argument dans notre version Docker ici. Très bien, maintenant, nous devons mettre à jour cette instruction de manière conditionnelle et nous allons utiliser une instruction if pour cela, mais nous allons utiliser une instruction bash IF pour effectuer cette instruction de manière conditionnelle et nous allons utiliser une instruction if pour cela, mais nous allons utiliser une instruction bash IF pour installation conditionnelle avec dépendances de développement. Si cette valeur d'environnement est un test pour écrire une instruction if et bash. Et nous n'allons pas entrer dans les détails ici, allons simplement passer en revue les bases pour en avoir assez pour être en mesure de le faire. Parce que la plupart du temps, vous n' aurez pas besoin de plus que cela. Et si jamais vous le faites, parce que vous savez comment écrire des instructions conditionnelles en Python, vous en comprendrez la logique et serez capable de la transférer vers bash. Il vous suffit de rechercher la syntaxe appropriée. La syntaxe sera donc si, puis ouvrez et fermez les crochets. Et puis ici, nous allons mettre IF. Et pour accéder à la variable d'environnement dans Bash, nous allons devoir mettre le signe $1 devant elle. Donc, si l'argument du projet de loi, si la valeur de cet argument de construction auquel nous avons accès, parce que nous l'avons défini ici. Si cette valeur est égale à la chaîne, testez. Maintenant, il est très important d'avoir des espaces avant ou après et avant ou après et avant d'ouvrir et de fermer ces crochets. Ensuite, je vais mettre un point-virgule ici. C'est important car si nous voulons avoir plus d'une commande sur la même ligne dans Bash, nous devons les séparer par des points-virgules. Sinon, nous créerions nouvelles lignes qui répondraient également à cet objectif. Mais comme nous allions avoir la plupart de ces informations sur la même ligne, je vais mettre un point-virgule ici. Donc, si notre environnement est de test, nous voulons l'installer avec des dépendances de développement. Nous voulons donc faire la même chose ici, mais avec des dépendances de développement. Encore une fois, deux-points, car tout cela se trouve sur une seule ligne. Maintenant, parce que nous allons dépasser une ligne parce que je ne veux pas avoir ce truc ou comme courir dans l'infini sur le côté droit. Mais nous pouvons également voir que nous avons des suggestions de marges similaires ici et nous ne voulons pas revenir là-dessus. Donc, pour continuer, quelque chose qui était sur la même ligne. Et nous allons saisir un saut de ligne que nous pouvons faire avec la barre oblique inverse. Nous allons continuer sur la ligne suivante. Ensuite, nous aurons nos autres déclarations. Encore deux points ici. Et puis pour terminer cette déclaration, nous faisons FI, donc le contraire de f. Alors revenons sur cela une fois de plus. Qu'est-ce que nous avons fait ? Nous avons créé un argument de construction que nous fournissons nous construisons notre image avec cette valeur ici, nous avons ensuite accès à l'argument répandu ici. Et nous accédons à sa valeur ici. Nous le comparons au test de valeur en utilisant un seul signe égal ici. Ensuite, nous avons une déclaration conditionnelle. Donc, si cette valeur est test, alors nous allons faire cette instruction d' installation et nous avons ajouté ceci moins, moins dev tall, certaines dépendances de développement de type stall. Sinon, nous allons simplement faire notre installation normale. Et puis nous avons quelques mots clés spéciaux ici. Ce n'est pas parce que c'est en quelque sorte à cela que ressemble l'instruction if . C'est ce que tu dois écrire. D'accord ? OK, alors allons-y, commençons par ça. , nous ne faisons pas encore nos tests, mais nous pouvons le faire si nous le voulons. Donc, si nous le voulions, nous pourrions par exemple mettre à jour notre point d'entrée ici pour qu'il s'agisse test pi et de tests. Mais nous allons chercher une meilleure façon de le faire en une seconde. Parce que si nous le faisons comme ça , ils ne fonctionneront qu'en une seule fois au démarrage. Mais idéalement, nous serions en mesure de simplement exécuter à volonté. Très bien, donc je vais simplement exécuter la compilation pas en mode David pour le moment, afin que nous puissions voir le résultat complet. Hein ? Cette fois, cela va prendre un peu plus car nous avons mis à jour nos déclarations ici. Maintenant, nous ne sommes plus à court d'argent, mais nous devons refaire tout cela, qui inclut l' installation de composants, leur obtention en ligne, leur téléchargement pendant l' installation processus. Cela va donc prendre un peu plus de temps, espérons-le, pas trop, car tout le reste doit toujours être mis en cache. Attends que ça se termine. Très bien, donc notre construction est enfin terminée. Tout est en train de démarrer. Nous pouvons donc voir ici qu'il s'agit de notre premier conteneur en fonctionnement et que c'est notre second. Et ici, nous pouvons réellement voir le résultat des tests. Neuf tests ont été réussis et l'autre conteneur fonctionne toujours. Donc je vais juste faire une boucle, donc je ne veux pas que l' on clique sur un lien ici quelque part. Très bien, alors retirons ça. Très bien, alors on l'a fait fonctionner. Excellente. Maintenant, ce que nous allons mettre à jour, c'est au lieu de simplement exécuter ces tests une seule fois. Au lieu de cela, nous allons apprendre à faire ces tests chaque fois que nous voulons sur vos conteneurs. Je vais donc le construire, le faire tourner, le facturer à nouveau, l' exécuter et le mode démon. Si aucun code n'a changé, vous n'avez pas non plus besoin de le reconstruire, ce qui accélérera évidemment le processus. Donc, si nous le faisons ainsi, cela ne fera que créer l'image existante que nous avons créée pour cela. Ou plutôt, si nous ajoutons l'indicateur de construction, il sera reconstruit. Et même si tout est mis en cache, cela prend évidemment un peu plus de temps. Maintenant, pour exécuter nos tests sur ce conteneur de test que nous avons ici, nous allons utiliser docker ps, dash compose. Ensuite, nous allons taper ici exit exec. Nous allons donc exécuter quelque chose contre quelque chose. Notre objectif sera ce service de test de tableau de bord d'application que nous avons ici. Et ce que nous allons exécuter, la commande que nous allons exécuter, ce seront des tests de test pi. Nous exécutons donc pi test sur notre dossier de tests ici. Si j'appuie sur Entrée, et c'est parti. Nous effectuons donc nos tests. Et maintenant, c'est vraiment sympa car tout fonctionne dans un conteneur Docker. Nous avons plusieurs conteneurs Docker. Nous avons deux conteneurs séparés qui fonctionnent ici. L'un d'entre eux peut être utilisé pour le développement local. Nous pouvons apporter nos modifications. Alors, revoyez ça. Si je le supprime, cela devrait toujours disparaître. Et nous avons cette cartographie en raison des volumes. Nous avons plusieurs conteneurs en marche. L'un d'eux simule ce que nous aurons dans la production en développement, sauf que nous avons remplacé cet indicateur pour le rechargement. Celle-là. Bien que nous n'ayons jamais copié aucun des fichiers de test ici, nous ne les voulons pas dans notre image finale car nous utilisons un mappage de volume ici. En fait, nous avons toujours accès à tout cela ici. Parce que l'apparence de ce dossier à l'intérieur d'une image Docker sera désormais représentée par ce que nous avons ici localement. Ensuite, nous avons pu utiliser cette commande exec Docker Compose pour exécuter une commande sur une cible spécifique, qui est le nom que nous avons ici. Et c'est la commande que nous allons exécuter sur elle, qui signifie que chaque fois que nous apportons des modifications, nous pouvons également simplement apporter nos modifications ici, mettre à jour nos tests ici, puis lorsque nous exécutons Pour l'exécuter, nous pouvons simplement exécuter les tests par rapport à celui-ci. Et avec ce type d'exécution, lancez nos tests unitaires et tout se trouve dans un environnement Docker reproductible vraiment agréable , ce qui est génial. Et avec cette configuration, nous pourrons alors voir dans le futur que nous pouvons faire beaucoup plus de choses avec elle. Nous pouvons par exemple ajouter des variables d' environnement similaires. En ayant juste un clavier supplémentaire ici, nous pouvons déjà voir. Nous pouvons remplir ces informations. Nous pouvons ajouter des services supplémentaires qui ressembleront à nos bases de données et à notre cache, par exemple, ou si vous créez plusieurs services qui souhaitent peut-être entrer en contact les uns avec les autres, vous pouvez en fait avoir tous de ces services, les différents services que vous créez fonctionnent en même temps. Vous pouvez donc tous les tester comme s'ils fonctionnaient en direct quelque part. Et cela nous donne vraiment beaucoup de pouvoir parce que nous sommes capables de tout faire tourner, laisser parler les uns aux autres, et de tester d'une manière très agréable et reproductible. Donc oui, Docker Compose. J'espère que cela vous sera utile. Et encore une fois, il y a beaucoup d'autres arguments similaires que nous avons examinés ou que nous n'avons pas examinés qui fournissent des fonctionnalités supplémentaires. Et si jamais vous avez besoin de quoi que ce soit d'autre avec dark, vous pouvez simplement rechercher quel est le nom de la variable que je dois fournir ici et comment puis-je le mettre dedans ? Vous pourrez le configurer ainsi que Docker Compose. Et personnellement, je préfère cela beaucoup plus parce que nos commandes ici sont beaucoup plus courtes que si elles étaient plus longues, comme les commandes Docker. Et encore une fois, nous pouvons définir tout ce qui se trouve dans ces fichiers de configuration YAML ces fichiers de configuration YAML et que quelqu'un d'autre peut simplement prendre et exécuter. Alors que sinon, vous devriez leur envoyer votre copie exacte de, euh, quelle commande vous exécutez. Faites tourner votre conteneur à partir d'une image si vous souhaitez fournir de nombreuses variables d'environnement ou quelque chose comme ça. Alors qu'avec ce Docker Compose YAML, tout cela peut être préconfiguré. Et j'espère que quelqu'un d'autre devrait être capable de prendre tout cela, le faire tourner, de lancer Docker Compose et d'avoir exactement la même chose. Et c'est juste que cela facilite les choses parce qu'une fois que vous avez atteint ce point, évident que c'est un peu de travail pour y arriver. Mais une fois que vous avez atteint ce point, vous êtes dans un endroit vraiment agréable. Nous sommes capables d'avoir des choses reproductibles. Vous savez, ce que vous avez ici, c'est ce que cela va se passer lorsque vous le dirigerez ailleurs. Il est très facile d'apporter des modifications, ajouter de nouvelles choses et de tout garder reproductible et testable, etc. Donc, une autre chose que je veux vous montrer est que vous pouvez parfois avoir, par exemple plusieurs fichiers de composition Docker. Et essentiellement, allons-y, je vais créer un nouveau répertoire ici. Je vais appeler ça un test d'endettement, DC. Nous allons nous assurer de démonter mes conteneurs existants. On y va. Ensuite, je vais simplement déplacer ce fichier Docker Compose ici. Supposons donc que nous souhaitions avoir différents compositeurs pour différents scénarios. Si jamais vous avez besoin de quelque chose comme ça, alors ce que je peux faire, c'est ajouter un indicateur moins f à la référence, où il se trouve. Si je l'exécute maintenant, cela ne fonctionnera pas car il ne trouve pas de fichier Docker Compose. Mais si j'ajoute un drapeau minus f ici, je peux pointer vers mon fichier qui sera intestat , barre oblique, Docker, composer, YAML, c' est notre nom de fichier. Ensuite, nous pouvons essayer de l'exécuter à nouveau. Et boum, on y va. Cela fonctionne. Donc, un peu comme une petite mise à part au cas où vous tomberiez sur quelque chose comme ça. Évidemment, pour le démonter, nous avions besoin de la même syntaxe ici pour le démonter. Et je ne vais probablement pas vouloir ça ici. Comme ça, ici. De toute évidence. Ce n'est pas aussi agréable que de l'avoir directement ici et c' est exactement comme ça que beaucoup le gardent. Mais pour faire court, si vous rencontrez quelque chose comme ça, c'est ainsi que nous pouvons également procéder. Mais oui, donc c'est plus sombre. Beaucoup de Docker Docker composent. Et bien que nous ayons fait beaucoup de travail pour y parvenir, nous avons maintenant atteint un point très intéressant où, encore une fois, nous avons de très petites commandes très courtes et lisibles qui permettent nous pour construire des systèmes très complexes et les faire fonctionner de manière reproductible, qui est tout simplement super sympa car cela peut vous donner une grande tranquillité d' esprit pour vous assurer que la façon dont les choses fonctionnent ce sera ainsi que les choses se dérouleront ailleurs. Ce qui est vraiment très agréable. Oui. Je sais que certaines choses peuvent être un peu confuses quand on les regarde pour la première fois. Il faut un certain temps pour jouer avec certaines de ces choses. Prenez le temps de jouer avec ce volume pour comprendre à quoi il sert. Jetez un œil à chacune des choses que nous avons faites ici. Essayez peut-être d'ajouter un autre arc de construction ou de modifier le nom ici juste pour voir ce qui se passe, pour vous assurer que vous vous sentez plus à l'aise avec lui. Mais avec le temps, vous vous sentirez plus à l'aise avec elle. Et encore une fois, c'est parce que lorsque nous construirons ces éléments, beaucoup de ces éléments finiront par se ressembler, pour des raisons évidentes. Vous l' aborderez donc généralement de la même manière. Et la plupart du temps, vous aurez des modèles similaires sur lesquels travailler, pour avoir ces fichiers Docker. Ensuite, vous n'aurez qu' à adapter ce que vous copiez , la façon dont vous effectuez l'installation, etc. Mais une grande partie de cela ressemble en fait à des modèles standard. Tu sais, que tu peux réutiliser. Et évidemment, nous voulons l'examiner en détail une fois que nous lui aurons appris bien comprendre ce qui se passe sorte que si vous le lisez ou si vous devez apporter des modifications ou des ajouts, vous savez Où chercher, tu sais quoi chercher. Mais oui, la plupart du temps vous aurez comme un modèle sur lequel travailler. Vous avez un modèle maintenant, vous avez peut-être un modèle et une organisation et vous pouvez trouver des modèles en ligne qui peuvent vous aider à atteindre ce résultat final beaucoup plus rapidement. 6. Makefile: Très bien, nous avons parcouru un long chemin et nous avons réussi à atteindre un point, ce qui est plutôt sympa de ne pas avoir à écrire autant de choses pour que les choses soient opérationnelles. Mais avec le temps, vous serez probablement frustré de devoir écrire encore frustré de devoir écrire et encore les mêmes choses. Et il existe d'autres moyens que nous pouvons utiliser pour raccourcir cela. Pour avoir essentiellement des raccourcis pour les commandes que nous exécutons régulièrement. Maintenant, cela fonctionnera sur Mac et Linux, je pense que pour Windows, vous devrez effectuer une configuration supplémentaire pour que ces makefiles fonctionnent, c'est ce que nous allons voir maintenant. Mais d'une manière générale, si vous finissez par travailler dans une organisation quelque part, il est peu probable que vous travailliez sous Windows ? Pas oui, ce n'est pas qu'il soit impossible de travailler sur un Mac, un Mac ou Linux. Donc oui, en gardant ça à l'esprit. Nous allons y revenir maintenant car il est courant de créer des makefiles pour vous-même ou de les voir dans un autre dépôt. Parce que, comme nous le verrons dans une seconde, cela vous simplifiera beaucoup la vie. Encore une fois, pour Windows, il y a d'autres éléments que vous devez installer pour que ces commandes fonctionnent réellement. Cherché, très important pour le faire fonctionner. Sachez donc simplement que ces choses existent et que c'est ainsi que nous pouvons les gérer. Et vous pouvez les créer si vous le souhaitez ou vous pouvez les laisser de côté parce que ce sont juste de belles choses à fabriquer. Courte. La syntaxe est encore plus courte. Mais oui, en tout cas. Très bien, créons ici un nouveau fichier que nous appellerons un fichier make comme celui-ci. Et dans ce makefile, nous allons maintenant définir une série de commandes qui vont nous permettre d'effectuer essentiellement ce que nous avions ici, comme le Docker compose dash, dash minus d, juste pour que nous n'ayons pas à l' écrire à chaque fois. Nous allons créer un raccourci qui va exécuter cela pour nous. Maintenant, une chose très importante est que si vous êtes dans PyCharm, comme je suis ici dans ce fichier, nous voulons aller en bas cliquer sur ces quatre espaces et configurer l'endurance pour et utilisez plutôt le caractère Tab. Parce que le Makefile a une différence très, très spécifique entre quatre espaces et un onglet. Alors que dans d'autres cas, comme en Python, par exemple , cela ne fait pas vraiment de différence. Donc c'est bien de l'utiliser comme ça. Mais dans PyCharm, vous trouverez ce que j'ai fait ici, si vous utilisez du code visuel, si vous n'utilisez pas du code visuel PyCharm ou quoi que ce soit d'autre, vous le trouverez probablement à un endroit similaire. Mais en général, si vous rencontrez des problèmes qui indiquent qu' il manque un séparateur ou quoi que ce soit d'autre. est fort probable que le problème que vous rencontrez soit ce que nous voulons. Vous avez oublié de mettre deux points, ce qui arrive également. Mais pour les autres problèmes très courants vous utilisez des espaces au lieu de taps. OK. Je vais également vous montrer un deuxième moyen rapide de le voir. En fait, cela m'a permis de le désactiver pour cela, juste pour vous montrer à quoi cela ressemblerait. Très bien, donc la première chose que nous voulons faire est de définir une commande ici, c' est-à-dire que je vais juste appeler start parce que c'est court et que j'aime ça. Mais tu peux l'appeler comme tu veux, comme courir, faire tourner, peu importe. Je vais appeler ça Start. Lorsque nous exécutons cette commande, ce que nous voulons, c'est ceci moins la partie de construction, comme ceci. Maintenant, vous remarquerez que j'utilise des espaces en ce moment parce que si je reviens, reviens ici, vous remarquerez que cela revient quatre fois. Ce sont donc des espaces. Et si je passe de quatre espaces à l'utilisation d'un caractère de tabulation à la place, supprimez-le et appuyez à nouveau sur Tab. Maintenant, quand je vais de gauche à droite. C'est donc le personnage principal. Très grande différence d'utilisation des espaces ici. Tu vas avoir des problèmes et c'est frustrant. Très bien, il faut donc commencer. Une autre chose que nous utilisons très couramment est de commencer par construire. Je vais donc appeler cela start underscore build. Et ici, je vais juste mettre cette commande comme ceci. Une autre chose que nous voulons faire est de le démonter. Donc, soit vous utilisez takedown, mais c'est un mot long, arrêtez le mot le plus facile. Et nous allons faire du Docker, composer comme ça. Et une autre chose que nous voulons probablement faire régulièrement est de faire nos tests unitaires. Nous pouvons dire que les tests unitaires sont des tests unitaires au pluriel, car nous exécutons probablement plusieurs tests. Et la commande que nous allons exécuter ici sera la commande que nous avons vue précédemment. Donc Docker Compose x moins t et il sera susceptible d'être testé, qui est contre ce conteneur ici. La commande que nous exécutons est pi test, des tests comme celui-ci. OK ? Ce sont donc quatre commandes que nous utiliserons assez régulièrement. Et à partir de là, nous avons notre Makefile. Il y a une chose que nous voulons ajouter en haut, c'est que nous voulons fournir une liste des crimes. qui indique essentiellement au makefile que ce sont des commandes. Et si jamais nous avons des fichiers portant ces noms, lorsque nous les utilisons avec la commande make, nous verrons dans une seconde qu'elle doit les traiter comme des commandes. Nous allons mettre ici toutes les commandes que nous voulons utiliser. Ce sera juste un début que nous allons commencer à souligner la construction. Nous avons un arrêt, nous avons des tests unitaires. Très bien, alors laisse-moi voir si quelque chose fonctionne. Ça l'est. Je vais donc faire, eh bien, utilisons notre commande principale. Je les ai donc toujours en marche depuis la dernière fois. Ce que je vais faire, c'est maintenant que je vais taper make stop, qui va exécuter cette commande ici. Quand j'appuie sur Entrée. Et nous pouvons voir qu'il exécute cette commande et qu' il supprime tout. Nous pouvons commencer à gérer cela et cela va nous remettre en ordre. Donc, voyez, si je rafraîchis, c'est Hold on 1 s. On y va. Très bien, redescendons-le et arrêtons. Et nous y voilà. Maintenant, si je me rafraîchis, on y va. Donc, ne cours plus. Une chose à noter, si vous ne voulez pas voir ces commandes, nous pouvons ajouter des symboles au début de tout. Maintenant, quand est-ce que nous ferons un arrêt, ou est-ce que je l'exécute déjà ? Désolée, micro, commence. Maintenant, nous n'allons pas voir la commande l'imprimer. Donc, c'est juste un petit peu pour obtenir des choses, même ici. Si nous voulons exécuter nos tests unitaires, des tests unitaires, qui vont les exécuter sur notre application de test ici, il notre application de test ici, suffit d'exécuter cette commande comme nous l'avons vu précédemment. Bam, on y est. Une autre commande que nous voulons peut-être faire est de vérifier notre saisie. Nous pouvons donc effectuer la saisie des chèques. Et je vais exécuter cette commande ici, ou l'exécuter sur notre conteneur de test. Je vais préparer ma tarte comme ça, comme nous le faisions auparavant. Ensuite, nous pouvons vérifier en tapant cela sur notre faux. Et nous dirons « make check typing », qui devrait maintenant vérifier la saisie par rapport à notre conteneur de test ici. Pendant que cela est en cours d'exécution, faisons quelques raccourcis, car parfois, nous voulons peut-être exécuter des tests unitaires ici dans notre conteneur. Mais dans certains cas, si vos conteneurs, Docker Compose, deviennent très volumineux et que vous ne voulez pas que toutes ces choses fonctionnent quelque chose que vous pourriez faire place est peut-être aussi exécuter des choses locales. Peut-être que parfois vous n'avez tout simplement pas envie de faire tourner un conteneur parce que peut-être aussi le contenant en prend beaucoup. Donc, ce que nous pouvons faire à la place, c'est simplement ajouter des types d'alias pour cela, puis les réutiliser. Par exemple, créons un alias de tests unitaires. Et ça va être, désolé, il devrait y avoir un égal. Ce seront des tests de pi comme celui-ci. Et maintenant, si nous voulons faire référence à des tests de test pi similaires, nous pouvons plutôt faire référence à cet alias en utilisant le symbole $1 ici, puis en ouvrant et en fermant des parenthèses autour de celui-ci. Ainsi, nous pouvons avoir nos tests unitaires comme nous l'avions fait auparavant. Comme ça. Nous pouvons également en avoir un autre qui sera des tests unitaires. Local comme celui-ci, qui va juste exécuter nos tests unitaires. Et cela va probablement échouer parce que je ne suis pas dans mon environnement virtuel en ce moment. Mais voyons voir. Oui. Alors allons-y et allons choisir Penn Shell. Et refaisons en sorte que les tests unitaires soient à nouveau locaux. Je vais ouvrir un nouveau terminal ici, je me suis retrouvé dans une situation étrange. Faites des tests unitaires, locaux. Très bien, alors on y va. C'est donc une bonne façon de réutiliser ceci et d'autres choses similaires, en particulier lorsque les commandes s'allongent. Sundance est aussi, comme vous l'avez commandes qui passent sur plusieurs lignes, que nous pouvons encore séparer en utilisant des sauts de ligne comme celui-ci. Par exemple, si cela devait passer à une nouvelle ligne, je pourrais plutôt la séparer. Mais si nous avons des commandes plus longues et qu'il est parfois plus agréable de simplement leur faire apparaître un alias que nous pouvons référencer ici. Juste pour que, tu sais, ces trucs deviennent plus lisibles et ne soient pas trop encombrés. Et oui, c'est un peu ce que nous faisons pour taper. Et plus encore, désolé, pas pour avoir tapé. C'est ce que nous pouvons faire pour nos makefiles ici, ce qui, encore une fois, ajoute un peu plus de simplicité et rend ses commandes un peu plus courtes que « make stop to take down » ou « containers » à la place de Docker Compose down. Si je veux construire, je fais démarrer la construction. Je viens de le répéter en abrégé. Juste un petit peu. Et oui, c'est ce genre de truc qui résume tout ça. Il y a encore une chose que je voulais mentionner, n'a rien à voir avec nos makefiles, qui va simplement regarder les journaux. Ce que je trouve assez facile à faire lorsque nous avons comme si un conteneur Docker en cours d' exécution, c'est que si je vais notre bureau Docker ici, vous pouvez cliquer dessus et voir les journaux directement ici. Mais en passant, comme avons pas vraiment fait, si vous voulez consulter journaux et que vous voulez le faire via le terminal, il y a la commande Docker Logs. Donc, si nous référençons un identifiant de conteneur, par exemple notre application principale, et que nous voulons consulter les journaux. On peut voir les choses comme ça. Phi One pour examiner notre application de test et simplement mettre cette commande ici. On y va. Il est donc évident que nous n'avons pas beaucoup de journaux pour le moment. Mais au cas où vous voudriez le faire et que vous ne voudriez pas utiliser Docker Desktop pour cela, vous pouvez également le faire via la ligne de commande. Puisque nous faisons beaucoup de choses pour la ligne de commande. Et parfois, cela peut aussi être plus facile pour ce processus. Donc, oui, j'espère que ces makefiles vous seront également utiles. Vous les verrez probablement aussi et, étant utilisés dans n'importe quelle organisation que vous rejoindrez, ils auront comme des makefiles là pour avoir juste une liste de commandes qui effectuent un certain processus, font simplement tout cela est très facile d' avoir des fichiers makefiles pour que cela soit encore plus facile à exécuter et que vous n'ayez pas besoin de dire à quelqu'un d'autre quelle est la commande. Ils peuvent simplement exécuter la commande make et c'est très simple à écrire. Et encore une fois, une très bonne façon d'obtenir ces choses reproductibles. Et évidemment, ils nous rendent la vie beaucoup plus agréable parce que nous devons écrire encore moins.