Comment exécuter Nginx dans un conteneur Docker sur Ubuntu 14.04
Vous n'utilisez pas Ubuntu 14.04 ?Choisissez une autre version ou distribution.
Introduction
Ce tutoriel montre comment déployer Nginx dans un conteneur Docker.
En containerisant Nginx, nous réduisons notre charge administrative système. Nous n'aurons plus besoin de gérer Nginx via un gestionnaire de paquets ou de le compiler à partir du code source. Le conteneur Docker nous permet de simplement remplacer le conteneur entier lorsqu'une nouvelle version de Nginx est publiée. Nous n'avons besoin de maintenir que le fichier de configuration de Nginx et notre contenu.
Nginx se décrit comme :
nginx [engine x] est un serveur HTTP et proxy inverse, un serveur proxy de courrier, et un serveur proxy TCP générique, écrit à l'origine par Igor Sysoev.
En pratique, de nombreux administrateurs systèmes utilisent Nginx pour servir du contenu web, allant des sites web à fichiers plats aux API en amont en NodeJS. Dans ce tutoriel, nous allons servir une page web de base, afin que nous puissions nous concentrer sur la configuration de Nginx avec un conteneur Docker.
Les conteneurs Docker sont une forme populaire d'une pratique opérationnelle relativement ancienne : la conteneurisation. La conteneurisation diffère de la virtualisation en ce que la virtualisation abstrait le matériel, tandis que la conteneurisation abstrait également le système d'exploitation de base. En termes pratiques, cela signifie que nous pouvons prendre une application (ou un groupe d'applications) et les emballer dans un conteneur (ou des conteneurs) pour les rendre modulaires, portables, composables et légers.
Cette portabilité signifie que vous pouvez installer le moteur Docker (également appelé Docker Core, et même simplement Docker) sur une grande variété de systèmes d'exploitation, et tout conteneur fonctionnel écrit par n'importe qui s'exécutera dessus.
Si vous voulez en savoir plus sur Docker, vous pouvez consulter un tutoriel d'introduction à Docker.
Aux fins de cet article, nous allons installer le moteur Docker sur Ubuntu 14.04.
Nous allons installer la version stable actuelle de Docker pour Ubuntu, qui est la 1.8.1.
Ce tutoriel s'adresse aux utilisateurs de Nginx qui découvrent Docker. Si vous voulez seulement les commandes de base pour configurer votre conteneur Nginx, vous pouvez faire l'Étape 1 puis passer directement à l'Étape 5.
Si vous voulez construire votre conteneur étape par étape et apprendre le mappage des ports ainsi que le mode détaché, suivez tout le tutoriel.
Prérequis
Pour containeriser Nginx, veuillez compléter ce qui suit :
- Configurer un serveur Ubuntu 14.04, de préférence avec des clés SSH pour la sécurité
- Créer un utilisateur sudo
- Vérifiez votre version du noyau
Docker 1.8.1 repose sur certaines fonctionnalités du noyau assez récentes, donc assurez-vous que le noyau est en 3.10 ou supérieur. Une image fraîche exécutera un noyau relativement récent, mais si vous avez besoin de vérifier, il suffit d'exécuter uname -r.
uname -r
Nous avons inclus ci-dessous la sortie d'un Droplet Ubuntu 14.04 neuf, qui est supérieur à 3.10, donc vous n'avez rien à craindre sauf si vous exécutez cela sur une image plus ancienne.
3.13.0-57-genericÉtape 1 — Installer Docker
Docker héberge un script de démarrage pour mettre Docker en route sur votre machine. Nous pouvons simplement exécuter la commande :
sudo curl -sSL https://get.docker.com/ | shEn général, vous ne devriez pas envoyer des scripts aléatoires provenant d'internet vers votre shell ( | sh), car ils pourraient faire à peu près n'importe quoi. Jetez un œil à get.docker.com si vous voulez savoir dans quoi vous vous engagez.
Une fois ceci terminé, vous verrez la version installée comme indiqué ci-dessous (votre affichage peut être plus récent ; cela est correct) et quelques instructions pour exécuter en tant qu'utilisateur non-root/sans sudo. Nous suivons ce tutoriel en tant qu'utilisateur sudo, cependant, donc il n'y a pas besoin de s'inquiéter de cela pour les besoins de ce tutoriel.
Client:
Version: 1.8.3
API version: 1.20
Go version: go1.4.2
Git commit: f4bf5c7
Built: Mon Oct 12 05:37:18 UTC 2015
OS/Arch: linux/amd64
Server:
Version: 1.8.3
API version: 1.20
Go version: go1.4.2
Git commit: f4bf5c7
Built: Mon Oct 12 05:37:18 UTC 2015
OS/Arch: linux/amd64Facultatif : Exécutez le conteneur hello-world pour vous assurer que tout fonctionne comme prévu.
sudo docker run hello-worldVous devriez voir une sortie similaire à celle montrée ci-dessous.
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
535020c3e8ad: Pull complete
af340544ed62: Already exists
library/hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:d5fbd996e6562438f7ea5389d7da867fe58e04d581810e230df4cc073271ea52
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
For more examples and ideas, visit:
https://docs.docker.com/userguide/Avec cela terminé, nous pouvons plonger dans les bases de Docker.
(Optionnel) Étape 2 — Revoir les bases des conteneurs : Exécuter, Lister, Supprimer
Cette section montre comment exécuter un conteneur de base puis le supprimer. Si vous savez déjà comment utiliser Docker en général et souhaitez passer directement à la partie Nginx, allez à l'étape 5.
Nous avons installé le client Docker dans le cadre de notre installation de Docker, donc nous avons accès à l'outil en ligne de commande qui nous permet d'interagir avec nos conteneurs.
Si nous exécutons la commande suivante ;
sudo docker ps -a
Vous devriez obtenir une sortie similaire à la suivante ;
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3b149c3ddea hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago nostalgic_hopperNous pouvons voir quelques informations de base sur notre conteneur.
Vous remarquerez qu'il a un nom absurde comme nostalgic_hopper ; ces noms sont générés automatiquement si vous n'en spécifiez pas un lors de la création du conteneur.
Nous pouvons également voir que dans l'exemple de conteneur hello-world, il a été exécuté il y a 3 minutes et s'est arrêté il y a 3 minutes.
Si nous exécutons à nouveau ce conteneur avec cette commande (en remplaçant nostalgic_hopper par le nom de votre propre conteneur) :
sudo docker start nostalgic_hopperPuis exécutez la commande pour lister les conteneurs :
sudo docker ps -aNous devrions maintenant voir que le conteneur a été exécuté récemment ;
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3b149c3ddea hello-world "/hello" 4 minutes ago Exited (0) 9 seconds ago nostalgic_hopperPar défaut, les conteneurs Docker exécutent les commandes qui leur sont assignées puis se terminent.
Certains conteneurs seront configurés pour exécuter une liste de tâches et se terminer, tandis que d'autres fonctionneront indéfiniment.
Maintenant que nous avons parcouru quelques bases de Docker, supprimons l'image hello-world, puisqu'elle ne nous sera plus nécessaire (n'oubliez pas de remplacer nostalgic_hopper par le nom de votre conteneur, ou utilisez votre ID de conteneur).
sudo docker rm nostalgic_hopperEnsuite, nous commencerons à utiliser Nginx.
(Optionnel) Étape 3 — Apprendre à exposer le port
Dans cette section, nous allons télécharger l'image Docker de Nginx et vous montrer comment exécuter le conteneur afin qu'il soit accessible au public en tant que serveur web.
Par défaut, les conteneurs ne sont pas accessibles depuis Internet, nous devons donc mapper le port interne du conteneur au port du Droplet. C’est ce que cette section va vous apprendre !
D'abord, cependant, nous allons obtenir l'image Nginx.
L'étape 5 contient les commandes finales pour déployer le conteneur complet, donc si vous ne vous souciez pas trop des détails de l'implémentation, vous pouvez y aller directement.
Exécutez la commande suivante pour obtenir l'image Docker de Nginx :
sudo docker pull nginxCela télécharge tous les composants nécessaires pour le conteneur. Docker les mettra en cache, donc lorsque nous exécutons le conteneur, nous n'avons pas besoin de télécharger l'image du conteneur à chaque fois.
Docker maintient un site appelé Dockerhub, un dépôt public de fichiers Docker (comprenant à la fois des images officielles et celles soumises par les utilisateurs). L'image que nous avons téléchargée est celle officielle de Nginx, ce qui nous évite de devoir construire notre propre image.
Commençons notre conteneur Nginx Docker avec cette commande :
sudo docker run --name docker-nginx -p 80:80 nginxrunest la commande pour créer un nouveau conteneur- Le drapeau
--nameest la façon dont nous spécifions le nom du conteneur (s'il est laissé vide, un est attribué pour nous, comme nostalgic_hopper de l'Étape 2) -pspécifie le port que nous exposons dans le format-p port-machine-locale:port-interne-container. Dans ce cas, nous mappons le port 80 dans le container au port 80 sur le serveurnginxest le nom de l'image sur Docker Hub (nous l'avons téléchargée auparavant avec la commande pull, mais Docker le fera automatiquement si l'image est manquante)
C'est tout ce dont nous avons besoin pour mettre Nginx en route ! Collez l'adresse IP de votre Droplet dans un navigateur web et vous devriez voir la page « Welcome to nginx! » de Nginx.
Vous remarquerez également dans votre session de shell que le journal de Nginx est mis à jour lorsque vous effectuez des requêtes à votre serveur, car nous exécutons notre conteneur de manière interactive.
Appuyons sur le raccourci CTRL+C pour revenir à notre session shell.
Si vous essayez de charger la page maintenant, vous obtiendrez une page « connexion refusée ». C'est parce que nous avons arrêté notre conteneur. Nous pouvons vérifier cela avec cette commande :
sudo docker ps -aVous devriez voir quelque chose de similaire à la sortie affichée ci-dessous.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05012ab02ca1 nginx "nginx -g 'daemon off" 57 seconds ago Exited (0) 47 seconds ago docker-nginxNous pouvons voir que notre conteneur Docker s'est arrêté.
Nginx ne sera pas très utile si nous devons être attachés à l'image du conteneur pour qu'il fonctionne, donc à l'étape suivante nous vous montrerons comment détacher le conteneur afin de lui permettre de fonctionner de manière autonome.
Supprimez le conteneur existant docker-nginx avec cette commande :
sudo docker rm docker-nginxDans l'étape suivante, nous vous montrerons comment l'exécuter en mode détaché.
(Optionnel) Étape 4 — Apprendre à exécuter en mode détaché
Créez un nouveau conteneur Nginx détaché avec cette commande :
sudo docker run --name docker-nginx -p 80:80 -d nginxNous avons ajouté le -d pour exécuter ce conteneur en arrière-plan.
La sortie doit simplement être l'ID du nouveau conteneur.
Si nous exécutons la commande list :
sudo docker psNous allons voir quelques éléments dans la sortie que nous n'avons pas vus auparavant.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b91f3ce26553 nginx "nginx -g 'daemon off" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 443/tcp docker-nginxNous pouvons voir qu'au lieu de Exited (0) X minutes ago, nous avons maintenant Up About a minute, et nous pouvons également voir le mappage des ports.
Si nous accédons de nouveau à l'adresse IP de notre serveur dans notre navigateur, nous pourrons voir à nouveau la page « Welcome to nginx ! ». Cette fois, elle s'exécute en arrière-plan parce que nous avons spécifié le paramètre -d, qui indique à Docker d'exécuter ce conteneur en mode détaché.
Nous avons maintenant une instance en cours d'exécution de Nginx dans un conteneur détaché !
Ce n'est pas encore assez utile, cependant, car nous ne pouvons pas modifier le fichier de configuration, et le conteneur n'a accès à aucun de nos fichiers de site web.
Arrêtez le conteneur en exécutant la commande suivante :
sudo docker stop docker-nginxMaintenant que le conteneur est arrêté (vous pouvez vérifier avec sudo docker ps -a si vous voulez en être sûr), nous pouvons le supprimer en exécutant la commande suivante ;
sudo docker rm docker-nginxNous allons maintenant passer à la version finale de notre conteneur, avec un petit arrêt pour générer un fichier de site web personnalisé.
Étape 5 — Créer une page Web à servir sur Nginx
À cette étape, nous allons créer une page d'index personnalisée pour notre site web. Cette configuration nous permet d'avoir un contenu de site web persistant qui est hébergé en dehors du conteneur (transitoire).
Créons un nouveau répertoire pour le contenu de notre site web dans notre répertoire personnel, et déplaçons-nous dedans, en exécutant les commandes indiquées ci-dessous.
mkdir -p ~/docker-nginx/html
cd ~/docker-nginx/htmlMaintenant, créons un fichier HTML (nous montrons les commandes pour Vim, mais vous pouvez utiliser n'importe quel éditeur de texte que vous aimez).
vim index.htmlEntrez en mode insertion en appuyant sur i. Collez le contenu ci-dessous (ou n'hésitez pas à ajouter votre propre balisage HTML).
<html>
<head>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-MfvZlkHCEqatNoGiOXveE8FIwMzZg4W85qfrfIFBfYc= sha512-dTfge/zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz/ixG7ArTxmDjLXDmezHubeNikyKGVyQ==" crossorigin="anonymous">
<title>Docker nginx Tutorial</title>
</head>
<body>
<div class="container">
<h1>Hello Digital Ocean</h1>
<p>This nginx page is brought to you by Docker and Digital Ocean</p>
</div>
</body>
</html>Si vous êtes familier avec HTML, vous verrez qu'il s'agit d'une page web très basique. Nous avons inclus une balise <link> qui est dirigée vers un CDN pour Bootstrap (un framework CSS qui fournit à votre page web une collection de styles responsives). Vous pouvez en savoir plus sur Bootstrap.
Nous pouvons enregistrer ce fichier maintenant en appuyant sur ESC, puis sur :wq et ENTER :
- write (
w) dit à Vim d'écrire les modifications dans le fichier - quit (
q) dit à Vim de quitter
Nous avons maintenant une page d'index simple pour remplacer la page d'accueil par défaut de Nginx.
Étape 6 — Lier le conteneur au système de fichiers local
Dans cette section, nous allons tout mettre ensemble. Nous allons démarrer notre conteneur Nginx afin qu'il soit accessible sur Internet via le port 80, et nous allons le connecter à notre contenu de site Web sur le serveur.
Informations de base sur les volumes ; c’est-à-dire, liens vers le contenu du serveur permanent depuis votre conteneur :
Docker nous permet de lier des répertoires du système de fichiers local de notre machine virtuelle à nos conteneurs.
Dans notre cas, comme nous voulons servir des pages web, nous devons donner à notre conteneur les fichiers à rendre.
Nous pourrions copier les fichiers dans le conteneur dans le cadre d'un Dockerfile, ou les copier dans le conteneur après coup, mais ces deux méthodes laissent notre site web dans un état statique à l'intérieur du conteneur. En utilisant la fonctionnalité de volumes de données de Docker, nous pouvons créer un lien symbolique entre le système de fichiers du Droplet et le système de fichiers du conteneur. Cela nous permet de modifier nos fichiers de page web existants et d'en ajouter de nouveaux dans le répertoire, et notre conteneur y accédera automatiquement. Si vous voulez en savoir plus sur Docker et les volumes, consultez la documentation sur les volumes de données.
Le conteneur Nginx est configuré par défaut pour rechercher une page d'index à /usr/share/nginx/html, donc dans notre nouveau conteneur Docker, nous devons lui donner accès à nos fichiers à cet emplacement.
Faire le lien :
Pour ce faire, nous utilisons le flag -v pour mapper un dossier de notre machine locale (~/docker-nginx/html) à un chemin relatif dans le conteneur (/usr/share/nginx/html).
Nous pouvons accomplir cela en exécutant la commande suivante :
sudo docker run --name docker-nginx -p 80:80 -d -v ~/docker-nginx/html:/usr/share/nginx/html nginxNous pouvons voir que la nouvelle addition à la commande -v ~/docker-nginx/html:/usr/share/nginx/html est notre lien de volume.
-vspécifie que nous associons un volume- la partie à gauche du
:est l'emplacement de notre fichier/répertoire sur notre machine virtuelle (~/docker-nginx/html) - la partie à droite du
:est l'emplacement vers lequel nous faisons le lien dans notre conteneur (/usr/share/nginx/html)
Après avoir exécuté cette commande, si vous pointez maintenant votre navigateur vers l'adresse IP de votre Droplet Linux-Console.net, vous devriez voir le premier en-tête de Hello Digital Ocean (ou la page web que vous avez créée à l'étape 5).
Si vous êtes satisfait des autres paramètres par défaut de Nginx, vous êtes prêt.
Vous pouvez télécharger plus de contenu dans le répertoire ~/docker-nginx/html/, et il sera ajouté à votre site Web en direct.
Par exemple, si nous modifions notre fichier index, et si nous rechargeons notre fenêtre de navigateur, nous pourrons voir la mise à jour en temps réel. Nous pourrions construire tout un site à partir de fichiers HTML plats de cette manière si nous le voulions. Par exemple, si nous ajoutions une page about.html, nous pourrions y accéder à http://votre_ip_de_serveur/about.html sans avoir besoin d'interagir avec le conteneur.
(Facultatif) Étape 7 — Utiliser votre propre fichier de configuration Nginx
Cette section est destinée aux utilisateurs avancés qui souhaitent utiliser leur propre fichier de configuration Nginx avec leur conteneur Nginx. Veuillez ignorer cette étape si vous n'avez pas de fichier de configuration personnalisé que vous souhaitez utiliser.
Revenons en arrière d'un répertoire pour ne pas écrire dans notre répertoire HTML public :
cd ~/docker-nginxSi vous souhaitez jeter un œil au fichier de configuration par défaut, il vous suffit de le copier en utilisant la commande Docker copy :
sudo docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.confPuisque nous allons utiliser un fichier .conf personnalisé pour Nginx, nous devrons reconstruire le conteneur.
Arrêtez d'abord le conteneur :
sudo docker stop docker-nginxRetirez-le avec :
sudo docker rm docker-nginxVous pouvez maintenant modifier le fichier par défaut localement (pour servir un nouveau répertoire, ou pour utiliser un proxy_pass afin de rediriger le trafic vers une autre application/conteneur comme vous le feriez avec une installation Nginx classique). Vous pouvez lire à propos du fichier de configuration Nginx dans notre guide sur le fichier de configuration Nginx.
Une fois que vous avez enregistré votre fichier de configuration personnalisé, il est temps de créer le conteneur Nginx. Il suffit d'ajouter un deuxième drapeau -v avec les chemins appropriés pour donner à un nouveau conteneur Nginx les liens appropriés pour fonctionner à partir de votre propre fichier de configuration.
sudo docker run --name docker-nginx -p 80:80 -v ~/docker-nginx/html:/usr/share/nginx/html -v ~/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginxCette commande lie également encore les pages du site web personnalisé au conteneur.
Veuillez noter que vous devrez redémarrer le conteneur en utilisant la commande docker restart si vous apportez des modifications à votre fichier de configuration après avoir démarré le conteneur, car Nginx ne recharge pas à chaud si son fichier de configuration est modifié :
sudo docker restart docker-nginxConclusion
Vous avez maintenant un conteneur Nginx en cours d'exécution servant une page web personnalisée.
À partir d'ici, nous recommandons de lire sur le lien de conteneurs de Docker si vous souhaitez apprendre à relier des conteneurs entre eux dans le but d'utiliser Nginx comme proxy inverse pour servir d'autres applications web basées sur des conteneurs.
Si vous voulez gérer un groupe de conteneurs, tels qu'un conteneur d'application, un conteneur de base de données et ce conteneur Nginx, jetez un œil à Docker Compose.
