De la sécurité à la ligne d'assemblage de miroir, liste Docker des meilleures pratiques et anti-modèles

Auteur | Timothy Mugayi

Traducteur | ménisque, Zebian | yugao

Photo de couverture | RPSC payé de la Chine télécharger visuelle

Produit | RPSC (ID: CSDNnews)

La plupart du temps l'utilisation des Docker de nous ne se soucient pas de ses travaux internes. Docker seul démarrer un conteneur et laisser l'application d'exécution bien, cela ne signifie pas que vous avez obtenu une bonne solution. Parfois, en raison de contraintes de temps, nous ne pouvons copier et coller miroir Docker, personne ne peut vraiment comprendre les détails de mise en uvre et les nuances de la façon de construire l'image Docker.

Dans cet article, nous allons explorer Docker les meilleures pratiques et anti-modèles. personnes AntiModèle pour des problèmes récurrents de solutions générales, ces programmes inefficaces, voire totalement compenser les avantages apportés par la technologie de la pile Docker.

Regardons ce que notre approche n'est pas souhaitable.

Nous avons besoin de l'étiquette

L'étiquette est essentielle, nous devons transmettre des informations sur Docker miroir par l'étiquette. Vous pouvez Docker l'image des étiquettes d'identité sous un autre nom. marque Git une étiquette particulière est responsable de la présentation et l'étiquette Docker De même, vous pouvez ajouter la version Docker des miroirs sur différents points dans le temps. Oubliez étiquette de jeu est une petite chose, mais il apportera quelques inconvénients, en particulier, si l'étiquette n'est pas spécifiée, l'image par défaut sera marqué comme dernier.

DE your_image_name: dernier

Si vous effectuez fréquemment cette opération, il est probable que le miroir est pas la dernière, peut pointer vers une ancienne version. Par conséquent, utiliser l'étiquette appropriée et conforme aux normes de contrôle une version, telles que le contrôle sémantique version. De cette façon, les utilisateurs peuvent assurer la compatibilité Docker image miroir Docker de la date et l'heure, mais aussi il est prévu d'utiliser la version correcte.

Il y a aussi une situation doit être évitée. Vous pouvez profiter de la dernière étiquette par défaut (par exemple de python3: plus tard), le dernier extrait de l'entrepôt miroir miroir Docker. À première vue, cela semble être une bonne idée, mais il y a un effet secondaire inattendu: Chaque nouvelle demande sera possible de dériver et de construire une image précédente Docker complètement différent. miroir Docker figure à la cause des dommages deviendra très difficile, parce que le miroir doit être immuable. Par conséquent, je recommande fortement l'utilisation d'une étiquette spécifique à l'étiquette miroir (exemple: python3: 1.0.1). Cette méthode garantit que votre Dockerfile reste inchangé.

Exécuter dans le même conteneur plus de services

Bien que vous pouvez exécuter plusieurs services dans le même conteneur, mais je ne recommande pas que vous le faites pour deux raisons. Lorsque vous utilisez un service Docker, nous devons nous efforcer de maintenir l'unité de la responsabilité. En tant que meilleure pratique, chaque portion l'application doit être exécuté dans des récipients séparés, assurez-vous que chaque fonctions séparées sont emballées dans un récipient séparé image séparée.

L'ajout de plusieurs services à une approche miroir Docker semble très attrayant, mais vous ne devriez pas être traité comme un conteneur d'image de machine virtuelle. Un conteneur qui contient plus d'un service, peut entraîner votre application est difficile à l'échelle horizontale. Docker concept de base du conteneur est qu'ils sont transitoires, conçu spécifiquement pour la distribution, ce qui est idéal pour les applications Web modernes, en raison de ses caractéristiques transitoires et l'expansion simultanée sera très facile. Ajouter plus de services augmentera la difficulté de gérer distribuée.

