275 lines
12 KiB
HTML
275 lines
12 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Docker et les ebooks sur Twitter</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta name="author" content="wxcafé">
|
|
<link rel="icon" type="image/png" href="//wxcafe.net/theme/img/favicon.ico">
|
|
<!-- Le styles -->
|
|
<link rel="stylesheet" href="//wxcafe.net/theme/css/extra.css" type="text/css" />
|
|
<link rel="stylesheet" href="//wxcafe.net/theme/css/bootstrap.css" type="text/css" />
|
|
<link href='http://fonts.googleapis.com/css?family=Oswald&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
|
|
<script type="text/javascript">
|
|
/* <![CDATA[ */
|
|
(function() {
|
|
var s = document.createElement('script');
|
|
var t = document.getElementsByTagName('script')[0];
|
|
|
|
s.type = 'text/javascript';
|
|
s.async = true;
|
|
s.src = '//api.flattr.com/js/0.6/load.js?'+
|
|
'mode=auto&uid=wxcafe&button=compact&popout=0';
|
|
t.parentNode.insertBefore(s, t);
|
|
})();
|
|
/* ]]> */
|
|
</script> <!-- flattr button loader -->
|
|
<style type="text/css">
|
|
body {
|
|
padding-top: 60px;
|
|
padding-bottom: 40px;
|
|
}
|
|
.sidebar-nav {
|
|
padding: 9px 0;
|
|
}
|
|
.tag-1 {
|
|
font-size: 13pt;
|
|
}
|
|
.tag-2 {
|
|
font-size: 10pt;
|
|
}
|
|
.tag-2 {
|
|
font-size: 8pt;
|
|
}
|
|
.tag-4 {
|
|
font-size: 6pt;
|
|
}
|
|
</style>
|
|
<link href="//wxcafe.net/theme/css/bootstrap-responsive.css" rel="stylesheet">
|
|
<link href="//wxcafe.net/theme/css/font-awesome.css" rel="stylesheet">
|
|
<link href="//wxcafe.net/theme/css/pygments.css" rel="stylesheet">
|
|
<!-- Le fav and touch icons -->
|
|
<link rel="shortcut icon" href="//wxcafe.net/theme/images/favicon.ico">
|
|
|
|
<link href="//wxcafe.net/feeds/feed.rss.xml" type="application/atom+xml" rel="alternate" title="Wxcafé RSS Feed" />
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div class="navbar navbar-fixed-top">
|
|
<div class="navbar-inner">
|
|
<div class="container-fluid">
|
|
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
<span class="icon-bar"></span>
|
|
</a>
|
|
<a class="brand" href="//wxcafe.net/index.html">Wxcafé </a>
|
|
<div class="nav-collapse">
|
|
<ul class="nav">
|
|
<li><a href="//wxcafe.net/archives.html"><i class="icon-th-list"></i> Archives</a></li>
|
|
<li><a href="//wxcafe.net/pages/about/">A propos</a></li>
|
|
<li class="divider-vertical"></li>
|
|
<ul class="nav pull-right">
|
|
</ul>
|
|
</ul>
|
|
</div><!--/.nav-collapse -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="span9" id="content">
|
|
<section id="content">
|
|
<article>
|
|
<header>
|
|
<h1>
|
|
<a href=""
|
|
rel="bookmark"
|
|
title="Permalink to Docker et les ebooks sur Twitter">Docker et les ebooks sur Twitter</a>
|
|
</h1>
|
|
</header>
|
|
<div class="entry-content">
|
|
<div class="well">
|
|
<footer class="post-info">
|
|
<span class="label">Date</span>
|
|
<span class="published" title="2015-02-28T14:11:00+01:00">
|
|
<i class="icon-calendar"></i> Sat 28 February 2015
|
|
</span>
|
|
<br />
|
|
<span class="label">By</span>
|
|
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
|
<br />
|
|
<span class="label">Category</span>
|
|
<a href="//wxcafe.net/category/note/"><i class="icon-folder-open"></i>Note</a>
|
|
<br />
|
|
|
|
|
|
|
|
|
|
</footer><!-- /.post-info --> </div>
|
|
<p>Vous avez peut être déjà entendu parler de <a href="https://www.docker.com/">Docker</a>. Si
|
|
ce n’est pas le cas, voila les bases : Docker est un système de containers. Les
|
|
containers sont une forme particulière de virtualisation, ou le kernel n’est pas
|
|
virtualisé, mais ou les processus du système hôte sont séparés de ceux des
|
|
systèmes invités. Cela est possible depuis longtemps sous FreeBSD avec les <a href="https://www.freebsd.org/doc/en/books/handbook/jails.html">Jails</a>,
|
|
mais n’est devenu possible sous linux que récemment grâce aux <a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">cgroups</a>,
|
|
qui permettent justement de séparer des groupes de processus. Le principe de
|
|
Docker est donc d’avoir une machine hôte sur laquelle s’exécutent plusieurs
|
|
conteneurs Dockers, chacun séparé des autres et de l’hôte, mais utilisant tous
|
|
le même kernel. Cela pose quelques questions en terme de sécurités, puisque la
|
|
séparation est bien plus fine qu’avec de la virtualisation classique. En effet,
|
|
ici, en trouvant un exploit kernel, un attaquant aurait potentiellement la
|
|
capacité de remonter jusqu’à l’hôte, puisqu’il n’est pas vraiment séparé des
|
|
invités. </p>
|
|
<p>Quoi qu’il en soit, Docker permet donc de virtualiser a moindre coût des
|
|
systèmes GNU/Linux. “Mais pourquoi utiliser Docker, dans ce cas”, vous
|
|
demandez-vous peut être, “puisque Xen peut faire la même chose, et plus
|
|
(notamment, Xen est capable de virtualiser autre chose que GNU/Linux)?”. Et bien
|
|
c’est très simple : Docker apporte la simplicité de déploiement d’applications.
|
|
Les conteneurs Dockers peuvent être décrit en un fichier, nommé Dockerfile, qui
|
|
permet de répliquer un conteneur en quelques minutes sur un autre hôte, en une
|
|
commande. Le <a href="https://hub.docker.com">Docker Hub</a> permet aussi de récupérer
|
|
rapidement et facilement un grand nombre d’images déjà configurées. </p>
|
|
<p>Maintenant que nous avons expliqué rapidement ce qu’était Docker, voyons le
|
|
rapport avec les ebooks et Twitter.</p>
|
|
<p>Les comptes dits “ebooks” (le nom vient a l’origine de <a href="https://twitter.com/horse_ebooks">horse_ebooks</a>,
|
|
voir <a href="https://en.wikipedia.org/wiki/Horse_ebooks">ici</a> pourquoi) sont des bots
|
|
twitter utilisant des <a href="https://en.wikipedia.org/wiki/Markov_chain">Chaines de Markov</a>,
|
|
avec les tweets d’un utilisateur “source” comme corpus, pour produire des tweets
|
|
ressemblant a ceux de l’utilisateur source. Nous allons voir maintenant comment
|
|
en installer un.</p>
|
|
<p>C’est, comme disent certaines personnes, “fun”.</p>
|
|
<p>Il existe de nombreuses librairies écrites pour créer ce genre de bots,
|
|
cependant dans ce cas nous nous concentrerons sur
|
|
<a href="https://github.com/mispy/twitter_ebooks">celle-ci</a>, qui est une lib ruby créée
|
|
par <a href="https://twitter.com/m1sp">@m1sp</a>, qui gère pour nous a la fois l’API
|
|
twitter et la génération des messages.</p>
|
|
<p>Cependant, cela n’explique toujours pas le lien avec Docker. Ce lien est très
|
|
simple : nous utilisons un container pour faire tourner les bots. Depuis la
|
|
version 3, la gem twitter_ebooks permet de faire tourner plusieurs bots dans une
|
|
seule instance. Cependant, il est toujours plus sûr d’isoler les bots, et les
|
|
containers dockers permettent de les déployer sur n’importe quelle machine
|
|
(celleux qui ont déjà tenté de mettre en place une application basée sur ruby
|
|
sauront le problème que cela pose habituellement). Pour ce faire, j’ai créé <a href="https://github.com/wxcafe/ebooks_example">un
|
|
repo github</a> qui contient toutes les
|
|
pièces nécessaires pour mettre cela en place : le bot en lui même, les deux
|
|
Dockerfiles, etc.</p>
|
|
<p>Le fonctionnement du bot est
|
|
simple : après avoir installé la gem twitter_ebooks, vous archivez le corpus de
|
|
l’utilisateur source avec <code>ebooks archive <username> <filename></code> (c’est du json)
|
|
, puis vous convertissez le json en fichier utilisable par le bot : <code>ebooks
|
|
consume <filename></code>. Cela fait, démarrer le bot revient a lancer le container :
|
|
<code>docker run -d <container name></code> Pour plus d’informations, allez voir <a href="https://docs.docker.com/articles/basics/">la
|
|
documentation Docker</a></p>
|
|
<p>Bien entendu, dans l’idéal il faudrait mettre a jour les corpus de chaque
|
|
utilisateur régulièrement. Cela est très simple a mettre en place avec un simple
|
|
script cron : </p>
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">00 00 * * * /usr/local/bin/ebooks archive username /usr/local/ebooks/main/corpus/username.json >> /var/log/ebooks/update.log 2>&1
|
|
00 05 * * * cd /usr/local/ebooks/main/ && /usr/local/bin/ebooks consume corpus/username.json >> /var/log/ebooks/update.log 2>&1
|
|
00 10 * * * docker rm -f bots >/dev/null 2>&1
|
|
00 15 * * * docker rmi bots > /dev/null 2>&1
|
|
00 20 * * * cd /usr/local/ebooks/main/ && docker build --rm -t bots . >> /var/log/ebooks/build.log 2>&1
|
|
00 25 * * * docker run -d --name bots bots >> /var/log/ebooks/run.log 2>&1
|
|
</pre></div>
|
|
|
|
|
|
<p>Les 5 minutes entre chaque commande sont laissées pour empécher que deux
|
|
commandes ne s’executent en même temps.</p>
|
|
<p>Et voila, vous avez un container Docker qui fait tourner une application en ruby
|
|
toute sale, et votre système hôte reste propre. Bien sûr, ce n’est qu’un exemple
|
|
des possibilités de Docker : par exemple, on peut aussi faire tourner <a href="https://blog.jessfraz.com/posts/docker-containers-on-the-desktop.html">des
|
|
applications “usuelles”
|
|
dedans</a>,
|
|
puisque l’overhead de Docker est minimal, et beaucoup d’autres applications
|
|
existent.</p>
|
|
</div><!-- /.entry-content -->
|
|
</article>
|
|
</section>
|
|
</div><!--/span-->
|
|
<div class="span3 well sidebar-nav" id="sidebar">
|
|
<ul class="nav nav-list">
|
|
|
|
|
|
<!-- Categories links -->
|
|
<li class="nav-header"><h4><i class="icon-folder-close icon-large"></i> Categories</h4></li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/hacking/">
|
|
<i class="icon-folder-open icon-large"></i>Hacking
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/note/">
|
|
<i class="icon-folder-open icon-large"></i>Note
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/oses/">
|
|
<i class="icon-folder-open icon-large"></i>OSes
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/ranting/">
|
|
<i class="icon-folder-open icon-large"></i>Ranting
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/tutoriel/">
|
|
<i class="icon-folder-open icon-large"></i>Tutoriel
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="//wxcafe.net/category/vidya-games/">
|
|
<i class="icon-folder-open icon-large"></i>Vidya Games
|
|
</a>
|
|
</li>
|
|
<hr>
|
|
|
|
<!-- Social links -->
|
|
<li class="nav-header"><h4><i class="icon-exchange"></i> social</h4></li>
|
|
<a class="FlattrButton" style="display:none;"
|
|
title="//wxcafe.net"
|
|
style="padding-top: 10px;"
|
|
rel="flattr;
|
|
url://wxcafe.net;
|
|
title://wxcafe.net;
|
|
button:compact;
|
|
popout:0;
|
|
uid:wxcafe;
|
|
category:blog;"
|
|
href="//wxcafe.net">flattr</a>
|
|
<li><a href="https://twitter.com/wxcafe"><i class="icon-twitter icon-large"></i> Twitter</a></li>
|
|
<li><a href="https://github.com/wxcafe"><i class="icon-github icon-large"></i> Github</a></li>
|
|
<li><a href="mailto://wxcafe@wxcafe.net"><i class="icon-envelope icon-large"></i> Email</a></li>
|
|
<li><a href="https://pub.wxcafe.net/wxcafe.asc"><i class="icon-key icon-large"></i> Gpg</a></li>
|
|
<li><a href="https://www.openstreetmap.org/relation/105146"><i class="icon-map-marker icon-large"></i> IRL</a></li>
|
|
|
|
<hr>
|
|
|
|
<!-- Links -->
|
|
<li class="nav-header"><h4><i class="icon-external-link"></i> Links</h4></li>
|
|
<li><a href="https://github.com/wxcafe/blog-source"><i class="icon-code icon-large "></i> Source!</a></li>
|
|
<li><a href="http://git.wxcafe.net"><i class="icon-github-sign icon-large "></i> Public Git</a></li>
|
|
<hr>
|
|
|
|
<!--- RSS feed -->
|
|
<li class="nav-header"><h4><i class="icon-rss"></i> feeds</h4></li>
|
|
<li><a href="//wxcafe.net/feeds/feed.rss.xml" rel="alternate"><i class="icon-bookmark-empty icon-large"></i> RSS</a></li>
|
|
<li><a href="//wxcafe.net/feeds/feed.atom.xml" rel="alternate"><i class="icon-bookmark-empty icon-large"></i> Atom</a></li>
|
|
|
|
|
|
</ul> </div><!--/.well -->
|
|
</div><!--/row-->
|
|
<hr>
|
|
<footer>
|
|
<address id="about">
|
|
Proudly powered by <a href="http://pelican.notmyidea.org/">Pelican</a>,
|
|
which takes great advantage of <a href="http://python.org">Python</a>.<br />
|
|
Powered by <a href="https://github.com/getpelican/pelican-themes/tree/master/bootstrap2">bootstrap2</a> theme, thanks!
|
|
</address>
|
|
</footer>
|
|
</div><!--/.fluid-container-->
|
|
</body>
|
|
</html> |