Microsoft Azure et ses coûts, les PME négligés ?

Par défaut

La compréhension de la tarification Azure présente de nombreux défis. Microsoft a développé son service cloud Azure avec une rapidité remarquable et est monté en deuxième position en tant que fournisseur de cloud derrière Amazon Web Services. Il a pris deux de ses applications fares comme SQL Server et Office, et les a rendues disponibles sur demande, ce qui était impensable il y a une décennie.

Mais la question se pose, est-ce que Azure est fait pour les petites et moyennes entreprises ?

Avant de répondre à cette question, j’ai testé pendant 1 mois. Le but est donc d’avoir un point de vue rapide sur la tarification azure.

J’ai acheté une souscription qui comprend une machine virtuelle et un App Service.

La machine virtuelle

Le taux d’utilisation sur 1 mois

Le App service

J’ai crée une petite application asp.net core, que j’ai déployé.

J’ai testé l’application quelques fois, et ensuite je l’ai stoppé.



Il est intéressant de noter que meme si l’application est stoppé, les couts liés au ’App Service plan’ continuent de tourner.

Le App Service Plan : Taux Utilisation sur 1 mois

Le App Service Plan : Quota disque

Le quota n’est pas dépassé.

Avec tous ces éléments, on peut déjà se faire un bilan.

Résultats

Pour une utilisation plus que modérée, je trouve personnellement que les coûts sont élevées. Je suppose que les prix sont si élevés parce que les grosses entreprises ont de l’argent à brûler, mais pour les petites ou moyennes entreprises car les prix ne sont vraiment pas amicaux.