De plus, plusieurs services sur un seul conteneur augmentera la difficulté de gestion de la sécurité. grand miroir peut réduire le taux de CI / CD, vous devez être prudent.

Utilisez le miroir pour classer LABEL

Cela ne peut pas être considéré comme anti-modèles, mais je pense que mentionner la valeur. J'ai remarqué une chose en traitant avec une variété de miroir Docker: Parfois, l'image du créateur n'utilise pas balise du mainteneur LABEL. L'étiquette peut être fournie dans le cas miroir champ Auteur, en cas de problème ou de clarification de besoin, cette balise peut faciliter la compréhension du contact interne avec qui, si le miroir est explicitement partagé, ils peuvent connaître le contact qui les personnes extérieures.

Ce n'est pas le seul label qui peut être utilisé. Vous pouvez être classé, selon la définition de l'information de licence au besoin de miroir pour définir une variété d'étiquettes peuvent également définir des balises pour aider à automatiser.

Dans mainteneur de plus, vous pouvez également utiliser des étiquettes multi-lignes:

# Définissez un ou plusieurs personne labelsLABEL com.example.version = "0.0.1-beta" LABEL Fournisseur1 = "RBTSB Incorporated" LABEL vendor2 = TIPTAPCODE \ IncorporatedLABEL com.example.release jour = "202-04-02" LABEL com .example.version.production = "0.0.1"

Docker 1.10 avant étiquettes d'une ligne crée une nouvelle couche docker, si vous utilisez la dernière version du Docker, vous n'avez pas à vous soucier de créer des couches supplémentaires.

LABEL fournisseur = ACME \ Incorporated \ com.example.is-beta = \ com.example.is production = "" \ com.example.version = "0.0.1-beta" \ com.example.release-date = " 12/02/2015 "

Il faut ajouter autant de métadonnées à la mise en miroir Docker immuable pour faciliter le suivi, améliorer la visibilité et la maintenabilité.

Fiez-environnements spécifiques éviter la construction miroir

Lors de la construction miroir Docker, nous devons toujours garder à l'esprit invariance. Mieux vaut ne pas utiliser avec dev, test, mise en scène et la production de miroirs, car cela saperait le principe d'une seule source. Un autre problème est que, si la vérification ou de débogage dans un environnement différent, cette approche ne peut pas garantir une image similaire.

Pourquoi utiliser un récipient non-Root?

Par défaut, les conteneurs Docker fonctionnent en tant que root. conteneurs Docker fonctionnent comme un contrôle complet de l'utilisateur root du système hôte. Toutefois, pour des raisons de sécurité, je ne recommande pas cette pratique. conteneurs opération non racine Docker miroir une couche de protection supplémentaire, dans un environnement de production est généralement recommandé d'utiliser un récipient non racine. Toutefois, étant donné que ces navires exploités par des utilisateurs non root ne peuvent pas effectuer des tâches qui requièrent des autorisations spéciales. Si vous avez besoin d'utiliser la non-root spécifiée commande USER (comme le montre l'exemple suivant), il nécessite un certain changement de contexte.

DE python: busterLABEL 3,6-slim-mainteneur = « Timothy Mugayi < timothy.mugayi@gmail.com > « RUN apt-get update && apt-get install -y --no-install-recommends \ wget && rm -rf / var / lib / apt lists / / * # Dumb initRUN wget -O / usr / bin local / / muet -init https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64RUN chmod + x / usr / bin local / /-initRUN stupide pip install --upgrade pipWORKDIR / usr / src / appCOPY requirements.txt .RUN pip installer -r requirements.txtCOPY helloworld.py .user 1001ENTRYPOINT

Si vous n'utilisez pas l'image de base générée par la racine, mais la nécessité de revenir à la racine, vous pouvez effectuer les opérations suivantes:

 DE < espace de noms > / < image > : < tag_version > utilisateur root

Ne pas courir trop de processus dans un seul conteneur

