――Le travail en interne utilise souvent la virtualisation de type hôte, mais j'ai ressenti un sentiment de crise si je ne comprenais pas la virtualisation de type conteneur en interne, j'ai donc décidé d'essayer une session d'étude pour résumer les avantages et les inconvénients. pensée. ――Je l'ai fait avec l'espoir que vous pourrez reconnaître ses forces et ses faiblesses en touchant Docker, plutôt que la virtualisation de type conteneur, et avoir l'occasion de le comparer avec les méthodes existantes jusqu'à présent. «Vous avez peut-être souligné que le mode de fonctionnement de votre entreprise est vieux ou mauvais, et que vous le faites toujours, mais vous n'en avez peut-être même pas conscience, vous serez donc exclu du flux du monde. Afin d'éviter de telles critiques et suggestions, nous avons délibérément préparé du matériel à l'extérieur. ――Veuillez indiquer s'il y a des erreurs.
La virtualisation est une technologie qui intègre plusieurs matériels avec des logiciels et reproduit le matériel avec des spécifications gratuites, et utilise une quantité limitée de ressources physiques (CPU, mémoire, disque dur, réseau, etc.) en quantité réelle. C'est pour donner l'impression que les ressources ci-dessus (ressources logiques) sont en cours d'exécution. Qu'est-ce que la virtualisation? https://www.fsi.co.jp/solution/vmware/knowledge/virtualization.html
Cela peut vous faciliter la tâche, mieux utiliser les ressources informatiques excédentaires, augmenter la disponibilité du système et bien plus encore.
En prenant trois méthodes de virtualisation majeures comme exemples, nous résumerons les avantages et les inconvénients ainsi que la comparaison avec les serveurs généraux.
Applications qui s'exécutent sur un système d'exploitation installé directement sur le matériel
Avantages
Une application simple et claire fonctionne --Faible surcharge pour l'exécution des applications
Désavantage
Cela peut avoir un effet indésirable lors du partage des paramètres système entre les applications.
Les ressources informatiques ne peuvent pas être utilisées efficacement (par exemple, pour une application qui ne s'exécute qu'une fois par jour pendant 1 heure, le serveur démarrera en état de veille pendant les 23 heures restantes).
Une méthode d'exécution d'un système d'exploitation invité dans un environnement virtuel qui s'exécute sur un système d'exploitation installé directement sur le matériel
Avantages --Facile à installer même sur des serveurs qui n'utilisaient pas la virtualisation
Désavantage
La surcharge est relativement importante car l'application sur le système d'exploitation invité passe par le système d'exploitation invité et le système d'exploitation hôte lors de l'utilisation de matériel.
--Produits et applications
Une méthode d'exécution d'un logiciel de gestion d'environnement virtuel appelé hyperviseur sur du matériel
Avantages
Comme le système d'exploitation hôte n'est pas utilisé, le matériel peut être directement connecté au système d'exploitation invité.
Moins de surcharge lors de l'exécution d'applications sur le système d'exploitation invité que le type d'hôte
Les hyperviseurs ont souvent une fonction qui facilite la gestion des environnements virtuels.
Désavantage
Étant donné que le système d'exploitation hôte existant ne peut pas être utilisé sur le serveur, il est nécessaire de créer un nouveau serveur avec l'hyperviseur installé.
--Produits et applications
Un moteur de conteneur qui s'exécute en tant que processus s'exécute sur le système d'exploitation hôte et exécute le conteneur en tant qu'application. Virtualiser un processus au lieu d'une machine virtuelle
Avantages
Léger car vous pouvez préparer un environnement virtuel en tant que conteneur
Comme il ne passe pas par le système d'exploitation invité, il démarre rapidement.
Désavantage
Les conteneurs pour différents OS hôtes ne peuvent pas être utilisés (les conteneurs pour Windows OS ne fonctionnent pas sur Linux OS)
Lorsque vous utilisez du matériel, c'est un peu gênant car il y a un équilibre avec le système d'exploitation hôte.
En termes de partage du système d'exploitation avec l'hôte, le degré de liberté est inférieur à la méthode utilisant une machine virtuelle. ――Il s'exécute comme un processus au niveau de la couche application, mais comme l'image Docker décrite plus loin est relativement grande, il est difficile de l'utiliser si le stockage côté hôte est petit.
Les fichiers et les données à enregistrer disparaîtront lorsque le conteneur est supprimé à moins qu'ils ne soient correctement «persistants».
--Produits et applications
Il existe différentes méthodes de virtualisation comme celle-ci, mais cette fois, nous allons vous présenter comment utiliser Docker, qui utilise la virtualisation de type conteneur, pour créer un environnement de développement pour les applications Web.
――La partie moteur du conteneur dans la figure ci-dessus correspond au service docker.
En visant la virtualisation de conteneurs à l'aide d'images et de fichiers Docker
L'avantage sera né. Les images Docker sont préparées à différents niveaux de granularité, du niveau du système d'exploitation au niveau de l'application, et peuvent être créées en fonction des besoins des utilisateurs.
--Si vous souhaitez utiliser un serveur Web: --Utilisez uniquement des images Apache
Je vais vous présenter la procédure pour installer Docker sur le serveur (votre serveur, VPS, etc.)
Il est expliqué en détail ci-dessous, je vais donc l'introduire par extrait.
Introduction à Docker (2nd) -Docker setup, container startup- https://knowledge.sakura.ad.jp/13795/
En supposant CentOS, vous pouvez l'installer avec la commande suivante.
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum install docker-ce
Après le démarrage, l'état est confirmé et le réglage de démarrage automatique du service au moment du redémarrage est également effectué.
# systemctl start docker
# systemctl status docker
# systemctl enable docker
À propos de la différence entre Docker et Docker-CE https://qiita.com/s-suefusa/items/cb3c4044da3b3657dbd0
Obtenez une image du serveur Web et démarrez l'image.
Obtenez une image d'un serveur Web appelé Nginx et confirmez que l'image a été ajoutée comme suit.
# docker pull nginx
# docker images
Démarrez le conteneur en utilisant l'image Nginx acquise. Au démarrage, l'hôte et le port côté conteneur sont associés, et dans l'exemple ci-dessous, le côté hôte 8181 est associé au côté conteneur 80.
# docker run -d --name nginx-container -p 80:80 nginx
Commande: docker stop [CONTAINER ID]
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65ee0bf845dc nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:8181->80/tcp nginx-container
# docker stop 65ee0bf845dc
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65ee0bf845dc nginx "/docker-entrypoint.…" 3 minutes ago Exited (0) 7 seconds ago nginx-container
Commande: docker rmi [CONTAINER ID]
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65ee0bf845dc nginx "/docker-entrypoint.…" 4 minutes ago Exited (0) About a minute ago nginx-container
# docker rm 65ee0bf845dc
65ee0bf845dc
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
L'image utilisée dans le conteneur supprimé reste dans le stockage du serveur lui-même, alors essayez de la supprimer également.
Commande: docker rmi [IMAGE ID]
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f35646e83998 12 days ago 133MB
# docker rmi f35646e83998
Untagged: nginx:latest
Untagged: nginx@sha256:ed7f815851b5299f616220a63edac69a4cc200e7f536a56e421988da82e44ed8
Deleted: sha256:f35646e83998b844c3f067e5a2cff84cdf0967627031aeda3042d78996b68d35
Deleted: sha256:9ae13393c37dce86ebd3ea923033503f2cb8f4d6b28fb554827c518a2d171535
Deleted: sha256:423bc419c558f70051d849a661a7a287b61af2037c4ce24f7bbe433e9fb63f39
Deleted: sha256:4cd04e685e3a8e5697bb91e2e6c6b477bc8c4f9a43f05578af3c0a788f011756
Deleted: sha256:611e1562bc2f489d72961d8e2e37f3097d64d9c5212a68c26aab2ad971c98f6d
Deleted: sha256:d0fe97fa8b8cefdffcef1d62b65aba51a6c87b6679628a2b50fc6a7a579f764c
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Commande: docker attach [CONTAINER ID]
Il peut ne pas être inclus selon l'option -d ou la méthode de description du Dockerfile.
http://(サーバのIPアドレス)
Vous pouvez confirmer que le serveur Web fonctionne en accédant à.
Jusqu'à présent, nous avons décrit comment acquérir et démarrer des images, mais dans le développement Web, il est nécessaire d'organiser les fichiers et les données à afficher après la construction du serveur. À ce moment, comment échanger des fichiers entre le conteneur et l'hôte Il est résumé ci-dessous.
En spécifiant l'option "-v" lors du démarrage du conteneur, il est possible de monter le répertoire côté hôte côté conteneur.
Dans l'exemple nginx précédent, vous pouvez le monter en spécifiant comme suit.
docker run -v /host_path:/container_path -d --name nginx-container -p 80:80 nginx
# docker run -v /root/html:/usr/share/nginx/html -d --name nginx-container -p 80:80 nginx
Créez à l'avance html / index.html
index.html
<!DOCTYPE html>
<html>
<body>
<h1>title</h1>
<p>hoge</p>
</body>
</html>
/ usr / share / nginx / html
Désormais, lorsque vous éditez index.html côté hôte, il sera publié sur le serveur côté conteneur.
Étant donné que le nom peut être résolu par le nom du conteneur à partir du système d'exploitation hôte, vous pouvez également vous connecter par SSH.
Je pense qu'il existe un moyen d'échanger des fichiers en mettant en place un serveur samba ou FTP dans le conteneur.
Il y a différentes choses, mais dans le cas d'un serveur Web, si vous préparez le script de publication sans organiser manuellement les fichiers sous la forme de ramener la source du référentiel et de l'organiser au moment de la construction du conteneur (ou après la construction) Je me sens belle.
Lorsque vous utilisez plusieurs conteneurs, il est difficile de démarrer les conteneurs individuellement, vous pouvez donc éviter ce problème en utilisant docker-compose, etc.
Présentation de Docker Compose Compose est un outil pour les applications Docker qui définissent et exécutent plusieurs conteneurs. Compose utilise un fichier YAML pour configurer les services d'application. Exécutez simplement une commande pour générer et démarrer le service d'application en fonction des paramètres. https://docs.docker.jp/compose/overview.html
Avec Laravel + Docker, vous pouvez utiliser tout Laradock avec un tour, mais je pense qu'il est difficile de saisir les fonctions car vous roulez trop.
Vous pouvez l'installer avec la commande suivante.
※Remarque
Utilisation du dernier numéro de version de Compose dans la commande de téléchargement La commande ci-dessus n'est qu'un exemple, il peut donc déjà s'agir d'un numéro de version plus ancien. Consultez la page de publication du référentiel Compose sur GitHub pour la dernière version.
Communiqués ・ docker / compose https://github.com/docker/compose/releases
# sudo curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# sudo chmod +x /usr/local/bin/docker-compose
# docker-compose --version
docker-compose version 1.27.4, build 40524192
C'est tout. Facile!
Si vous utilisez docker-compose, vous pouvez éviter les problèmes de travaux de construction et de démarrage lors de l'utilisation de plusieurs conteneurs. Créez un fichier appelé docker-compose.yml et configurez les paramètres lors de l'utilisation de plusieurs conteneurs avec YAML.
Cette fois, je décrirai les paramètres d'un conteneur nginx démarré par la commande docker plus tôt.
Nous procéderons sur la base de la structure de répertoires suivante.
Annuaire arbitraire
├ docker-compose.yml
├ Dockerfile
└ /html
└ index.html #Racine de document Nginx
docker-compose.yml est écrit en YAML comme ci-dessous
docker-compose.yml
version: '3' #la magie
services:
nginx: #Le nom du conteneur
build: . #L'emplacement du Dockerfile pour ce conteneur
ports:
- "80:80" #Paramètre pour associer l'hôte 80 au port du conteneur 80
volumes:
- ./html:/usr/share/nginx/html #Paramètres pour monter la racine du document sur l'hôte
Ajouter une description basée sur l'image nginx dans le Dockerfile
Dockerfile
#imgae de base (spécifiez REPOSITORY affiché par la commande docker images)
FROM nginx:latest
Placez le fichier html ʻindex.html à afficher sur la page Web dans la racine du document
. / Html`
Exécutez la commande suivante dans le répertoire contenant le fichier docker-compose.yml du groupe de conteneurs que vous souhaitez démarrer.
# docker-compose up
Si vous souhaitez le démarrer en arrière-plan, ajoutez l'option "-d".
# docker-compose up -d
# docker-compose down
Voici un exemple de description de docker-compose.yml pour l'environnement qui utilise Apache + PHP + MySQL pour les applications Web. (Avec phpmyadmin)
Dans docker-compose.yml, vous pouvez décrire le type de conteneur, le chemin Dockerfile, les paramètres et les options lors du démarrage du conteneur, mais vous devez placer chaque fichier à l'emplacement référencé dans docker-compose.yml. Il y a. Veuillez vous référer au référentiel suivant pour la structure de répertoires telle que dockerfile.
docker-apache-php-mariadb https://github.com/nc30mtd/docker-apache-php-mariadb
docker-compose.yml
version: "3"
services:
#Web
template-web:
container_name: template-web
build: ./setup
privileged: true
volumes:
- ./html:/var/www/html
ports:
- 80:80
depends_on:
- template-db
tty: true
stdin_open: true
# MySQL
template-db:
image: mariadb:latest
restart: always
container_name: template-db
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: templatedb(Soyez prudent ici)
MYSQL_USER: templatedbuser(Soyez prudent ici)
MYSQL_PASSWORD: templatedbpass(Soyez prudent ici)
MYSQL_START_TIMEOUT: 1200000
TZ: 'Asia/Tokyo'
volumes:
- ./database/data:/var/lib/mysql
- ./database/sql:/docker-entrypoint-initdb.d
- ./database/log/mysql:/var/log/mysql
ports:
- 3306:3306
# phpmyadmin
template-phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
PMA_ARBITRARY: 1
PMA_HOST: template-db(Soyez prudent ici)
PMA_USER: templatedbuser(Soyez prudent ici)
PMA_PASSWORD: templatedbpass(Soyez prudent ici)
PMA_PORT: 3306
links:
- template-db
ports:
- 8080:80
volumes:
- ./phpMyAdmin/sessions:/sessions
depends_on:
- template-db
Lors de la configuration d'une application Web commune de serveur Web + PHP + DB
――Ne pas tout emballer dans un seul contenant ――Probablement, le Dockerfile sera compliqué lorsque vous commencerez à tout emballer «Je ne comprends pas même si vous y regardez plus tard. Difficile à réutiliser.
――Je ne fais pas tout moi-même ――Les gens qui sont plus incroyables que vous créent de meilleures images et conteneurs dans le monde.
――Faites au moins un conteneur en le divisant en Web (+ PHP) et DB
Vous pouvez créer un environnement dans lequel le travail progresse relativement rapidement en considérant simplement la combinaison d'images et de conteneurs.
https://www.fsi.co.jp/solution/vmware/knowledge/virtualization.html https://qiita.com/r-tominaga/items/8ac588d603802572185f https://qiita.com/Qiita/items/4ff5873776992f0511d6 https://docs.docker.jp/compose/overview.html https://qiita.com/s-suefusa/items/cb3c4044da3b3657dbd0