<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker Volume Mount Bind Portainer Swarm Stack Conteneur on slash-root.fr</title><link>https://beta.slash-root.fr/tags/docker-volume-mount-bind-portainer-swarm-stack-conteneur/</link><description>Recent content in Docker Volume Mount Bind Portainer Swarm Stack Conteneur on slash-root.fr</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><lastBuildDate>Wed, 11 Oct 2023 11:25:12 +0200</lastBuildDate><atom:link href="https://beta.slash-root.fr/tags/docker-volume-mount-bind-portainer-swarm-stack-conteneur/index.xml" rel="self" type="application/rss+xml"/><item><title>Docker : Volume bind déguisé</title><link>https://beta.slash-root.fr/docker-volume-bind-deguise/</link><pubDate>Wed, 11 Oct 2023 11:25:12 +0200</pubDate><guid>https://beta.slash-root.fr/docker-volume-bind-deguise/</guid><description>&lt;img src="https://beta.slash-root.fr/docker-volume-bind-deguise/cover.png" alt="Featured image of post Docker : Volume bind déguisé" /&gt;&lt;p&gt;Avec Docker, il y a principalement 2 types de volumes qui sont utilisés :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Les volumes &amp;quot;volume&amp;quot;&lt;/strong&gt; : Permet de stocker un répertoire du conteneur dans un volume docker stocké sur l'host (/var/lib/docker/volumes).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les volumes &amp;quot;bind&amp;quot;&lt;/strong&gt; : Permet de monter un répertoire présent sur l'host dans un conteneur.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personnellement, j'utilise la plupart du temps des volumes de type &amp;quot;bind&amp;quot; afin d'avoir de la persistence pour certaines données d'un conteneur. Par exemple, une base de donnée.&lt;/p&gt;
&lt;p&gt;Le problème que je recontre parfois est la gestion des utilisateurs/groupes propriétaires et des permissions sur les données stockées dans ce type de volume &amp;quot;bind&amp;quot;.&lt;/p&gt;
&lt;p&gt;Avec un volume &amp;quot;volume&amp;quot;, l'avantage est que tout est géré par docker. Par contre, je ne souhaite pas forcément stocker ce volume docker dans /var/lib/docker/volumes de l'host.&lt;/p&gt;
&lt;p&gt;Alors, nous allons voir comment utilisé un volume docker mais qui en faites sera un volume de type bind. Ce que je nomme &lt;u&gt;un volume bind déguisé en volume docker&lt;/u&gt; 🙂&lt;/p&gt;
&lt;h2 id="création-du-volume-docker"&gt;&lt;a href="#cr%c3%a9ation-du-volume-docker" class="header-anchor"&gt;&lt;/a&gt;Création du volume docker
&lt;/h2&gt;&lt;p&gt;Tout d'abord, créer un répertoire local sur l'host qui stockera les données :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -m &lt;span style="color:#ae81ff"&gt;775&lt;/span&gt; -p /srv/docker/volumes/data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis, changer l'utilisateur et groupe propriétaire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown -R $USER:docker /srv/docker/volumes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enfin, créer le volume docker :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker volume create --driver local &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --opt type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;none &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --opt device&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/srv/docker/volumes/data &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --opt o&lt;span style="color:#f92672"&gt;=&lt;/span&gt;bind vol_data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;--driver local&lt;/strong&gt; : Définit le driver docker à utiliser à local (par défaut).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--opt type=none&lt;/strong&gt; : Il est important de bien définir le type à none.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--opt device=&lt;/strong&gt;&lt;HOST_PATH&gt; : Où seront stocké les données du volume sur l'host.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--opt o=bind&lt;/strong&gt; &lt;VOL_NAME&gt;: C'est avec cette option que le volume docker sera en faites un volume bind.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vérifier la création du volume :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker volume list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DRIVER VOLUME NAME
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local vol_data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vérifier les propriétés du volume :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker inspect vol_data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CreatedAt&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2023-10-11T11:15:38+02:00&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Driver&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;local&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Labels&amp;#34;&lt;/span&gt;: null,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Mountpoint&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;/var/lib/docker/volumes/vol_data/_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;vol_data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Options&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;device&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;/srv/docker/volumes/data&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;bind&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Scope&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;local&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un volume nommé &lt;code&gt;vol_data&lt;/code&gt; est à présent disponible pour un conteneur.&lt;/p&gt;
&lt;h3 id="utilisation-du-volume-docker"&gt;&lt;a href="#utilisation-du-volume-docker" class="header-anchor"&gt;&lt;/a&gt;Utilisation du volume docker
&lt;/h3&gt;&lt;h4 id="avec-docker-run"&gt;&lt;a href="#avec-docker-run" class="header-anchor"&gt;&lt;/a&gt;Avec docker run
&lt;/h4&gt;&lt;p&gt;Pour utiliser ce volume docker avec &lt;code&gt;docker run&lt;/code&gt; , comme avec un volume docker &amp;quot;classique&amp;quot;, utiliser l'option &lt;code&gt;--volume vol_data:/data&lt;/code&gt;. Cela montera le volume docker &amp;quot;vol_data&amp;quot; précédement créé dans le point de montage &amp;quot;/data&amp;quot; du conteneur.&lt;/p&gt;
&lt;h4 id="avec-docker-compose"&gt;&lt;a href="#avec-docker-compose" class="header-anchor"&gt;&lt;/a&gt;Avec docker compose
&lt;/h4&gt;&lt;p&gt;Pour utiliser ce volume docker dans un &lt;code&gt;docker-compose.yml&lt;/code&gt;, c'est comme un volume classique :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;services&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;vol_data:/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;vol_data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="portainer"&gt;&lt;a href="#portainer" class="header-anchor"&gt;&lt;/a&gt;Portainer
&lt;/h4&gt;&lt;p&gt;Si portainer est utilisé pour gérer l'hôte docker, le volume apparaitra dans la section &amp;quot;Volumes&amp;quot; de l'interface web. Si vous créez vos conteneurs, services, stacks swarm sur Portainer, vous pourrez l'utiliser sans problème.&lt;/p&gt;
&lt;p&gt;Toutefois, il est impossible de créer ce genre de volume via l'interface web de portainer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Attention cependant au nom du volume que vous lui donner lors de sa création.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Par exemple, je souhaite utiliser un volume docker (qui finalement sera de type bind) dans une stack swarm qui s'appelle &amp;quot;webapp&amp;quot;. Lors de la création du volume, je le nommerai &amp;quot;webapp_vol_data&amp;quot; et dans mon fichier yaml de la stack, j'appelerai ce volume uniquement &amp;quot;vol_data&amp;quot;.&lt;/p&gt;
&lt;p&gt;Si le volume utilisé dans un docker-compose n'est pas bien définit au niveau du nommage, un volume docker &amp;quot;standard&amp;quot; sera alors automatiquement créer à la place et celui-ci sera dans /var/lib/docker/volumes.&lt;/p&gt;
&lt;p&gt;Donc bien penser à vérifier que les données soient au bon endroit sur l'host. Surtout si les données doivent être stockées sur un volume réseau !&lt;/p&gt;</description></item></channel></rss>