Comment exécuter Nginx dans un conteneur Docker sur Ubuntu 14.04

introduction

Ce tutoriel montre comment déployer Nginx dans un conteneur Docker.

En conteneurisant Nginx, nous réduisons les frais généraux de notre administrateur système. Nous n’aurons plus besoin de gérer Nginx via un gestionnaire de paquets ni de le construire à partir des sources. Le conteneur Docker nous permet simplement de remplacer l’ensemble du conteneur lorsqu’une nouvelle version de Nginx est commercialisée. Nous n’avons besoin que de gérer le fichier de configuration Nginx et notre contenu.

Nginx se décrit comme:

_ nginx [engine x] est un serveur proxy HTTP et inversé, un serveur proxy de messagerie et un serveur proxy TCP générique, écrit à l’origine par Igor Sysoev. _

Dans la pratique, de nombreux administrateurs système utilisent Nginx pour diffuser du contenu Web, des sites Web à fichiers plats aux API en amont de NodeJS. Dans ce tutoriel, nous servirons une page Web de base afin de pouvoir nous concentrer sur la configuration de Nginx avec un conteneur Docker.

Les conteneurs Docker sont une forme populaire d’une pratique d’exploitation relativement ancienne: la conteneurisation. La conteneurisation diffère de la virtualisation en ce sens que la virtualisation éloigne le matériel, tandis que la conteneurisation éloigne également le système d’exploitation de base. Concrètement, cela signifie que nous pouvons prendre une application (ou un groupe d’applications) et les envelopper dans un ou plusieurs conteneurs pour les rendre modulaires, portables, composables et légers.