Récipient et les avantages des avantages du récipient par rapport aux machines virtuelles qui interagissent les uns avec les autres par une pluralité de récipients pour former une demande complète. On n'a pas besoin d'exécuter l'application entière dans un seul conteneur. Au lieu de cela, nous devrions, autant que possible l'application en plusieurs services, et des services de distribution à plusieurs conteneurs. Cela peut augmenter la flexibilité et une fiabilité maximale.

Ne pas installer le système d'exploitation dans un conteneur

Après une période de Docker, vous êtes susceptible de rencontrer cette situation. Bien que vous pouvez installer et exécuter un système d'exploitation Linux complet dans le conteneur. Mais vous devriez le faire?

Ce ne peut pas être une bonne idée. l'image Docker est construit en utilisant le concept de couches, ajoutant ainsi plus de choses, plus l'image augmentera. Idéal pour un système d'exploitation complet n'est pas l'utilisation Docker. Dans le cas idéal, votre conteneur interne ne devrait charger les composants nécessaires.

Ne pas exécuter les services inutiles dans le conteneur

Pour profiter pleinement du conteneur, vous devez conserver le récipient simplifié possible. Cela améliore les performances pour optimiser et réduire les risques de sécurité. Par conséquent, s'il vous plaît en cours d'exécution est éviter absolument pas les services nécessaires. Par exemple, si pas nécessaire, ne pas exécuter le service SSH dans le conteneur, vous pouvez choisir d'autres moyens (comme Docker exec) Ouvrez une session sur le conteneur.

Ne chargez pas les procédures inutiles dans le conteneur

Vous devez savoir ce anti-modèle. Lors de l'utilisation Docker, beaucoup de gens ont tendance à outils de charge sonar comme dans le miroir, pour assurer une couverture de code et ainsi de suite.

Utilisation du support en plusieurs étapes à partir du mode Docker CE 17.05+ commencer à construire (construit en plusieurs étapes), vous pouvez utiliser plusieurs de l'étape dans Dockerfile en. Récipient temporaire étape de construction est mis au rebut, de sorte que l'image finale sont récipient d'exécution simplifié. Par exemple, lorsque vous avez besoin de compiler le nombre binaire à partir du fichier source, puis copiés sur le miroir dans la phase finale dans le second fichier binaire.

avantages:

  • Construire plus rapide, miroir simplifié permet le temps passé plus rapide lors de la transmission sur le réseau en miroir moins processus CI / CD.
  • Nécessitent moins d'espace de stockage.
  • Démarrage à froid (miroir tirant) plus rapidement.
  • La surface d'attaque potentielle moins.

inconvénients:

  • outils moins dans le conteneur, mais c'est un petit prix pour assurer la rationalisation des conteneurs nécessaires pour payer.

Outil ajoutées pour observation dans le récipient

Même sans solution de surveillance, vous pouvez également exécuter comme contenant d'habitude, mais gardez à l'esprit, en substance, il est difficile de savoir ce qui se passe à l'intérieur du récipient, en particulier augmente avec le nombre de conteneurs.

Docker lui-même vient avec un certain nombre d'indicateurs, il est possible d'exécuter chaque conteneur de CPU divulgué, la mémoire et réseau utilisation E / S, le point final peut être accessible via l'API à distance Docker / statistiques. dynamique App et Newrelic sont deux programmes prêts à l'emploi qui peut être emballé avec l'image Docker, de la santé pour vous aider à comprendre les applications au niveau des applications et des conteneurs.

Reflétant la base de l'amour et de la haine

« Savez-vous qui a construit cette scène, qui ont ajouté quoi que ce soit? »

Ici, c'est traçable. Gardez à l'esprit la sécurité est la direction à tous les développeurs de logiciels devraient efforts. Vous devez savoir comment suivre la source du miroir Docker et voir ce qui est à l'intérieur.

