<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>containers Archives - OVHcloud Blog</title>
	<atom:link href="https://blog.ovhcloud.com/tag/containers/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ovhcloud.com/tag/containers/</link>
	<description>Innovation for Freedom</description>
	<lastBuildDate>Wed, 02 Feb 2022 10:49:13 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.ovhcloud.com/wp-content/uploads/2019/07/cropped-cropped-nouveau-logo-ovh-rebranding-32x32.gif</url>
	<title>containers Archives - OVHcloud Blog</title>
	<link>https://blog.ovhcloud.com/tag/containers/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Managing Harbor at cloud scale : The story behind Harbor Kubernetes Operator</title>
		<link>https://blog.ovhcloud.com/managing-harbor-at-cloud-scale-the-story-behind-harbor-kubernetes-operator/</link>
		
		<dc:creator><![CDATA[Maxime Hurtrel]]></dc:creator>
		<pubDate>Tue, 17 Mar 2020 15:18:11 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CNCF]]></category>
		<category><![CDATA[containers]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[harbor]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Public Cloud]]></category>
		<category><![CDATA[registry]]></category>
		<guid isPermaLink="false">https://www.ovh.com/blog/?p=17509</guid>

					<description><![CDATA[Recently, our container platforms team made our &#8220;Private Managed Registry&#8221; service generally available. In this blog post, we will explain why OVHcloud chose to base this service on the Harbor project, built a Kubernetes operator for it, and open sourced it under the CNCF goharbor project. The need for a S.M.A.R.T private registry After our [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fmanaging-harbor-at-cloud-scale-the-story-behind-harbor-kubernetes-operator%2F&amp;action_name=Managing%20Harbor%20at%20cloud%20scale%20%3A%20The%20story%20behind%20Harbor%20Kubernetes%20Operator&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<p>Recently, our container platforms team made our <a href="https://www.ovhcloud.com/en-ie/public-cloud/managed-private-registry/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> &#8220;Private Managed Registry&#8221; service </a> generally available. In this blog post, we will explain why OVHcloud chose to base this service on the Harbor project, built a Kubernetes operator for it, and open sourced it under the CNCF goharbor project.</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" src="https://www.ovh.com/blog/wp-content/uploads/2020/03/7E235649-EEE8-4D3A-ABF7-0A1D6D93942F-1024x537.png" alt="" class="wp-image-17604" width="512" height="269" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/03/7E235649-EEE8-4D3A-ABF7-0A1D6D93942F-1024x537.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/03/7E235649-EEE8-4D3A-ABF7-0A1D6D93942F-300x157.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/03/7E235649-EEE8-4D3A-ABF7-0A1D6D93942F-768x403.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/03/7E235649-EEE8-4D3A-ABF7-0A1D6D93942F.png 1200w" sizes="(max-width: 512px) 100vw, 512px" /></figure></div>



<h2 class="wp-block-heading"><strong>The need for a</strong><a href="https://www.ovhcloud.com/en-ie/about-us/who-are/#text-media-4-2" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><strong> </strong><strong>S.M.A.R.T</strong></a><strong> </strong><strong>private registry</strong></h2>



<p>After our<a href="https://www.ovhcloud.com/en-ie/public-cloud/kubernetes/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> Managed Kubernetes Service release</a>, we received many requests&nbsp; for a fully managed private container registry.</p>



<p>Though a container registry for hosting images may sound quite trivial to deploy, our users mentioned a production-grade registry solution was a critical part of the software delivery supply chain and was actually quite difficult to maintain.</p>



<p>Our customers were asking for an enterprise-grade solution, offering advanced role-based-access-control and security by design, as concerns around vulnerabilities within the publicly available images increased and requirements for content-trust became a necessity.</p>



<p>Users were regularly praising the user interface of services such as the Docker Hub, but at the same time requested a service with high availability and backed by SLA.</p>



<h2 class="wp-block-heading"><strong>The perfect mix of open source and enterprise-grade feature set</strong></h2>



<p>After surveying prospects to fine tune our feature set and pricing model, we searched for the best existing technologies to back it and landed on the<a href="http://goharbor.io" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> CNCF incubating project Harbor</a> (donated to the CNCF by VMWare). In addition to Harbor being one of the few projects to reach CNCF incubation state, thus confirming the strong commitment from the community, it has as well become a key part of several commercial enterprise containerization solutions. We also appreciated the approach taken by Harbor of not re-inventing the wheel but gluing best-of-breed technologies for components such as vulnerability scanning, content trust and many others. It leverages CNCF’s strong network of open source projects and ensures great UX quality levels.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" width="537" height="188" src="https://www.ovh.com/blog/wp-content/uploads/2020/03/B2CA67EE-44B7-4B1A-BA6E-EB3D328F96B2.png" alt="" class="wp-image-17601" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/03/B2CA67EE-44B7-4B1A-BA6E-EB3D328F96B2.png 537w, https://blog.ovhcloud.com/wp-content/uploads/2020/03/B2CA67EE-44B7-4B1A-BA6E-EB3D328F96B2-300x105.png 300w" sizes="(max-width: 537px) 100vw, 537px" /></figure></div>



<p>It was now the time to take this 10k-GitHub-stars technology and adapt it to our specific case : managing tens of thousands of registries for our users, each of them having specific volume of container images and usage patterns.</p>



<p>Of course high-availability (customers&#8217;s software integration and deployment rely on this service) but also data durability were non-negotiable for us.</p>



<p>In addition, Kubernetes to ensure stateless services HA and object storage (based on Openstack Swift and<a href="https://www.ovh.com/blog/ovhcloud-object-storage-clusters-support-s3-api/" data-wpel-link="exclude"> compatible with the S3 API</a>) were evident choices to check those requirements.</p>



<h2 class="wp-block-heading"><strong>Addressing&nbsp; operational challenges at the cloud-provider scale</strong></h2>



<p>Within a few weeks, we opened the service in public beta, quickly attracting hundreds of active users. But with this surge in traffic, we naturally hit our first bottlenecks and performance challenges.</p>



<p>We approached the Harbor user group and team who kindly pointed us to potential solutions, and after some small but key changes to how Harbor handles database connections our issues were resolved. This reinforced our beliefs that the Harbor community is strong and committed to the health of the project and the requirements of its users.</p>



<p>As our service flourished there was no real tooling available to easily accommodate the life-cycle of Harbor instances. Our commitment to the Kubernetes ecosystem made the concept of a Harbor operator for Kubernetes an interesting approach.</p>



<p>We discussed with the Harbor maintainers and they warmly welcomed our idea to develop it, and open source it as the official Harbor Kubernetes Operator. OVHcloud is very proud to have the project now available in the <a href="https://goharbor.io/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">goharbor</a> GitHub project under Apache 2 licensing. This project is another example of our strong commitment towards open source and our willingness to contribute our efforts back to the projects that we love.</p>



<h2 class="wp-block-heading"><strong>A versatile operator designed to accommodate any Harbor deployment</strong></h2>



<p>Readers familiar with the Harbor project may wonder what value this operator brings to the current catalogue of deployments including the Helm Chart version maintained by the project.</p>



<p>The operator design pattern is quickly catching on and mimics an application-centric controller that extends Kubernetes to manage more complex, stateful apps.&nbsp; Simply put, It addresses different use-cases than those of Helm. Whereas the Helm chart offers an all-in-one installer that would also deploy the different dependencies of Harbor (database, cache, etc) from open source Docker images,other enterprises, service operators and cloud providers like us will want to pick-and-choose the service or technology behind those components.</p>



<p>We also aim at extending the current v0.5&nbsp; operator to manage the full life-cycle of Harbor, from deployment to deletion, including scaling, updates, upgrades, and backup management.</p>



<p>This will help production users reach their target SLO, benefit from managed solutions or from existing databases clusters they already maintain for example.</p>



<p>We designed the operator (leveraging the OperatorSDK framework) so that both Harbor optional modules (Helm Chart store, vulnerability scanner etc) and dependencies (registry storage backend, relation and non relational databases, etc) can easily match your specific use case.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" width="1024" height="887" src="https://www.ovh.com/blog/wp-content/uploads/2020/03/69A12D7F-A2B3-45B3-87DB-3A942BC529E4-1024x887.png" alt="" class="wp-image-17611" srcset="https://blog.ovhcloud.com/wp-content/uploads/2020/03/69A12D7F-A2B3-45B3-87DB-3A942BC529E4-1024x887.png 1024w, https://blog.ovhcloud.com/wp-content/uploads/2020/03/69A12D7F-A2B3-45B3-87DB-3A942BC529E4-300x260.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2020/03/69A12D7F-A2B3-45B3-87DB-3A942BC529E4-768x665.png 768w, https://blog.ovhcloud.com/wp-content/uploads/2020/03/69A12D7F-A2B3-45B3-87DB-3A942BC529E4.png 1495w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption> Simplified architecture behind OVHcloud&#8217;d Managed Private Registry service </figcaption></figure></div>



<h2 class="wp-block-heading"><strong>Contributing to Harbor and the operator project</strong></h2>



<p>We already have a roadmap planned with the Harbor maintainers to further enrich the operator to accommodate more than the deployment and destruction phases (for example making Harbor version upgrades more elegant). We look forward to being an integral part of the project and will continue investing in Harbor.</p>



<p>To that end, Jérémie Monsinjon and Pierre Peronnet have also been invited to be&nbsp; maintainers of the Harbor project focusing on <a href="https://github.com/goharbor/harbor-operator" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">goharbor/operator</a> .</p>



<p>In addition to regular contributions to multiple projects we use within OVHcloud, the container-platform team is also working on other major open sources releases, like an official OVHcloud cloud controller for self-managed Kubernetes we plan to deliver in late 2020.</p>



<p></p>



<p>Download Harbor or the Harbor Operator :<a href="http://www.github.com/goharbor" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> Official Harbor Github repo</a></p>



<p>Learn more about Harbor : <a href="http://goharbor.io" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"> Official Harbor website</a></p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fmanaging-harbor-at-cloud-scale-the-story-behind-harbor-kubernetes-operator%2F&amp;action_name=Managing%20Harbor%20at%20cloud%20scale%20%3A%20The%20story%20behind%20Harbor%20Kubernetes%20Operator&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Conteneuriser des bases de données avec Docker… une idée folle ?</title>
		<link>https://blog.ovhcloud.com/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle/</link>
		
		<dc:creator><![CDATA[Alexandre Paul]]></dc:creator>
		<pubDate>Thu, 27 Jul 2017 10:43:00 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[containers]]></category>
		<category><![CDATA[Databases]]></category>
		<guid isPermaLink="false">https://blog.ovhcloud.com/?p=22072</guid>

					<description><![CDATA[OVH propose deux types de bases de données dans le cadre de ses offres d’hébergement web : les bases de données mutualisées et les bases de données privatives « SQL privées ». S’ajoute à cela un troisième type de bases, proposé dans le cadre de la nouvelle offre « Cloud Database ». Nous vous dévoilons [&#8230;]<img src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fconteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle%2F&amp;action_name=Conteneuriser%20des%20bases%20de%20donn%C3%A9es%20avec%20Docker%E2%80%A6%20une%20id%C3%A9e%20folle%20%3F&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></description>
										<content:encoded><![CDATA[
<p>OVH propose deux types de bases de données dans le cadre de ses offres d’hébergement web : les bases de données mutualisées et les bases de données privatives « SQL privées ». S’ajoute à cela un troisième type de bases, proposé dans le cadre de la nouvelle offre « Cloud Database ». Nous vous dévoilons aujourd’hui comment nous administrons ces millions de bases, en nous appuyant sur une implémentation particulière de la technologie de conteneurisation Docker.</p>



<figure class="wp-block-image size-large" id="attachment_11733"><img loading="lazy" decoding="async" width="1024" height="371" src="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-01-1024x371.jpeg" alt="" class="wp-image-22075" srcset="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-01-1024x371.jpeg 1024w, https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-01-300x109.jpeg 300w, https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-01-768x278.jpeg 768w, https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-01.jpeg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Comment OVH a adapté la technologie de conteneurisation Docker pour l’administration de grands volumes de bases de données.</figcaption></figure>



<h2 class="wp-block-heading" id="docker-un-ami-que-l-on-aime-detester">Docker, un ami que l’on aime détester</h2>



<p>Soyons clairs, lorsque nous avons proposé d’héberger des bases de données sous Docker, c’était la panique en interne ! Nous avons retrouvé des sysadmins en pleurs dans les couloirs, tandis que d’autres se réfugiaient sous leur bureau. Mais pourquoi Docker génère-t-il tant de craintes ?</p>



<h3 class="wp-block-heading" id="docker-c-est-stateless-tu-vas-perdre-toutes-tes-donnees"><em>«&nbsp;Docker c’est stateless, tu vas perdre toutes tes données&nbsp;»</em></h3>



<p>Effectivement, Docker a été largement utilisé ces dernières années pour des applications dites stateless. On déploie une API et une fois que celle-ci n’est plus utilisée, on la supprime ou la relance ailleurs car elle ne dépend pas de données présentes sur le host en particulier.</p>



<p>Heureusement pour nous, Docker offre la possibilité d’utiliser des&nbsp;<a href="https://docs.docker.com/engine/tutorials/dockervolumes/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">volumes</a>. Un volume est un répertoire défini pour y stocker les données issues d’un conteneur et ce stockage persiste même lorsque le conteneur est supprimé.</p>



<p>Voici un exemple pour un conteneur MySQL. Le volume correspond au dossier /var/lib/mysql du conteneur.</p>



<pre class="wp-block-code"><code class="">/var/lib/docker/volumes/8a9f45f44164c62b6ab226ac8db6c723aaf2276749f2ec5f8e601e179e298d0e/_data/data# ls -la
-rw-r--r-- 1 - -        0 May  3 11:32 debian-10.1.flag
-rw-rw---- 1 - - 79691776 Jun 20 08:26 ibdata1
-rw-rw---- 1 - -  5242880 Jun 20 08:26 ib_logfile0
-rw-rw---- 1 - -  5242880 Jun 15 21:23 ib_logfile1
drwx------ 2 - -     4096 May 15 16:56 mysql
drwx------ 2 - -     4096 May 15 16:56 performance_schema</code></pre>



<h3 class="wp-block-heading" id="avec-docker-tu-vas-avoir-des-problemes-de-performance"><em>«&nbsp;Avec Docker, tu vas avoir des problèmes de performance&nbsp;»</em></h3>



<p>Nous pourrions nous lancer dans un grand discours, assorti de jolis graphiques, pour vous convaincre. Mais, à vrai dire, ce travail a déjà été fait. Voici un très bon article (en anglais), relatant différents tests effectués avec Docker et MySQL :&nbsp;<a href="http://mysqlserverteam.com/mysql-with-docker-performance-characteristics/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">MySQL with Docker – Performance characteristics</a></p>



<p>Ce qu’il faut en retenir : il n’existe aucune différence de performance entre une instance MySQL hébergée dans un conteneur ou hors de celui-ci. Docker n’est qu’un&nbsp;<a href="https://www.ovh.com/fr/kubernetes/cas-usage.xml" data-wpel-link="exclude">orchestrateur de conteneur</a>, lequel s’appuie sur des fonctionnalités existantes du noyau Linux qui n’impliquent pas ou très peu d’overhead (consommation de ressources supplémentaires engendrée par le processus de conteneurisation).</p>



<p>Lors de nos propres tests, nous avons obtenu des résultats sensiblement équivalents. Alors, circulez il n’y a rien à voir ?</p>



<h3 class="wp-block-heading" id="docker-ce-n-est-pas-stable"><em>«&nbsp;Docker, ce n’est pas stable !&nbsp;»</em></h3>



<p>Malheureusement, c’est plutôt vrai.</p>



<p>Docker a fortement évolué ces dernières années, aussi bien en termes de fonctionnalités que d’architecture. Nous avions, par exemple, dans la version 1.10 un seul et unique exécutable docker qui jouait le rôle de daemon et de client. En version 1.12, vous n’avez pas moins de 7 exécutables différents.</p>



<p>La rapidité avec laquelle les versions de Docker s’enchaînent a du bon, puisque chaque release corrige des bugs plus ou moins critiques et perfectionne le fonctionnement global de la technologie. Le souci, c’est que chaque version est susceptible de contenir de nouveaux bugs, spécifiques à certains usages et donc longs à apparaître.</p>



<p>Il en va ainsi du cas du daemon Docker qui ne répond plus lorsqu’il doit gérer un trop grand nombre de commandes Docker inspect (qui permet d’être renseigné sur les caractéristiques du conteneur) ou de Docker exec (qui permet d’exécuter une commande à l’intérieur du conteneur). Vous pouvez trouver plus de détails sur cette problématique sur le&nbsp;<a href="https://github.com/moby/moby/issues/28889" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">GitHub Docker.</a></p>



<p>La solution pour résoudre ce problème ? Un simple&nbsp;<a href="https://fr.wikipedia.org/wiki/Strace" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">strace</a>&nbsp;sur le processus père de Docker. Car le strace envoie un appel système ptrace, ce qui a pour effet secondaire de libérer l’appel système qui bloque.</p>



<p>Mais il nous fallait une solution plus sérieuse, et exploitable à grande échelle. C’est pourquoi nous avons «&nbsp;fixé&nbsp;» une version précise de Docker, celle présentant la plus grande stabilité dans le cadre de notre usage particulier. Nous avons également dû contourner certaines difficultés. En effectuant moins de Docker inspect par exemple. Et, lorsque nous développons une fonctionnalité, il nous faut garder à l’esprit ces différentes contraintes.</p>



<h3 class="wp-block-heading" id="et-la-securite"><em>«&nbsp;Et la securité ?&nbsp;»</em></h3>



<p>Docker utilise les mêmes mécanismes de sécurité que de la conteneurisation standard (comme&nbsp;<a href="https://linuxcontainers.org/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer">LXC</a>) : des «&nbsp;namespaces&nbsp;» et des «&nbsp;control groups&nbsp;».</p>



<p>Les namespaces permettent, entre autres, d’isoler vos processus à l’intérieur de votre conteneur. Ils ne voient pas ou ne peuvent interagir avec les autres processus de votre host ou des autres conteneurs présents sur ce même host.</p>



<p>Les control groups permettent quant à eux de contrôler vos ressources : limitation en RAM, en écriture sur le disque, en utilisation CPU, etc.</p>



<p>Il reste tout de même un point de vigilance : le daemon de Docker ne doit pas être accessible, que ce soit de l’extérieur par un utilisateur lambda, ou de l’intérieur par un utilisateur système.</p>



<p>Rendre accessible ce daemon, c’est rendre accessible l’ensemble de vos conteneurs et leurs données. Également, cela aurait pour fâcheuse conséquence de créer un point d’entrée dans votre host et votre infrastructure. Et introduire une faille de sécurité dans une image Docker revient inévitablement à voir cette faille multipliée par le nombre de conteneurs sur lesquels l’image est déployée. Raison pour laquelle nous utilisons nos propres images, rigoureusement contrôlées.</p>



<p>Vous pouvez retrouver l’ensemble des points abordés, ainsi que d’autres moyens de sécuriser vos infrastructures dans la&nbsp;<a href="https://docs.docker.com/engine/security/security/#other-kernel-security-features" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">documentation de Docker.</a></p>



<h2 class="wp-block-heading" id="pourquoi-docker-est-notre-ami">Pourquoi Docker est notre ami</h2>



<h3 class="wp-block-heading" id="facilite-d-administration">Facilité d’administration</h3>



<p>Docker garantit que notre image MySQL fonctionnera de la même manière, quel que soit le type de host et d’environnement. Ainsi, les bases de données mutualisées sont hébergées exclusivement sur des serveurs dédiés, tandis que&nbsp; les «&nbsp;SQL Privé&nbsp;» et «&nbsp;CloudDB&nbsp;» tournent respectivement sur des serveurs dédiés et des VM. Mais la même image Docker est utilisée.</p>



<p>Cette image Docker va nous permettre de configurer l’instance MySQL de manière standard. Elle écoutera sur le port 3306, et la configuration se trouvera dans le répertoire par défaut /etc/mysql/my.cnf du conteneur. Si nous voulions installer plusieurs instances MySQL sur un seul host sans conteneurisation, il nous faudrait une configuration par instance MySQL avec un port différent pour chaque instance MySQL.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="620" height="480" src="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-02.png" alt="" class="wp-image-22077" srcset="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-02.png 620w, https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-02-300x232.png 300w" sizes="auto, (max-width: 620px) 100vw, 620px" /></figure></div>



<h3 class="wp-block-heading" id="simplicite-de-maintenance">Simplicité de maintenance</h3>



<p>Dans le cas d’une mise à jour MySQL, nous sommes sûrs que si la mise à jour s’effectue correctement sur un conteneur, elle s’effectuera correctement sur l’ensemble de nos conteneurs exploitant la même image.</p>



<p>Les mises à jour constituent justement un point crucial, car nous savons que sans votre base de données, votre site a très peu de chance de fonctionner correctement. La procédure doit être rapide et sûre !</p>



<p>Voici schématisée notre procédure de mise à jour de MySQL :</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="810" height="620" src="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-03.png" alt="" class="wp-image-22079" srcset="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-03.png 810w, https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-03-300x230.png 300w, https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-03-768x588.png 768w" sizes="auto, (max-width: 810px) 100vw, 810px" /></figure></div>



<p>En moyenne, nous constatons un «&nbsp;downtime&nbsp;» d’une minute par conteneur. Cela correspond au temps nécessaire pour que le conteneur ferme correctement l’application qu’il héberge. Il est déconseillé de fermer trop brutalement une instance MySQL. Le risque de corruption des données existe dans ce cas, nous y reviendrons.</p>



<p><em>A noter que nous utilisons la même méthode pour déplacer un conteneur d’un host vers un autre. La seule différence étant que nous effectuons un rsync des datas avant de stopper le conteneur A, puis après avoir stoppé le conteneur A, afin de garantir la cohérence des données.</em></p>



<h3 class="wp-block-heading" id="rapidite-de-deploiement"><strong>Rapidité de déploiement</strong></h3>



<p>Comme vous le constatez sur le schéma ci-dessus, chaque host va chercher l’image sur un&nbsp;<a href="https://docs.docker.com/registry/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">registry Docker.</a></p>



<p>Pour une plus grande rapidité de déploiement, nous récupérons&nbsp;<a href="https://docs.docker.com/engine/reference/commandline/pull/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">(docker pull)</a>&nbsp;chaque image sur les hosts avant de mettre effectivement en production une nouvelle image. Il nous suffit alors de faire une simple requête HTTPS vers le daemon Docker pour lui indiquer de mettre à jour les images souhaitées, ou de déployer un nouveau conteneur basé sur la nouvelle image.<br>Pour résumer, il nous suffit simplement de placer notre nouvelle image sur le registry pour effectuer la mise en production. On a vu plus compliqué !</p>



<h2 class="wp-block-heading" id="oomkiller-la-bete-noire-des-bases-de-donnees">OOMKiller, la bête noire des bases de données</h2>



<p>Nous avons été confrontés à un souci particulier avec les conteneurs : l’OOMKiller. Cette fonctionnalité kernel permet au noyau Linux de stopper (brutalement) un processus qui dépasse la capacité maximale de mémoire disponible.</p>



<p>Par défaut en cas de dépassement de mémoire, la fonctionnalité&nbsp;<a href="https://fr.wikipedia.org/wiki/Cgroups" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external">cgroups&nbsp;</a>envoie un signal de type SIGKILL au processus du conteneur. Lorsque le processus reçoit ce type de signal, il s’arrête immédiatement sans terminer la moindre action, ce qui peut provoquer une corruption de la base de données et donc des pertes d’informations.</p>



<p>Nous avons expérimenté différentes solutions.</p>



<p>1/ Changer les capacités Linux représentées par l’option «&nbsp;<code>--cap-add</code>&nbsp;» lors de l’instanciation du conteneur.</p>



<pre class="wp-block-code"><code class="">docker run --detach --memory 268435456 --cap-add=SYS_RAWIO</code></pre>



<p>Avec cette «&nbsp;capacité&nbsp;» l’OOMKiller envoie maintenant un signal de type SIGTERM, indiquant au processus de se terminer proprement. Mais cela ne peut marcher, car le processus sature déjà 100 % de la mémoire disponible. Il ne peut donc plus allouer la mémoire nécessaire pour se terminer correctement. On se retrouve alors avec un conteneur bloqué.</p>



<p>2/ Désactiver l’OOMKiller grace à l’option –oom-kill-disable.</p>



<pre class="wp-block-code"><code class="">docker run --detach --memory 268435456 --oom-kill-disable</code></pre>



<p>Dans ce cas-là, notre conteneur ne sera jamais «&nbsp;killed&nbsp;».&nbsp; Cependant, il ne peut obtenir plus de mémoire. De ce fait, il devra attendre que des plages mémoire soient disponibles pour se fermer, plages qui ne seront pas libérées car utilisées par le processus. On se retrouve dans la même situation que précédemment : un conteneur bloqué.</p>



<p>3/ La solution choisie : un deuxième deamon dans le conteneur.</p>



<p>Bien que cela soit contraire aux bonnes pratiques liées à l’utilisation de conteneurs, nous avons introduit un daemon qui se charge de surveiller la mémoire utilisée et d’envoyer lui-même un signal de type SIGTERM pour que le processus se termine correctement. Pour ce faire, le daemon doit envoyer le signal avant que le processus n’utilise toute la mémoire.</p>



<p>Simple ? Pas vraiment ! Car le concept de la mémoire Linux est d’allouer le maximum de mémoire possible, puis de réutiliser cette mémoire : une page libre est une page perdue («&nbsp;A free page is a wasted page&nbsp;»). On obtient vite des conteneurs qui atteignent leur limite sans toutefois la dépasser. Le daemon passe donc son temps à redémarrer les conteneurs…</p>



<p>C’est pour cette raison que nous avons introduit la «&nbsp;soft-limit.&nbsp;»</p>



<pre class="wp-block-code"><code class="">docker run --detach --memory 268435456  --memory-reservation 255013684</code></pre>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="573" height="331" src="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-04.png" alt="" class="wp-image-22080" srcset="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-04.png 573w, https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-04-300x173.png 300w" sizes="auto, (max-width: 573px) 100vw, 573px" /></figure></div>



<p><br>Sur ce graphique, nous pouvons constater la différence d’utilisation de la mémoire par le conteneur avec et sans soft limit. Avec la soft limit, le conteneur vide régulièrement la mémoire non utilisée.</p>



<p>En parallèle nous avons augmenté la mémoire des conteneurs de 5 % et fixé la soft limit 5 % en-dessous de la mémoire définie dans l’offre. Le daemon ne relancera le conteneur qu’ une fois arrivé à la limite fixée dans l’offre, 256 Mo dans notre exemple.<br>De ce fait, il restera 12,8 Mo disponibles au processus pour se terminer correctement. Si au bout de 60 secondes celui-ci n’a pas réussi à se terminer, le daemon envoie un SIGKILL.</p>



<h2 class="wp-block-heading" id="halte-a-la-corruption">Halte à la corruption</h2>



<p>Lorsque nous avons migré l’ensemble de nos clients sur notre nouvelle infrastructure Docker, nous avions énormément d’instances MySQL avec des erreurs InnoDB, de corruption, etc.</p>



<p>Nous avons développé un petit outil qui se sert de toute la mécanique de Docker : «&nbsp;ressurect-container&nbsp;».</p>



<p>La première étape consiste à obtenir un dump MySQL. Sans cela, nous ne pouvons aller plus loin, mais c’est également la garantie que nous récupérerons l’ensemble des données contenues dans l’instance MySQL.<br>Pour ce faire, nous créons un nouveau conteneur avec les mêmes volumes que le conteneur d’origine.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="386" height="428" src="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-05.png" alt="" class="wp-image-22081" srcset="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-05.png 386w, https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-05-271x300.png 271w" sizes="auto, (max-width: 386px) 100vw, 386px" /></figure></div>



<p>Nous réparons ensuite l’ensemble des tables et effectuons un «&nbsp;mysql_check&nbsp;» de l’ensemble de l’instance.<br>Une fois ce dump obtenu, nous coupons l’accès réseau du conteneur et effectuons un nouveau dump afin d’obtenir des données cohérentes.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="573" height="418" src="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-06.png" alt="" class="wp-image-22082" srcset="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-06.png 573w, https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-06-300x219.png 300w" sizes="auto, (max-width: 573px) 100vw, 573px" /></figure></div>



<p>Lorsque le nouveau dump est obtenu, nous recréons un nouveau conteneur «&nbsp;xxxx-new&nbsp;» et nous insérons le dump dans la nouvelle instance MySQL vide.<br>L’ancien conteneur «&nbsp;xxxx-&lt;date&gt;&nbsp;» reste éteint quelques jours afin de pouvoir rollback sur l’opération. Il est ensuite supprimé automatiquement.</p>



<div class="wp-block-image"><figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="573" height="418" src="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-07.png" alt="" class="wp-image-22083" srcset="https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-07.png 573w, https://blog.ovhcloud.com/wp-content/uploads/2022/02/conteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle-07-300x219.png 300w" sizes="auto, (max-width: 573px) 100vw, 573px" /></figure></div>



<p>Cette procédure nous permet de réparer l’ensemble de vos tables et de corriger l’ensemble des erreurs InnoDB de votre instance (corruptions, logs dans le futurs, etc.).</p>
<img loading="lazy" decoding="async" src="//blog.ovhcloud.com/wp-content/plugins/matomo/app/matomo.php?idsite=1&amp;rec=1&amp;url=https%3A%2F%2Fblog.ovhcloud.com%2Fconteneuriser-des-bases-de-donnees-avec-docker-une-idee-folle%2F&amp;action_name=Conteneuriser%20des%20bases%20de%20donn%C3%A9es%20avec%20Docker%E2%80%A6%20une%20id%C3%A9e%20folle%20%3F&amp;urlref=https%3A%2F%2Fblog.ovhcloud.com%2Ffeed%2F" style="border:0;width:0;height:0" width="0" height="0" alt="" />]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