Cette portabilité signifie que vous pouvez installer Docker Engine (é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 quiconque s’exécutera dessus.

Si vous voulez en savoir plus sur Docker, vous pouvez consulter un introduction à Docker.

Pour les besoins de cet article, nous installerons Docker Engine sur Ubuntu 14.04.

Nous installerons la version stable actuelle de Docker pour Ubuntu, à savoir la 1.8.1.

Ce didacticiel s’adresse aux utilisateurs de Nginx qui découvrent Docker pour la première fois. Si vous souhaitez uniquement les commandes simples permettant de configurer votre conteneur Nginx, vous pouvez effectuer l’étape 1, puis passer à l’étape 5.

Si vous souhaitez développer votre conteneur étape par étape et en savoir plus sur le mappage de ports et le mode détaché, suivez le didacticiel complet.

Conditions préalables

Pour conteneur Nginx, veuillez compléter ce qui suit:

  • Configurez un serveur Ubuntu 14.04, de préférence avec https: //www.digitalocean. com / communauté / didacticiels / comment-utiliser-ssh-keys-with-digitalocean-droplets [clés SSH] pour la sécurité

  • Configurez un sudo utilisateur

  • Vérifiez la version de votre noyau

Docker 1.8.1 s’appuie sur des fonctionnalités du noyau relativement récentes, assurez-vous donc que le noyau est à * 3.10 * ou supérieur. Une nouvelle image utilisera un noyau assez nouveau, mais si vous avez besoin de vérifier, lancez simplement + uname -r +.

uname -r

Nous avons inclus ci-dessous la sortie d’une nouvelle Droplet Ubuntu 14.04, supérieure à 3.10. Vous ne devriez donc avoir à vous soucier de rien, sauf si vous l’exécutez sur https://www.digitalocean.com/community/tutorials / how-to-update-a-digitalocean-server-s-kernel [ancienne image].

Output3.13.0-57-generic

Étape 1 - Installation de Docker

Docker héberge un script de démarrage pour que Docker soit opérationnel sur votre ordinateur. Nous pouvons simplement exécuter la commande:

sudo curl -sSL https://get.docker.com/ | sh

Une fois cette opération terminée, vous verrez la version installée comme indiqué ci-dessous (votre lecture sera peut-être plus récente; c’est très bien) et quelques instructions pour une exécution en tant qu’utilisateur non root / sans sudo. Cependant, nous suivons ce didacticiel comme avec un utilisateur sudo. Inutile donc de vous en préoccuper pour les besoins de ce didacticiel.

Output    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/amd64

Facultatif: Exécutez le conteneur + hello-world + pour vous assurer que tout fonctionne comme prévu.

sudo docker run hello-world

Vous devriez voir une sortie similaire à celle montrée ci-dessous.

Output    $ 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/

Grâce à cela, nous pouvons plonger dans les bases de Docker.

(Facultatif) Étape 2 - Vérification des bases du conteneur: Exécuter, Répertorier, 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, passez à l’étape 5.

Nous avons installé Docker Client dans le cadre de notre installation de Docker. Nous avons donc accès à l’outil de ligne de commande qui nous permet d’interagir avec nos conteneurs.

Si nous lançons la commande suivante:

sudo docker ps -a

Vous devriez obtenir une sortie semblable à celle-ci;

Output    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
   a3b149c3ddea        hello-world         "/hello"            3 minutes ago      Exited (0) 3 minutes ago

Nous pouvons voir quelques informations de base sur notre conteneur.

Vous remarquerez qu’il a un nom non sensé comme ++; ces noms sont générés automatiquement si vous n’en spécifiez pas lors de la création du conteneur.

Nous pouvons également voir que l’exemple de conteneur + hello-world + a été exécuté il y a 3 minutes et quitté 3 minutes auparavant.

Si nous relançons ce conteneur avec cette commande (en remplaçant ++ par votre propre nom de conteneur):

sudo docker start

Puis exécutez la commande pour lister les conteneurs:

sudo docker ps -a

Nous devrions maintenant voir que le conteneur a été exécuté récemment;

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
a3b149c3ddea        hello-world         "/hello"            4 minutes ago      Exited (0) 9 seconds ago

Par défaut, les conteneurs Docker exécutent les commandes qui leur sont affectées, puis se ferment.

Certains conteneurs seront configurés pour exécuter une liste de tâches et se terminer, tandis que d’autres seront exécutés indéfiniment.

Maintenant que nous avons passé en revue quelques notions de base de Docker, supprimons l’image + hello-world +, car nous n’en aurons plus besoin (rappelez-vous de remplacer ++ par votre nom de conteneur ou d’utiliser votre ID de conteneur). .

sudo docker rm

Ensuite, nous commencerons à utiliser Nginx.

(Facultatif) Étape 3 - Apprendre à exposer le port

Dans cette section, nous allons télécharger l’image Nginx Docker 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 internal du conteneur sur le port de Droplet. C’est ce que cette section vous apprendra!

Tout d’abord, nous aurons l’image Nginx.

Exécutez la commande suivante pour obtenir l’image Nginx Docker:

sudo docker pull nginx

Cela télécharge tous les composants nécessaires pour le conteneur. Docker les mettra en cache. Ainsi, lorsque nous exécutons le conteneur, nous n’avons pas besoin de télécharger les images du conteneur à chaque fois.

Docker gère un site appelé Dockerhub, un référentiel public de fichiers Docker (comprenant à la fois des images officielles et soumises par l’utilisateur). L’image que nous avons téléchargée est l’image officielle de Nginx, ce qui nous évite de devoir créer notre propre image.

Commençons notre conteneur Nginx Docker avec cette commande:

sudo docker run --name docker-nginx -p 80:80 nginx
  • + run + est la commande pour créer un nouveau conteneur

  • L’indicateur + - name + indique comment nous spécifions le nom du conteneur (s’il est laissé vide, un attribut nous est attribué, comme à l’étape 2)

  • + -p + spécifie le port que nous exposons au format + -p local-machine-port: internal-container-port +. Dans ce cas, nous mappons le port 80 du conteneur sur le port 80 du serveur.

  • + nginx est le nom de l’image sur dockerhub (nous l’avions déjà 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 préparer Nginx! Collez l’adresse IP de votre Droplet dans un navigateur Web et vous devriez voir la page «Bienvenue à nginx!» De Nginx.

Vous remarquerez également dans votre session shell que le journal de Nginx est mis à jour lorsque vous adressez des demandes à votre serveur, car nous exécutons notre conteneur de manière interactive.

Frappons le raccourci de pause + 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 fermé notre conteneur. Nous pouvons le vérifier avec cette commande:

sudo docker ps -a

Vous devriez voir quelque chose de similaire à la sortie ci-dessous.

OutputCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
05012ab02ca1        nginx               "nginx -g 'daemon off"   57 seconds ago      Exited (0) 47 seconds ago                       docker-nginx

Nous pouvons voir que notre conteneur Docker est sorti.

Nginx ne sera pas très utile si nous devons être attachés à l’image du conteneur pour que cela fonctionne. Dans la prochaine étape, nous vous montrerons comment détacher le conteneur pour lui permettre de fonctionner de manière indépendante.

Supprimez le conteneur + docker-nginx + existant avec cette commande:

sudo docker rm docker-nginx

Dans l’étape suivante, nous vous montrerons comment l’exécuter en mode détaché.

(Facultatif) Étape 4 - Apprendre à fonctionner 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 nginx

Nous avons ajouté l’indicateur + -d + pour exécuter ce conteneur en arrière-plan.

La sortie doit simplement être l’ID du nouveau conteneur.

Si nous lançons la commande list:

sudo docker ps

Nous allons voir deux choses dans la sortie que nous n’avons jamais vues auparavant.

OutputCONTAINER 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-nginx

Nous pouvons voir que, au lieu de + Exited (0) il y a X minutes + ', nous avons maintenant + Up Environ une minute + `, et nous pouvons également voir le mappage de port.

Si nous revenons à l’adresse IP de notre serveur dans notre navigateur, nous pourrons voir à nouveau la page «Bienvenue sur nginx!». Cette fois, il s’exécute en arrière-plan car nous avons spécifié l’indicateur + -d +, qui indique à Docker d’exécuter ce conteneur en mode détaché.

Nous avons maintenant une instance en cours de Nginx dans un conteneur détaché!

Cependant, il n’est pas encore assez utile, car nous ne pouvons pas éditer le fichier de configuration et le conteneur n’a accès à aucun fichier de notre site Web.

Arrêtez le conteneur en exécutant la commande suivante:

sudo docker stop docker-nginx

Maintenant 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-nginx

Nous allons maintenant passer à la version finale de notre conteneur, avec un arrêt rapide pour générer un fichier de site Web personnalisé.

Étape 5 - Construire une page Web pour servir sur Nginx

Dans cette étape, créera une page d’index personnalisée pour votre site Web. Cette configuration nous permet d’avoir un contenu Web persistant hébergé en dehors du conteneur (transitoire).

Créons un nouveau répertoire pour le contenu de notre site Web dans notre répertoire de base et passons à celui-ci en exécutant les commandes ci-dessous.

mkdir -p ~/docker-nginx/html
cd ~/docker-nginx/html

Créons maintenant un fichier HTML (nous montrons les commandes pour Vim, mais vous pouvez utiliser n’importe quel éditeur de texte de votre choix).

vim index.html

Passez en mode insertion en appuyant sur + i +. Collez le contenu ci-dessous (ou n’hésitez pas à ajouter votre propre balise 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 connaissez le langage HTML, vous constaterez qu’il s’agit d’une page Web super basique. Nous avons inclus une balise + <link> + qui pointe vers un CDN pour Bootstrap (un framework CSS qui donne à votre page Web une collection de styles réactifs). Vous pouvez en savoir plus sur Bootstrap.

Nous pouvons sauvegarder ce fichier maintenant en appuyant sur + ESC +, puis +: wq + et + ENTER +:

  • write (+ w +) indique à Vim d’écrire les modifications dans le fichier

  • quit (+ q +) dit à Vim de sortir

Nous avons maintenant une simple page d’index pour remplacer la page de destination par défaut de Nginx.

Étape 6 - Liaison du 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 le connecterons au contenu de notre site Web sur le serveur.

  • Informations de base sur les volumes; lien vers le contenu permanent du serveur à partir de votre conteneur: *

Docker nous permet de relier des répertoires du système de fichiers local de notre machine virtuelle à nos conteneurs.

Dans notre cas, puisque nous voulons serveurs de pages Web, nous devons donner à notre conteneur les fichiers à restituer.

Nous pourrions copier les fichiers dans le conteneur en tant que partie d’un fichier Dockerfile ou les copier dans le conteneur ultérieurement, 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 de Droplet et le système de fichiers du conteneur. Cela nous permet d’éditer nos fichiers de page Web existants et d’en ajouter de nouveaux dans le répertoire. Notre conteneur y aura automatiquement accès. Si vous souhaitez en savoir plus sur Docker et les volumes, consultez la documentation data volumes.

Le conteneur Nginx est configuré par défaut pour rechercher une page d’index dans + / usr / share / nginx / html +. Ainsi, dans notre nouveau conteneur Docker, nous devons lui donner accès à nos fichiers à cet emplacement.

  • Faire le lien: *

Pour ce faire, nous utilisons l’indicateur + -v + pour mapper un dossier de notre machine locale (+ ~ / docker-nginx / html +) vers 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 nginx

Nous pouvons voir que le nouvel ajout à la commande + -v ~ / docker-nginx / html: / usr / share / nginx / html + est notre lien de volume.

  • + -v + spécifie que nous lions un volume

  • la partie à gauche du +: + est l’emplacement de votre fichier / répertoire sur votre machine virtuelle (+ ~ / docker-nginx / html)

  • la partie à droite du +: + est l’emplacement auquel nous lions dans notre conteneur (+ / usr / share / nginx / html +)

Après avoir exécuté cette commande, si vous pointez maintenant votre navigateur sur l’adresse IP de votre DigitalOcean Droplet, le premier en-tête de * Hello Digital Ocean * (ou toute autre page Web créée à l’étape 5).

Si vous êtes satisfait des autres valeurs 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 d’index et si nous rechargeons la fenêtre de votre navigateur, nous pourrons le voir se mettre à jour en temps réel. Nous pourrions créer ainsi un site complet à partir de fichiers HTML plats si nous le voulions. Par exemple, si nous ajoutions une page + about.html +, nous pourrions y accéder via + http: /// about.html + sans avoir besoin d’interagir avec le conteneur.

(Facultatif) Étape 7 - Utilisation de votre propre fichier de configuration Nginx

Cette section est destinée aux utilisateurs avancés souhaitant utiliser leur propre fichier de configuration Nginx avec leur conteneur Nginx. Ignorez cette étape si vous ne souhaitez pas utiliser de fichier de configuration personnalisé.

Revenons à un répertoire afin de ne pas écrire dans notre répertoire HTML public:

cd ~/docker-nginx

Si vous souhaitez consulter le fichier de configuration par défaut, copiez-le simplement à l’aide de la commande Docker copy:

sudo docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf

Comme nous allons utiliser un fichier + .conf + personnalisé pour Nginx, nous devrons reconstruire le conteneur.

Tout d’abord arrêter le conteneur:

sudo docker stop docker-nginx

Retirez-le avec:

sudo docker rm docker-nginx

Vous pouvez maintenant éditer le fichier par défaut localement (pour servir un nouveau répertoire ou utiliser un + proxy_pass + pour transférer le trafic vers une autre application / conteneur, comme vous le feriez avec une installation Nginx standard). Pour en savoir plus sur le fichier de configuration de Nginx, consultez notre Nginx Config file Guide.

Une fois que vous avez sauvegardé votre fichier de configuration personnalisé, il est temps de créer le conteneur Nginx. Ajoutez simplement un deuxième indicateur + -v + avec les chemins appropriés pour donner à un nouveau conteneur Nginx les liens appropriés à exécuter à 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 nginx

Cette commande crée également des liens dans les pages de site Web personnalisées vers le conteneur.

Veuillez noter que vous devrez redémarrer le conteneur en utilisant une commande + docker restart + si vous apportez des modifications à votre fichier de configuration après le démarrage du conteneur, car Nginx ne recharge pas à chaud si son fichier de configuration est modifié:

sudo docker restart docker-nginx

Conclusion

Vous avez maintenant un conteneur Nginx en cours d’exécution servant une page Web personnalisée.

À partir de là, nous vous recommandons de lire les liens sur la page container de Docker si vous souhaitez en savoir plus sur la liaison de conteneurs à des fins d’utilisation de Nginx en tant que proxy inverse pour servir un autre conteneur. applications web à base de.

Si vous souhaitez gérer un groupe de conteneurs, tel qu’un conteneur d’applications, un conteneur de base de données et ce conteneur Nginx, consultez Docker Compose.