Les prix des VM sont un peu meilleurs si vous faites des prix réservés pour 1 ou 3 ans, mais je n’aime pas être bloqué. Vous devez également gérer les vcores sur une VM qui ne sont pas de véritables cœurs physiques, et vous devez toujours payer un supplément pour le stockage sur disque pour la machine virtuelle qui est cher, ainsi que la bande passante (Référence: https://azure.microsoft.com/en-us/pricing/details/virtual-machines/windows/ ). Donc, les VM ne sont vraiment pas beaucoup mieux que les app services à mon avis.

Il est BEAUCOUP moins cher de simplement payer pour les serveurs dédiés et d’avoir beaucoup de processeurs inactifs que d’utiliser des app services ou des machines virtuelles avec des groupes à mise à l’échelle automatique. Les machines virtuelles coutent jusqu’à 4 fois plus cher que les conteneurs.

Pour de nombreuses entreprises qui ont des besoins de « mise à l’échelle Azure », une facture mensuelle de 5000 euros va maintenant devenir quelque chose qui doit beaucoup les préoccuper à cause de la crise économique majeure dans lequel nous nous trouvons.

Pour une entreprise de logiciels ou de technologies, les solutions cloud proposées par Azure ou AWS peuvent représenter l’essentiel de leurs dépenses non salariales, et 5000 euros par mois peut meme correspondre au salaires de 2 développeurs.

Prédiction du pic de l’épidémie de Covid-19 à l’ile Maurice

Par défaut

L’épidémie de Covid-19 a touché l’ile Maurice en ce début d’année.

Je vais essayer de prédire le jour où le peak de l’épidémie sera atteint à l’aide de mes connaissances en Python et Machine Learning.

Je vais utiliser le modèle Logistique. Je ne veux pas utiliser le modèle Exponentiel pour des raisons …évidentes.

Je vais utiliser les librairies numpy et pandas.

numpy est une librairie utilisé pour le calcul scientifique.

pandas est une librairie qui est construit sur numpy, et elle fournit du calcul haute performance, des structures de données faciles à utiliser et des outils d’aide à l’analyse de de données.

Pour commencer, importons les librairies.

import pandas as pd
import numpy as np
from datetime import datetime,timedelta
from sklearn.metrics import mean_squared_error
from scipy.optimize import curve_fit
from scipy.optimize import fsolve
import matplotlib.pyplot as plt

Préparation des données

J’ai récupéré un google sheet qui recense les cas de covid-19 tous les jours. Je partage le fichier au format csv avec google sheets. Je vais ensuite le mettre dans un dataframe.

url = "https://docs.google.com/spreadsheets/d/e/2PACX-1vRG9SHNzCmx72RXRoz4BisAwawIdRWSzq43b09dBQYagYlW0FZjqSuwjDbJ0z0b129xLi_E0t_pqA1J/pub?gid=717908023&single=true&output=csv"

df = pd.read_csv(url)

Visualisation des données

df

Les colonnes qui m’intéressent sont le Timestamp et le cum_new ( nombre de cas positifs cumulés )


df = df.loc[:,['Timestamp','cum_new']]

Je formate la date correctement, pour pouvoir calculer le nombre de jours depuis le 1er janvier 2020.

FMT = '%m-%d-%Y %H:%M:%S'
date = df['Timestamp']
df['Timestamp'] = date.map(lambda x : (datetime.strptime(x, FMT) - datetime.strptime("01-01-2020 00:00:00", FMT)).days)


Le modèle logistique.
Le modèle logistique a été largement utilisé pour décrire la croissance d’une population. Une infection peut être décrite comme la croissance de la population d’un agent pathogène, donc un modèle logistique semble raisonnable. Cette formule est très connue des spécialistes des données car elle est utilisée dans le classificateur de régression logistique et comme fonction d’activation des réseaux de neurones. L’expression la plus générique d’une fonction logistique est:

Dans cette formule, nous avons la variable x qui correspond au temps et trois paramètres a,b,c

a est la vitesse de l’infection

b est le jour où est survenu le nombre maximal d’infections.

c est le nombre total des personnes infectés à la date de fin de l’épidémie.

Aux valeurs maximales, le nombre de personnes infectés se rapproche de plus en plus de c, et c’est le point où on peut dire que l’infection est terminé. La fonction a aussi un point d’inflexion à b, qui est le point où la dérivée première commence à décroitre, c’est à dire, le pic après que l’infection commence à devenir moins aggressive et le nombre de nouveaux cas commence à diminuer.

On le définit donc

def logistic_model(x,a,b,c):
return c/(1+np.exp(-(x-b)/a))

On peut utiliser le curve_fit, une fonction qui est contenue dans la librairie scipy, pour estimer les paramètres et les erreurs à partir des données sources.

x = list(df.iloc[:,0])
y = list(df.iloc[:,1])

fit = curve_fit(logistic_model,x,y,p0=[2,120,1000])

Voici le résultat

Voici les valeurs

a : 1.46

b : 81.06

c : 53.83

La fonction retourne aussi la matrice de covariance, donc les diagonaux correspondent aux variances des paramètres. En prenant les racines carrés, on peut calculer les erreurs standards.

errors = [np.sqrt(fit[1][i][i]) for i in [0,1,2]]

errors

[0.2881514331099414, 0.6209485659619303, 9.227239886449258]

Erreur standard de a : 0.29

Erreur standard de b : 0.62

Erreur standard de c: 9.23

a = fit[0][0]
b = fit[0][1]
c = fit[0][2]

Ces chiffres nous donnent des informations intéressantes.

Le nombre estimé de cas positifs à la date de fin de l’infection est de 54 +- 9.

Le nombre maximal de nouvelles infections par jour est déjà passée, et c’était il y a 2 jours, 23 mars, où on est passé de 14 cas à 28 cas ! ( tout ceci est bien sur à prendre avec beaucoup de précautions !. Les conditions sur le terrain risquent de changer.)

sol = int(fsolve(lambda x : logistic_model(x,a,b,c) - int(c),b))

Le pic de l’épidémie, c’est dans 4 jours, soit le 28 Mars 2020.

pred_x = list(range(max(x),sol))
plt.rcParams['figure.figsize'] = [7, 7]
plt.rc('font', size=14)

Données réels

plt.scatter(x,y,label="Données réels",color="red")

La courbe logistique prédite

plt.plot(x+pred_x, [logistic_model(i,fit[0][0],fit[0][1],fit[0][2]) for i in x+pred_x], label="Modèle logistique" )

plt.legend()
plt.xlabel("Données depuis le premier Janvier 2020")
plt.ylabel("Nombre total de personnes infectés")
plt.ylim((min(y)0.9,c1.1))

plt.show()

Conclusion : En utilisant cette modélisation, si le confinement maximal est appliqué 1 semaine et que toute le monde le respecte ( cas idéale ), si le gouvernement continue à fournir un effort considérable dans le dépistage à travers le ’Contact Tracing’ (plus le nombre de dépistages augmente, le mieux), que les personnels soignants et des services essentielles sont équipés d’équipements de protection adéquat et que les personnes positives sont isolés, l’épidémie pourra être maitrisé d’ici FIN MARS.

Installer NestJs sur MacOS Catalina

Par défaut

NestJS est un framework pour construire des applications node performants et scalables. J’ai voulu la tester, et la première chose est de suivre la documentation officielle, et comme ca arrive, ca ne passe pas forcément comme prévu ;(

Après avoir essayé

npm i -g @nestjs/cli

Pas de message d’erreur. Nest aurait du etre installé globalement, mais en essayant

nest --version

La commande est inconnu !

Je vérifie si nest est bien installé globalement, et oui, c’est bien le cas.

(base) Ajmals-MacBook-Pro:node_modules ajmal$ npm list -g --depth=0

/Users/ajmal/.npm-packages/lib

├── @angular/cli@9.0.5

└── @nestjs/cli@6.14.2

(base) Ajmals-MacBook-Pro:~ ajmal$ cd /Users/ajmal/

(base) Ajmals-MacBook-Pro:~ ajmal$ cd node_modules/

(base) Ajmals-MacBook-Pro:node_modules ajmal$ cd bin

(base) Ajmals-MacBook-Pro:node_modules ajmal$ ls

ansi-styles color-name has-flag

axios debug is-buffer

chalk escape-string-regexp ms

color-convert follow-redirects supports-color

(base) Ajmals-MacBook-Pro:node_modules ajmal$ cd /Users/ajmal/.npm-packages/lib/

(base) Ajmals-MacBook-Pro:lib ajmal$ ls

node_modules

(base) Ajmals-MacBook-Pro:lib ajmal$ cd node_modules/

(base) Ajmals-MacBook-Pro:node_modules ajmal$ ls

@angular @nestjs

(base) Ajmals-MacBook-Pro:node_modules ajmal$ cd @nestjs/

(base) Ajmals-MacBook-Pro:@nestjs ajmal$ ls

cli

(base) Ajmals-MacBook-Pro:@nestjs ajmal$ cd cli

(base) Ajmals-MacBook-Pro:cli ajmal$ ls

LICENSE actions commands node_modules

README.md bin lib package.json

(base) Ajmals-MacBook-Pro:cli ajmal$ cd bin

(base) Ajmals-MacBook-Pro:bin ajmal$ ls

Les 2 fichiers présents

nest.d.ts nest.js

Je récupère le chemin

(base) Ajmals-MacBook-Pro:bin ajmal$ pwd

/Users/ajmal/.npm-packages/lib/node_modules/@nestjs/cli/bin

Je crée un alias

(base) Ajmals-MacBook-Pro:bin ajmal$ alias nest="/Users/ajmal/.npm-packages/lib/node_modules/@nestjs/cli/bin/nest.js"

(base) Ajmals-MacBook-Pro:bin ajmal$ nest --version

6.14.2

Nest peut maintenant être utilisé dans ce terminal

Mais si ouvrez un nouveau terminal, cet alias sera inconnu. Donc pour pouvoir persister la définition de cet alias, il va faloir le renseigner dans votre bash profile

  1. Lancer le terminal
  2. Tappez la commande cd ~/ pour naviguer vers votre repertoire principal
  3. Faites touch .bash_profile pour ouvrir ou créer le fichier
  4. Editer .bash_profile avec votre éditeur ou faites open -e .bash_profile pour ouvrir dans gedit
  5. Rajouter la ligne suivant alias nest= »/Users/[votre nom utilisateur]/.npmpackages/lib/node_modules/@nestjs/cli/bin/nest.js »
  6. Tapez commande . .bash_profile pour recharger le .bash_profile et mettre à jour les alias.
  7. Ouvrez un nouveau terminal et refaites nest –version pour vérifier que nest est maintenant correctement installé.

Meetup ’’La minute Freelance – SOS : mon client ne comprend pas mon métier !’’

Par défaut

Le mercredi 4 mars 2020 donc, je suis allé à un meetup organisé par Novaa, un cabinet d’expert comptable basé à Paris. Il y avait une présentation sur le métier de freelance présenté par Lisa Slimane, fondatrice de laminutefreelance.fr.

Le thème abordé ’’Mon client ne comprend pas mon métier !’’.

Cette situation atypique, que certains professionnels du numérique ou du conseil peuvent rencontrer est la conséquence d’un manque de communication . Pourtant, une mission alignée ne peut reposer que sur une compréhension mutuelle.Au cours de la présentation qui était dans un format simple, compréhensible et direct, elle a partagé son expérience personnelle comme freelance et a aussi donné des pistes et des points clés pour améliorer notre profil auprès des entreprises. Je vous propose de découvrir ici quelques slides sur la présentation.

Le sommet du ChangeNow 2020: un salon au Grand Palais autour de la Green tech.

Par défaut

Le ChangeNOW Summit 2020, la première Exposition Universelle des solutions pour la Planète s’est déroulé au Grand Palais du 30 janvier au 1er février 2020. L’objectif de ce salon a but de rassembler tous les acteurs de l’innovation environnementale et sociale pour répondre concrètement aux urgences climatiques. Je partage quelques images du salon et de ses exposants.

Thèmes abordés des différents exposants

  • Zero Waste
  • Smart fashion ou mode responsables ;
  • Economie circulaire ;
  • Santé et bien-être ;
  • Smart cities, IOT, ville durable et mobilité verte ;
  • Energie verte ;
  • Ressources marines, océans
  • Foodtech, alimentation
  • Smart agriculture
  • Formation

C# – Soit 2 tableaux de n entiers chacun, trouvez une paire d’éléments issue des 2 tableaux {n1,n2} dont la somme se rapproche le plus d’une cible n.

Par défaut

Ce petit problème fort intéressant peut etre résolu de divers manières, mais j’ai voulu montrer comment on pouvait créer un dictionnaire en C# qui contient 2 clés, en utilisant les tuples.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Exercises

{

	class Program

	{

		static void ClosestToTarget(int[] array1, int[] array2, int target)

		{

			int i,
			j = 0;

			var dictionary = new Dictionary < Tuple  ,
			int > ();

			int x = 0;

			int[, ] totals = new int[array1.Length, array2.Length];

			for (i = 0; i < array1.Length; i++)

			{

				for (j = 0; j < array2.Length; j++)

				{

					int total = array1[i] + array2[j];

					totals[i, j] = total;

					var key = new Tuple  (i, j);

					dictionary.Add(key, array1[i] + array2[j]);

				}

			}

			foreach(KeyValuePair < Tuple  , int > kvp in dictionary)

			{

				Console.WriteLine("Clé = {0},{1}", kvp.Key, kvp.Value);

			}

			var bestMatch = dictionary.OrderBy(e = >Math.Abs(e.Value - target)).FirstOrDefault();

			i = bestMatch.Key.Item1;

			j = bestMatch.Key.Item2;

			Console.WriteLine("Elément issu du premier tableau : {0} , Elément issu du deuxième tableau : {1}, La Somme = {2} qui se rapproche le plus de la cible : {3}", array1[i], array2[j], array1[i] + array2[j], target);

		}

		static void Main(string[] args)

		{

			Console.WriteLine("Ce programme prend en entré 2 tableau de taille n et vous donne quel pairs d'éléments des 2 tableaux se rapproche le plus d'une cible x");

			Console.WriteLine("Veuillez entrer la taille des tableaux:");

			int size = 0;

			while (!int.TryParse(Console.ReadLine(), out size))

			Console.Write("Attention, la valeur doit être un entier. Veuillez réessayer");

			int[] array1 = new int[size];

			int[] array2 = new int[size];

			int i;

			Console.WriteLine("Entrez les {0} chiffres pour le premier tableau:", size);

			for (i = 0; i < size; i++)

			{

				while (!int.TryParse(Console.ReadLine(), out array1[i]))

				Console.Write("Attention, la valeur doit être un entier. Veuillez réessayer");

			}

			Console.WriteLine("Entrez les {0} chiffres pour le deuxième tableau:", size);

			for (i = 0; i < size; i++)

			{

				while (!int.TryParse(Console.ReadLine(), out array2[i]))

				Console.Write("Attention, la valeur doit être un entier. Veuillez réessayer");

			}

			Console.WriteLine("Entrez la cible:");

			int target = Convert.ToInt32(Console.ReadLine());

			ClosestToTarget(array1, array2, target);

			Console.ReadLine();

		}

	}

}

https://dotnetfiddle.net/4cKdGc

Elastic Paris Meetup : Malt

Par défaut

Ce Mardi 22 Janvier 2019 se tenait dans les locaux de Malt à Paris, le 35ème meet-up du groupe ElasticFR, un groupe composé d’environ 2800 membres. C’est un groupe qui a pour vocation d’organiser des rencontres entre les passionnés francophones des projets Elastic (Elasticsearch, Logstash, Beats, and Kibana et leurs plugins).

IMAG1972

Déroulement de la soirée :

19h00 : ouverture des portes (food and drinks)
19h30 : accueil par Elastic et Malt
19h45 : Talk 1: Les différents cas d’usage d’Elasticsearch chez Malt
20h15 : Talk 2: Nouveautés de Lucene 8 et Elasticsearch 7
20h45 : Social discussions (food and drinks)
22h00 : fin du meetup

Talk 1: Les différents cas d’usage d’Elasticsearch chez Malt

Présentateur : Hugo Lassiège

Hugo Lassiège est CTO et co fondateur chez Malt. Il officie dans l’informatique depuis 18 ans principalement en tant qu’ingénieur en développement. Il apprécie discuter d’architecture technique ou d’organisation (qui n’est rien d’autre que de l’architecture sociale), de moteur de recherche, de science des données.

IMAG1946

Elasticsearch est utilisé depuis 2012 chez Malt. Cette première présentation avait pour but de montrer un apercu de son usage au sein du moteur public mais aussi sur certaines parties privées du site.

Pour ceux qui ne connaissent pas ElasticSearch, c’est un serveur utilisant Lucene pour l’indexation et la recherche des données. Elle fournit un moteur de recherche distribué et multi-entité à travers une interface REST. C’est un logiciel libre écrit en Java et publié en open source sous licence Apache. Au début Janvier 2019, elle était classé au 8ème rang selon le classement DB-Engines Ranking, en progression (+2) par rapport à Janvier 2018.

Ranking.png

Il existe plein d’informations  sur le net sur Elasticsearch et je vous invite à les lire.

Pour revenir au talk, Hugo Lassiège a aussi pris le temps d’expliquer le concept de scoring à travers les fonctions de gauss decay et functions script, de boost par proximité géographique mais aussi d’ontologie, d’analyseur multi langue ou de migration de mapping.

Bien qu’Elasticsearch offre un algorithme de scoring efficace, il peut souvent s’avérer insuffisant dans les contextes de commerce électronique. La plupart des utilisateurs ont tendance à se préoccuper uniquement du nombre de résultats le plus élevé. ce qui signifie qu’il est très important d’avoir un mécanisme de notation flexible. Si vous pouvez présenter les meilleurs résultats en fonction des préférences de l’utilisateur, votre taux de conversion augmentera probablement de manière significative.

Talk 2: Nouveautés de Lucene 8 et Elasticsearch 7

Présentateur : Jim Ferenczi

Jim Ferenczi est développeur dans l’équipe Elasticsearch. Il est également committeur sur le project Lucene.

IMAG1948

Il a ensuite abordé les nouveautés d’Elasticsearch7, abordant rapidement les changements sur les indices, et sur les analyses.

Il est aussi revenu sur le concept du scoring, notamment sur la formule BM25.

Il a donné plus de détails sur le fonctionnement, en expliquant les scoring factors, IDF(qi),tf(qi),Field length ( norm). Il a ensuite donné l’exemple du MaxScore ou comment ce scoring particulier pouvait permettre de rendre le scoring plus efficient. L’idée réside dans le fait de booster les disjonctions en évitant les documents non compétitifs. Il est aussi revenu sur la limitation du MaxScore, en expliquant que ce scoring dépend directement de la fréquence du terme dans tous les segments, et que celui pouvait changer lors de l’indexation de nouveaux documents. Il a aussi montré un exemple pratique du WAND ( Weak AND ).  Il a ensuite expliqué brièvement les autres optimizations, comme les Phrase queries, Synonym query, Boolean query.

Il a conclu en expliquant le Feature query, son intégration dans Elasticsearch 7 et comment ca pouvait améliorer significativement les performances.

Le Meet up s’est terminé avec la distribution de pizzas et de bières !

Docker – Les Conteneurs

Par défaut
  • Les Images vs Les Conteneurs
  • Démarrer, arreter, enlever les conteneurs
  • Vérifier les logs et les process des conteneurs

Les Images vs Les Conteneurs

Une image est l’application que nous voulons lancer.

Un conteneur est un processus qui est une instance de cette image.

On peut avoir plusieurs conteneurs qui tournent sous la meme image.

On va utiliser le serveur web Nginx comme image

Le registre par défaut de Docker est appelé le Docker Hub ( hub.docker.com). On peut considérer que les registres sont l’équivalent de Github, mais pas pour le code mais pour les images.

docker container run –publish 80:80 nginx

Explication

  1. Téléchargement de l’image ’nginx’ depuis DockerHub
  2. Démarre un nouveau conteneur depuis cette image
  3. Activation du port 80 sur le hote
  4. Dirige le traffic vers ce conteneur IP, port 80

On peut ensuite faire la commande suivante, qui va permettre au serveur Nginx de continuer de s’éxécuter mais dans l’arrière plan

docker container run –publish 80:80 –detach nginx

Si vous avez une erreur de ce type,

docker: Error response from daemon: driver failed programming external connectivity on endpoint infallible_hofstadter (0c100b5e21cc9f4db69491134180e23fa402a200c359c6a238842c516cded7d4): Error starting userland proxy: Bind for 0.0.0.0:80: unexpected error (Failure EADDRINUSE).

C’est du au fait que le port 80 est utilisé par un autre process, très certainement apache.

Vous pouvez essayer de lancer la commande suivante pour vérifier

sudo lsof -nP | grep LISTEN

Essayez de faire ca si vous n’utilisez pas Apache pour le moment

sudo apachectl stop

Ensuite relancez

docker container run –publish 80:80 –detach nginx

docker container ls

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                        NAMES

0989f8e7eadb        nginx               « nginx -g ‘daemon of… »   7 seconds ago       Up 6 seconds        80/tcp, 0.0.0.0:80->90/tcp   practical_keller

practical_keller est un nom choisi aléatoirement par Docker.

docker container run –publish 80:90 –detach –name TestDockerAjmal nginx

86902e9a10357286a0e27c89e8b7235f7f3353dbeb124763c70201cd89dcd847

docker container ls -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                        NAMES

86902e9a1035        nginx               « nginx -g ‘daemon of… »   54 seconds ago      Created                                          TestDockerAjmal

0989f8e7eadb        nginx               « nginx -g ‘daemon of… »   8 minutes ago       Up 8 minutes        80/tcp, 0.0.0.0:80->90/tcp   practical_keller

Up 8 minutes signifie que le conteneur a bien été lancé.

J’ai ensuite remarqué que Docker n’aime pas que les noms des conteneurs soient en majuscules. J’ai donc renommé le conteneur

docker container rename TestDockerAjmal test_docker_ajmal

sudo lsof -nP | grep LISTEN

Adobe\x20   589                  ajmal   32u     IPv4 0xd33f2473fd1896e9         0t0        TCP 127.0.0.1:15393 (LISTEN)

node        628                  ajmal   15u     IPv4 0xd33f2473fdda36e9         0t0        TCP 127.0.0.1:49270 (LISTEN)

node        628                  ajmal   21u     IPv4 0xd33f2473fdda23e9         0t0        TCP 127.0.0.1:49274 (LISTEN)

com.docke  1874                  ajmal   23u     IPv4 0xd33f2473f5a0a069         0t0        TCP *:80 (LISTEN)

Faites cette commande pour supprimer tout conteneur qui n’est pas démarré.

docker rm $(docker ps -a -q)  ou

docker container rm -f 896

Relancez la commande pour recréer le conteneur en spécifiant un port différent

docker container run –publish 90:90 –detach –name test_docker_ajmal nginx

Ajmals-MacBook-Pro:~ ajmal$ docker container ls -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                        NAMES

c87f189f8fb4        nginx               « nginx -g ‘daemon of… »   4 seconds ago       Up 3 seconds        80/tcp, 0.0.0.0:90->90/tcp   test_docker_ajmal

0989f8e7eadb        nginx               « nginx -g ‘daemon of… »   34 minutes ago      Up 34 minutes       80/tcp, 0.0.0.0:80->90/tcp   practical_keller

Les 2 conteneurs sont UP, c’est à dire qu’ils sont bien démarrés.

Pour stopper les conteneurs, faites ensuite

docker container stop practical_keller

docker container stop test_docker_ajmal

docker container ls -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES

c87f189f8fb4        nginx               « nginx -g ‘daemon of… »   23 minutes ago      Exited (0) 3 seconds ago                        test_docker_ajmal

0989f8e7eadb        nginx               « nginx -g ‘daemon of… »   About an hour ago   Exited (0) 31 seconds ago                       practical_keller

Les statuts ont changé à ’’Exited’’.

Rappel: Lancement d’un conteneur

  1. Recherche l’image localement dans l’Image Cache, s’il le trouve pas, etape 2
  2. Recherche l’image dans le repo image ( Docker Hub )
  3. Télecharge l’image et le sauvegarde
  4. Crée un nouveau conteneur basé sur cette image et le prépare au démarrage
  5. L’assigne un addresse IP virtuel sur le réseau privé à l’intérieur du moteur Docker
  6. Ouvre le port 80 sur l’hote et redirige vers le port 80 dans le conteneur
  7. Démarre le conteneur en utilisant le CMD dans l’image Dockerfile

Docker – Mise en route sur Mac

Par défaut

Docker est une plateforme permettant aux développeurs, et aux administrateurs système de développer, déployer et d’exécuter des applications avec des conteneurs. L’utilisation de conteneurs pour déployer des applications s’appelle la conteneurisation. Les conteneurs ne sont pas nouveaux, mais leur utilisation pour déployer facilement des applications l’est.

La conteneurisation est de plus en plus populaire car les conteneurs sont:

Flexible: Même les applications les plus complexes peuvent être conteneurisées.
Léger: les conteneurs exploitent et partagent le noyau hôte.
Interchangeable: vous pouvez déployer des mises à jour et des mises à niveau à la volée.
Portable: vous pouvez créer localement, déployer sur le cloud et exécuter n’importe où.
Évolutif: vous pouvez augmenter et distribuer automatiquement les réplicas de conteneur.
Empilable: Vous pouvez empiler des services verticalement et à la volée.

Dans ce petit tuto, on va voir comment mettre en place un environment de développement sur Mac pour commencer avec Docker

Il faut tout d’abord télécharger l’application qui se trouve à l’adresse suivante

https://www.docker.com/products/docker-desktop

Téléchargez la version pour Mac et l’installer ( la version CE ou Edge)

Une fois que c’est fait, vous devriez voir l’icone Docker comme ici.

Docker

Ouvrez un terminal en ligne de commande et essayez quelques commandes de Docker.

Exécutez

docker version

pour vérifier que la dernière version est installée.

Ensuite exécutez

docker hello-world

pour vérifier que Docker extrait les images et s’exécute comme prévu.

Docker requiert au moins Yosemite 10.10.3 ( 2014 )

Il n’est pas nécessaire d’avoir un mac très récent car Docker supporte Yosemite.

Idéalement il est bien sur nécessaire d’avoir un mac plus récent pour bénéficier des atouts de Docker Toolbox et aussi d’etre à l’aise avec la performance.

Il ne pas faut utiliser HomeBrew pour installer Docker, car en le faisant de cette facon, seules les utilitaires en lignes de commandes seront installés.

Docker pour Mac : les étapes de Installation

-Installez Docker ( l’étape précédente )

-Adaptez Docker en fonction des paramètres du Mac

-Récupérer un éditeur de code

-Adaptez le terminal

Installez Visual studio code pour Mac

https://code.visualstudio.com/docs/?dv=osx

Installez l’extension Docker sur Visual Studio Code

Screenshot 2018-12-06 at 11.09.25

Installez le bash-completion à l’aide de Homebrew ( ca permet de faire l’auto-complétion des commandes sur le terminal )

Pour bien vérifier que cela a été fait, vous devrez voir

Bash completion has been installed to:

  /usr/local/etc/bash_completion.d

==> Summary

Maintenant il faut lier le bash completion aux ressources suivantes

ln -s /Applications/Docker.app/Contents/Resources/etc/docker.bash-completion /usr/local/etc/bash_completion.d/docker

ln -s /Applications/Docker.app/Contents/Resources/etc/docker-machine.bash-completion /usr/local/etc/bash_completion.d/docker-machine

 ln -s /Applications/Docker.app/Contents/Resources/etc/docker-compose.bash-completion /usr/local/etc/bash_completion.d/docker-compose

Ensuite modifiez le bash profile

Dans le terminal faites

touch ~/.bash_profile

open ~/.bash_profile

Rajoutez ce bout de code

if [ -f $(brew –prefix)/etc/bash_completion ]; then
. $(brew –prefix)/etc/bash_completion
fi

Sauvegardez et relancer le terminal

Essayez

docker container run —

et appuyez 2 fois sur la tabulation

Vous devrez voir une liste de commandes qui s’affichent automatiquement. Si c’est ok, le bash completion est correctement configuré.

Vous etes donc pret pour commencer à utiliser Docker sur votre Mac !