Balthazar - Dockerhttps://blog.balthazar-rouberol.com/2016-10-13T00:00:00+02:00Découverte de la command line Docker2016-10-13T00:00:00+02:002016-10-13T00:00:00+02:00Balthazar Rouberoltag:blog.balthazar-rouberol.com,2016-10-13:/decouverte-de-la-command-line-docker<p>Connectez vous sur la machine virtuelle installée en première partie de la journée.</p>
<p>1 - Installez docker</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>su
$<span class="w"> </span>apt-get<span class="w"> </span>install<span class="w"> </span>docker.io
</code></pre></div>
<p>2 - Assurez vous que docker est correctement installé. Si c'est le cas, vous devriez avoir une sortie similaire à celle-ci:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>info
Containers:<span class="w"> </span><span class="m">20</span>
<span class="w"> </span>Running:<span class="w"> </span><span class="m">2</span>
<span class="w"> </span>Paused:<span class="w"> </span><span class="m">0 …</span></code></pre></div><p>Connectez vous sur la machine virtuelle installée en première partie de la journée.</p>
<p>1 - Installez docker</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>su
$<span class="w"> </span>apt-get<span class="w"> </span>install<span class="w"> </span>docker.io
</code></pre></div>
<p>2 - Assurez vous que docker est correctement installé. Si c'est le cas, vous devriez avoir une sortie similaire à celle-ci:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>info
Containers:<span class="w"> </span><span class="m">20</span>
<span class="w"> </span>Running:<span class="w"> </span><span class="m">2</span>
<span class="w"> </span>Paused:<span class="w"> </span><span class="m">0</span>
<span class="w"> </span>Stopped:<span class="w"> </span><span class="m">18</span>
Images:<span class="w"> </span><span class="m">70</span>
Server<span class="w"> </span>Version:<span class="w"> </span><span class="m">1</span>.12.1
Storage<span class="w"> </span>Driver:<span class="w"> </span>aufs
<span class="w"> </span>Root<span class="w"> </span>Dir:<span class="w"> </span>/var/lib/docker/aufs
<span class="w"> </span>Backing<span class="w"> </span>Filesystem:<span class="w"> </span>extfs
<span class="w"> </span>Dirs:<span class="w"> </span><span class="m">153</span>
<span class="w"> </span>Dirperm1<span class="w"> </span>Supported:<span class="w"> </span><span class="nb">true</span>
Logging<span class="w"> </span>Driver:<span class="w"> </span>json-file
Cgroup<span class="w"> </span>Driver:<span class="w"> </span>cgroupfs
Plugins:
<span class="w"> </span>Volume:<span class="w"> </span><span class="nb">local</span>
<span class="w"> </span>Network:<span class="w"> </span>bridge<span class="w"> </span>host<span class="w"> </span>null<span class="w"> </span>overlay
Swarm:<span class="w"> </span>inactive
Runtimes:<span class="w"> </span>runc
Default<span class="w"> </span>Runtime:<span class="w"> </span>runc
Security<span class="w"> </span>Options:
Kernel<span class="w"> </span>Version:<span class="w"> </span><span class="m">3</span>.16.0-4-amd64
Operating<span class="w"> </span>System:<span class="w"> </span>Debian<span class="w"> </span>GNU/Linux<span class="w"> </span><span class="m">8</span><span class="w"> </span><span class="o">(</span>jessie<span class="o">)</span>
OSType:<span class="w"> </span>linux
Architecture:<span class="w"> </span>x86_64
CPUs:<span class="w"> </span><span class="m">1</span>
Total<span class="w"> </span>Memory:<span class="w"> </span><span class="m">3</span>.779<span class="w"> </span>GiB
Name:<span class="w"> </span>gallifrey
ID:<span class="w"> </span>RYUC:5OT6:3JFQ:APQG:QEW7:V7KP:ZDYY:WBBF:LZL5:PSFY:WFEH:MF6V
Docker<span class="w"> </span>Root<span class="w"> </span>Dir:<span class="w"> </span>/var/lib/docker
Debug<span class="w"> </span>Mode<span class="w"> </span><span class="o">(</span>client<span class="o">)</span>:<span class="w"> </span><span class="nb">false</span>
Debug<span class="w"> </span>Mode<span class="w"> </span><span class="o">(</span>server<span class="o">)</span>:<span class="w"> </span><span class="nb">false</span>
Registry:<span class="w"> </span>https://index.docker.io/v1/
WARNING:<span class="w"> </span>No<span class="w"> </span>memory<span class="w"> </span>limit<span class="w"> </span>support
WARNING:<span class="w"> </span>No<span class="w"> </span>swap<span class="w"> </span>limit<span class="w"> </span>support
WARNING:<span class="w"> </span>No<span class="w"> </span>kernel<span class="w"> </span>memory<span class="w"> </span>limit<span class="w"> </span>support
WARNING:<span class="w"> </span>No<span class="w"> </span>oom<span class="w"> </span><span class="nb">kill</span><span class="w"> </span>disable<span class="w"> </span>support
WARNING:<span class="w"> </span>No<span class="w"> </span>cpu<span class="w"> </span>cfs<span class="w"> </span>quota<span class="w"> </span>support
WARNING:<span class="w"> </span>No<span class="w"> </span>cpu<span class="w"> </span>cfs<span class="w"> </span>period<span class="w"> </span>support
Insecure<span class="w"> </span>Registries:
<span class="w"> </span><span class="m">127</span>.0.0.0/8
</code></pre></div>
<p>3 - Listez les commandes disponibles:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker
</code></pre></div>
<p>4 - Listez les images disponibles localement</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>images
</code></pre></div>
<p>5 - Pullez l'image <code>ubuntu</code></p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>pull<span class="w"> </span>ubuntu
</code></pre></div>
<p>6 - Listez les images disponibles localement</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>images
</code></pre></div>
<p>7 - Lancez un <code>echo "hello world!"</code> dans votre image <code>ubuntu</code></p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>run<span class="w"> </span>ubuntu<span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"hello world"</span>
</code></pre></div>
<p>8 - Listez <em>tous</em> les conteneurs. Pourquoi le conteneur est-il en status <code>Exited</code>?</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>ps<span class="w"> </span>-a
</code></pre></div>
<p>9 - Pullez l'image <code>brouberol/nginx</code></p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>pull<span class="w"> </span>brouberol/nginx
</code></pre></div>
<p>10 - Lancez l'image <code>brouberol/nginx</code> avec la commande suivante</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>run<span class="w"> </span>-it<span class="w"> </span>--rm<span class="w"> </span>--name<span class="o">=</span>nginx-1<span class="w"> </span>-p<span class="w"> </span><span class="m">80</span>:80<span class="w"> </span>brouberol/nginx
</code></pre></div>
<p>11 - Lancez un <code>docker run --help</code> et tentez de comprendre les options passées dans la commande précédente</p>
<p>12 - Ouvrez un second terminal et ouvrez une session ssh dans votre VM</p>
<p>13 - Inspectez les conteneurs:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>ps
</code></pre></div>
<p>Vous devriez avoir une sortie telle que</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>docker<span class="w"> </span>ps
CONTAINER<span class="w"> </span>ID<span class="w"> </span>IMAGE<span class="w"> </span>COMMAND<span class="w"> </span>CREATED<span class="w"> </span>STATUS<span class="w"> </span>PORTS<span class="w"> </span>NAMES
76ee1a3f4ce2<span class="w"> </span>brouberol/nginx<span class="w"> </span><span class="s2">"./entrypoint.sh"</span><span class="w"> </span><span class="m">7</span><span class="w"> </span>seconds<span class="w"> </span>ago<span class="w"> </span>Up<span class="w"> </span><span class="m">6</span><span class="w"> </span>seconds<span class="w"> </span><span class="m">0</span>.0.0.0:80->80/tcp<span class="w"> </span>nginx-1
</code></pre></div>
<p>À quoi servait l'option <code>-p 80:80</code> de la commande <code>docker run</code>?</p>
<p>14 - Listez les ports hosts/conteneurs liés a votre conteneur via <code>docker port <id></code> (dans l'exemple précédent, <code><id></code> vallait <code>76ee1a3f4ce2</code>).</p>
<p>15 - Interrogez votre conteneur nginx via <code>curl localhost</code></p>
<p>16 - Recuperez l'IP publique de votre VM via <code>ip -o -4 addr show eth0 | awk '{print $4}' | cut -d'/' -f 1</code></p>
<p>17 - Ouvrez votre navigateur et visitez <code>http://<public_ip></code></p>
<p>18 - Inspectez votre conteneur via la commande <code>docker inspect</code>.</p>
<p>19 - Lancez la commande <code>docker history --no-trunc brouberol/nginx</code> et tentez de comprendre la différence entre l'image <code>nginx</code> de base et l'image <code>brouberol/nginx</code>.</p>
<p>20 - Inspectez le Dockerfile et l'entrypoint utilisés via les commandes suivantes:</p>
<ul>
<li><code>docker exec nginx-1 cat Dockerfile</code></li>
<li><code>docker exec nginx-1 cat entrypoint.sh</code></li>
</ul>
<p>21 - À quoi sert <code>docker exec</code>?</p>
<p>22 - Selon vous, pourquoi utilisons nous un <code>exec</code> dans l'entrypoint? Indice: la commande <code>docker stop</code> envoie un SIGTERM au process PID 1 du conteneur.</p>
<p>23 - Visitez <a href="https://hub.docker.com/explore/">https://hub.docker.com/explore/</a>, et tentez de deployer une autre application officiellement supportée par Docker!</p>