Vous devez garder à l'esprit les points suivants:

  • Miroir ce qui est créé.
  • Vérifiez que le miroir n'a pas été modifié après la création.
  • Vérifiez le contenu du miroir.
  • Y at-il miroir de balayage de vulnérabilité de sécurité.

Nous pouvons réaliser des outils d'analyse statique par un certain nombre de conteneurs. Ces outils sont impliqués dans tous les aspects, il est hors de la portée de cet article, mais je vous suggère de prendre un certain temps pour apprendre.

Clair est un outil intéressant qui peut fournir automatisé la sécurité des conteneurs et l'analyse de vulnérabilité à vos applications Docker. base de données de numérisation en fonction des vulnérabilités publiques et communes (CVE). Si vous utilisez localement Docker, vous pouvez télécharger Postgres, puis connectez Clair à Postgres. Ce qui suit est la configuration minimale requise pour démarrer et exécuter Clair:

$ Mkdir $ PWD / clair_config $ boucle -L https://raw.githubusercontent.com/coreos/clair/master/config.yaml.sample -o $ PWD / clair_config / config.yaml $ run docker -d -e POSTGRES_PASSWORD = "" -p 5432: 5432 postgres: 9,6 $ run docker --net = hôte d -p 6060-6061: 6060-6061 -v PWD / clair_config: / config = quay.io/coreos/clair:latest -config / config / config.yaml

Si vous voulez changer le port Postgres, et assurez-vous de modifier le fichier config.yaml. Si votre système fonctionne encore Postgres, veillez à ne pas docker changer le port à un autre port que 5432.

base de données: Claire: # Base de données driverType: pgsqloptions: # PostgreSQL Chaîne de connexion # https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRINGsource: host = localhost port = 5432 user = postgres password = 123456 sslmode = désactiver statement_timeout = 60000

Une fois le miroir et effectuer, vous pouvez exécuter Docker ps pour confirmer le navire est en cours d'exécution:

Vous ne devez faire attention Clair Web interface utilisateur ou CLI. Vous ne pouvez être utilisé par l'API REST tiers ou des outils CLI.

Bayan Collector est une application d'analyse statique légère, vous pouvez démarrer le conteneur à partir du dépôt miroir pour l'analyse statique, vous pouvez exécuter un script et de recueillir des informations utiles (comme progiciel installé), l'application de la politique, ainsi que l'école en miroir expérience.

Docker Banc pour la sécurité Docker est un outil créé par l'équipe, il se déroulera une liste des meilleures pratiques en matière de sécurité Docker hôte les problèmes éventuels et marqués.

Ne pas stocker des données sensibles dans un miroir de récipient

Assurez-vous d'éviter cette erreur. Si votre image est ouverte au public, ou le promoteur poussé par inadvertance à l'image publique du référentiel d'image Docker, il conduira à la divulgation de la vie privée et des informations sensibles. Rappelez-vous de ne jamais utiliser le copier ou `des informations sensibles dans Dockerfile dans.

Pour éviter cela, placez les données sensibles stockées sur un système de fichiers sécurisé et laissez le conteneur de se connecter. Dans des circonstances normales, cela devrait être sur le système de fichiers hôte où le conteneur, ou similaires peuvent être utilisés par AWS Elastic bloc de stockage (EBS) ou similaire service de stockage de blocs de stockage d'objets S3.

En outre, vous devez éviter de stocker les informations d'identification de sécurité dans l'image Docker. En tant que développeurs, nous adoptons parfois approche paresseuse, le mot de passe codés en dur et la clé privée dans le code. Vous devez vous habituer au paramètre -e pour spécifier la variable d'environnement contenant Docker lors de l'exécution.

