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.