Vous pouvez également fichier env, lit des variables d'environnement à partir du fichier. Obtenir des informations d'identification par CMD à partir de sources tierces ou `scripts personnalisés peuvent également être utilisés pour obtenir les informations d'identification pertinentes requises conteneurs Docker.

Ne pas stocker les données dans un conteneur ou les journaux

Modification de la nature du conteneur du journal. Le conteneur est transitoire, état non idéal de l'application. Pour l'essentiel, devrait être de courte durée toutes les données stockées dans le conteneur en cours d'exécution, vous avez peut-être remarqué que lorsque le récipient est fermé, les données seront perdues. Par conséquent, la pratique des données stockées en dehors conteneur Docker est plus digne de louange. Il y a des outils qui peuvent vous aider à extraire Docker journal et le lieu de stockage de données plus permanente.

En traitant Docker journal de garder à l'esprit que: Docker ont au moins trois niveaux de l'exploitation forestière que les conteneurs Docker, le service Docker et le système d'exploitation hôte, vous choisissez la méthode d'enregistrement doit être en mesure d'extraire tous les niveaux de journaux.

Ne pas écrire dans le système de fichiers du conteneur

Écrit le contenu de chaque conteneur du système de fichiers activera la stratégie « copy-on-write ». Il utilisera le pilote de stockage (deviermapper, overlayfs ou autre lecteur) pour créer un nouveau niveau de stockage. Dans la pratique, ce magasin entraînera une pression énorme, en particulier dans le cas d'utilisation ou BTRFS carte des périphériques.

L'écriture des données pour assurer que le seul volume de la cuve. Pour les petits fichiers temporaires tmpfs peuvent être écrites, car le fichier temporaire qui existe tmpfs seule partition mémoire ou d'un swap système.

Ne pas exécuter PID 1

Beaucoup de gens ne savent pas que ce soit un problème commun.

Docker est pas responsable des pistes propres process up processus enfant par init de processus, de sorte que le récipient peut se produire processus zombie, conduisant à des erreurs inattendues.

Utilisation ou dumb-init tini

PID 1 est très spécial sur Unix, et donc ignorée dans le système d'initialisation, il se traduit généralement par traitement de signal et de traitement d'erreur. Cela peut conduire à un conteneur similaire ne peut pas arrêter avec élégance, ou devrait détruire les fuites apparues des vaisseaux et d'autres problèmes.

processus Zombie signifie que les opérations ont été arrêtées, mais le processus occupent toujours des positions dans la table des processus, parce que leurs appels de processus parents attendent appel système n'est pas récupéré. En théorie, chaque fin du processus sera très brièvement présenté l'état de zombie, mais un processus d'état de zombie va se poursuivre pendant longtemps.

Si un processus génère un nouveau processus, mais il est pas bon pour le traitement du signal, le signal ne peut pas être capturé et mettre fin à ses processus enfants, vous pouvez utiliser Tini ou init stupide. Par exemple, le script bash ne peut pas traiter ou signaux de libération correctement.

Voici un exemple d'initialisation exécuter muet, qui peut être commande de script shell prepare.sh peut également être utilisé pour exécuter l'application:

RUN wget -O / usr / bin local / / muet-init https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64 RUN chmod + x / usr / local / bin / init muet ENTRYPOINT

Si vous choisissez ou tini exemplaire, référence peut être utilisé Python Anaconda Conda les éléments suivants:

RUN Conda installer --yes -c Conda-forge tini ENTRYPOINT

Enfin, il est un exemple plus général, il ne dépend pas de tout langage de programmation:

À partir de noeud: 13.12.0-slim Timothy MAINTAINER Mugayi < timothy.mugayi@gmail.com > ENV TINI_VERSION = 'v0.13.0' # Ajouter tini init, voir https://github.com/krallin/tiniADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini / tini RUN chmod + x / tini # Set tini comme entrypointENTRYPOINT

Utilisez le contrôle du format Dockerfile dans CI / CD

Avec les langages de programmation, Docker également formater outil de vérification.

L'outil de vérification de format présente de nombreux avantages, car il vous oblige à utiliser les meilleures pratiques. Ajout le format CI / CD lors de l'inspection, l'équipe peut aider à éviter les erreurs communes, et d'établir les meilleures pratiques lors de la construction des produits d'image Docker. Peut commencer hadolint, ceci est un travail écrit dans l'outil de vérification de format Haskell Dockerfile, capable de résoudre Dockerfile à AST et effectuer des contrôles réguliers sur l'AST.

Lançons un échantillon. Pour formater Docker vérifier, vous pouvez exécuter la commande suivante:

$ Docker exécuter --rm -i hadolint / hadolint <  Dockerfile

Les résultats suivants sont affichés après la fin des formats de contrôle:

Figure ci-dessus le code d'erreur DL3008 "Pin" Code d'erreur Description hadolint de l'état. Version fixe peut être forcé pour construire le package installer une version spécifique du temps, peu importe ce que le cache oui. Cette technique permet de réduire la dépendance causée par des changements inattendus dans les erreurs de construction du paquet.

Les dernières pensées

Dans cet article, nous avons parlé beaucoup de contenu, couvrant tout de la sécurité au pipeline d'image Docker.

Il existe de nombreuses techniques que vous pouvez faire l'image Docker meilleur et plus sûr. J'espère que cet article peut vous donner une source d'inspiration pour vous aider à comprendre ce qu'il faut faire, quoi ne pas faire, et de fournir des solutions tout en construisant une écriture miroir interne ou externe des conteneurs Docker qui peuvent vous être appliquées.

Lien original:

https://medium.com/better-programming/docker-best-practices-and-anti-patterns-e7cbccba4f19

Cet article est une traduction de l'article RPSC, s'il vous plaît indiquer la source.

avantages Aujourd'hui

Lu Qi a rencontré

Par ailleurs, une part importante de « millions de gens apprennent AI » est, 2020 AIProCon Developers Conference les gens vont vivre à travers des formulaires en ligne, ce qui permet aux développeurs à 3 Juillet à 4-stop pour en savoir plus sur l'IA actuel de la technologie de pointe la recherche, la technologie de base et des applications ainsi que l'expérience pratique dans le cas d'une entreprise, mais peuvent également participer à une variété de développeur en ligne passionnant Sharon et les projets de programmation. Potentiels comportait une série d'activités, l'interaction en direct, non seulement peuvent communiquer avec des dizaines de milliers de développeurs, ainsi que la chance de gagner des cadeaux exclusifs en direct, du café et même grand blé technologie.

JavaScript premier rang, code VS les plus populaires, les développeurs sujet brûlant Exposed
Précédent
Pourquoi les fabricants utilisent la langue de GO? Lisez les sections linguistiques GO
Prochain
Programmation porteuse de carrière 21, qui est intervenu sur ma fosse
programmeur âgé de 37 ans à couper! 120 jours pour trouver du travail? Vous ne voulez pas être éliminé, cela pourrait être votre dernière chance
Quel pot chaud de Chongqing est fort, Python vous aide à explorer la boutique
L'une des 35 personnes âgées de moins de 35 innovation scientifique et technologique, la mission des États-Unis pour déverrouiller pointe le Dr AI de l'iceberg
les gens! Recruter la connaissance de l'entrevue MySQL doit maîtriser les huit points
Au cours de ces années, la fosse de Java sur laquelle nous avons marché
L'open source ne peut que se faire des amis?
Serverless houleuse, pourquoi Ali, Microsoft, AWS ont adopté OAM open source?
Google aussi « serrer la ceinture » pour vivre une
5G infrastructures: comment faire des centaines de millions d'utilisateurs pour soutenir de façon transparente IPv6?
Vraiment parler | « Terreux CP » Ce qui est plus fort? S'il vous plaît retrouver un jour Hu et Zhang Yunlong
Planting Grass Ji | Maquillage des lèvres riche, veuillez également Kendall et Hyun Ya Innocent