[RUBY] Maintenant que vous avez déployé AWS avec Rails On Docker, organisons le contenu.

Rapport récent

** Finalement! !! !! !! !! ** ** J'ai mis des rails dans un conteneur Docker et je l'ai déployé. Cela a pris environ 3 semaines ou plus! En ce qui concerne la recherche d'emploi, le désir est toujours recherché, mais je pense que la réaction de Green s'est améliorée. Est-ce un signe de récupération de Corona? Récemment, j'ai eu l'opportunité d'interviewer une entreprise avec un bon super bien-être, mais cela n'a pas été possible en raison du manque de recherche d'entreprise. J'ai été bosselé pendant environ deux jours, mais je pense que ce fut une expérience qui a entraîné une grande croissance dans ma préparation aux entretiens, et je ferai de mon mieux pour trouver une entreprise qui me convient.

Sujet du jour

Faisons un mémorandum de docker équipé de rails

Matériel auquel il est fait référence avant le déploiement

☆ Référence de déploiement ☆ Utilisé pour étudier la construction de l'environnement local Cet article a été particulièrement utile pour créer des conteneurs J'ai fabriqué un conteneur et je l'ai cassé, alors j'ai beaucoup organisé

environnement

ruby 2.5.1 rails 5.2.3 Mac OS docker for mac

Flux de création approximatif

・ Divers éléments tels que le fichier docker sont installés dans le portefeuille créé par les rails ← Cette section résume le contenu ・ Construisez et vérifiez si cela fonctionne dans l'environnement local ・ Télécharger sur Github ・ Tirez vers EC2 En ce qui concerne le déploiement, je n'ai pas l'impression de pouvoir écrire l'article ☆ ci-dessus, je vais donc l'omettre

model

Structure du répertoire


$ tree 

├── app-...réduction
├── Dockerfile
├── containers(Il n'y a pas de problème même si ce dossier n'est pas séparé) --- nginx
│                                     ├── Dockerfile
│                                     └── nginx.conf
├── Gemfile
├── Gemfile.lock
├── docker-compose.yml
・
réduction

Pour expliquer aux débutants Docker qui viennent de terminer le camp technique, si tous les environnements où l'application fonctionne sont préparés dans la boîte (cadre bleu dans l'image), l'environnement de production et l'environnement local peuvent être construits. Vous n'avez pas à le faire un par un, il suffit de le remplacer, non? Je me sens comme. Un autre avantage est que vous pouvez partager l'environnement préparé par Docker sans vous soucier de la version ou du système d'exploitation différent pour chaque ordinateur.

Le conteneur lance le conteneur Rails et le conteneur Nginx, les reçoit chez l'hôte local de Nginx, communique avec puma et se connecte aux rails.

Dockerfile C'est un dessin de conception du conteneur. ** Entrez ce qu'il faut mettre dans le conteneur, quel fichier lire et quoi faire. ** Il existe un fichier docker pour chaque conteneur. Celui que j'ai déployé cette fois a deux fichiers docker, vous pouvez donc le considérer comme deux conteneurs. Le conteneur est construit sur la base du Dockerfile.

Au début, le mécanisme était rafraîchissant car il n'y a que des mots que je n'entends pas dans le camp technologique, comme des images et des constructions.

 .Dockerfile (conteneur de rails)


FROM ruby:2.5.1 

#Mettre à jour le référentiel et installer les modules dépendants
RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       nodejs \
vim ← Nécessaire lors de l'utilisation de vim dans un conteneur
* La dernière version des rails nécessite webpacker, vous devez donc l'installer séparément.
Veuillez vous référer à la vidéo "J'ai gagné le docker" sur youtube.

#Créez un répertoire de travail avec le nom webapp directement sous la racine (répertoire de l'application dans le conteneur)
RUN mkdir /webapp ← Cela fonctionne même si ce n'est pas fou. webapp peut être n'importe quel nom
WORKDIR /webapp

#Copier l'hôte Gemfile dans le conteneur
ADD Gemfile /webapp/Gemfile
ADD Gemfile.lock /webapp/Gemfile.lock 
* Application Gemfile.Vais-je recevoir une erreur si je ne vide pas le contenu de la serrure?

#Exécutez l'installation du bundle
RUN bundle install

#Copiez tout ce qui se trouve dans le répertoire d'application de l'hôte dans un conteneur
ADD . /webapp

 .Dockerfile (conteneur nginx)


FROM nginx:1.15.8

#Suppression du répertoire d'inclusion (probablement pour éviter la formation de buée)
RUN rm -f /etc/nginx/conf.d/*

#Copier le fichier de configuration Nginx dans le conteneur
ADD nginx.conf /etc/nginx/conf.d/nginx.conf

#Démarrez Nginx une fois la construction terminée
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

FROM Obtenez l'image du hub de docker. Tout ce qui se trouve dans le hub docker peut être tiré. Le premier conteneur n'a rien installé comme un ordinateur fraîchement acheté, donc je vais le préparer pour exécuter ruby. Si vous ne spécifiez pas la version, la dernière version sera installée. RUN Commande d'exécution. Le processus qui a lieu lors de la construction d'un conteneur. Il est traité comme une commande de terminal. COPY Copiez les fichiers dans le répertoire de la machine hôte (MAC dans ce cas). ADD Copiez les fichiers dans le répertoire. -La différence par rapport à la copie est de savoir si le fichier distant peut être copié (ADD) ou non (COPY), ou si la compression est traitée (COPY) ou non (ADD). CMD Traitement effectué lorsque le conteneur est construit puis exécuté. Il est traité comme une commande de terminal. ・ La différence avec RUN est le moment de l'exécution. Indique si la mise à jour est effectuée au moment de la construction ou si la commande est exécutée au démarrage du conteneur.

fichier .conf

Fait référence au fichier de configuration de nginx lui-même. Sans cela, nginx ne démarrera pas. Tant que le contenu est bon, ni nginz.conf ni default.conf n'entraveront l'exécution, mais un nom que tout le monde peut voir et comprendre est meilleur.

nginx.conf


#Spécification de la destination du proxy
#Envoyez la demande reçue par Nginx au backend puma
upstream webapp {
  #Je veux communiquer avec des prises, donc puma.Spécifiez la chaussette
  server unix:///webapp/tmp/sockets/puma.sock;
}

server {
  listen 80;
  #Spécifiez le domaine ou l'adresse IP
  server_name localhost;

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  #Spécifiez la racine. Sinon, le chemin sera perdu lors de la connexion à l'application.
  root /webapp/public;

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  try_files  $uri/index.html $uri @webapp;
  keepalive_timeout 5;

  #Paramètres liés au proxy inverse
  location @webapp {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://webapp;
  }
}

Définissez la méthode de réception de la demande dans le serveur {}, et lorsque tout passe, passez à la communication en amont et la socket est effectuée. Ce n'est pas un endroit à comprendre lors du démarrage d'un conteneur, alors ne le mémorisez pas et ne le copiez pas. Cependant, vérifiez le nom du répertoire. J'étudie le proxy.

docker-compose.yml Un fichier qui gère l'exécution de plusieurs conteneurs. Quand il n'y avait qu'un seul conteneur, il était exécuté comme le conteneur docker run ....., mais docker-compose up peut démarrer tous les conteneurs écrits dans le fichier.

version: '3'
services:
  app:
    build:
      context: .
    env_file:
      - ./environments/db.env
    command: bundle exec puma -C config/puma.rb
    volumes:
      - .:/webapp
      - public-data:/webapp/public
      - tmp-data:/webapp/tmp
      - log-data:/webapp/log
    depends_on:
      - db
  db:
    image: mysql:5.7
    env_file:
      - ./environments/db.env
    volumes:
      - db-data:/var/lib/mysql
  web:
    build:
      context: containers/nginx
    volumes:
      - public-data:/webapp/public
      - tmp-data:/webapp/tmp
    ports:
      - 80:80
    depends_on:
      - app
volumes:
  public-data:
  tmp-data:
  log-data:
  db-data:

Décrivez les fichiers, commandes, etc. à référencer lors du démarrage. depends_on Affiche les dépendances du conteneur. Dans le cas ci-dessus, démarrez dans l'ordre DB ⇨ app ⇨ web (nginx). volume Espace de stockage de données à l'extérieur du conteneur. Le conteneur fonctionne même s'il n'y a pas de volume. Si vous détruisez le conteneur, les informations contenues dans le conteneur seront perdues à ce moment-là et il faudra du temps pour saisir les mêmes informations sur le côté. Utilisez cette option lorsque vous avez des données que vous souhaitez conserver même si vous écrasez le conteneur plusieurs fois. L'image est un disque dur externe monter Rendre les données en dehors du docker disponibles à l'intérieur du docker. env_file Le port de lecture du mot de passe utilisé comme variable d'environnement. Vous pouvez l'écrire directement dans le fichier, ou vous pouvez l'écrire dans le fichier comme ci-dessus. Ce dernier est meilleur pour la sécurité (probablement)

db.env(Exemple)


MYSQL_ROOT_PASSWORD=aaaaa
MYSQL_USER=aaaaa
MYSQL_PASSWORD=aaaaa

commander

#Construire
docker-compose build
#commencer
docker-compose up
#Commencez dans les coulisses
docker-compose up -d
#Arrêtez le conteneur
docker-compose stop
#Arrêtez le récipient et jetez
docker-compose down
#Arrêtez le récipient et jetez&volume supprimé
docker-compose down --volume
#Vérifiez à l'intérieur du conteneur
docker ps
docker images
#image supprimée
docker image prune
#Supprimer tout ce qui ne fonctionne pas
docker system prune

#Actions de rails dans le docker
docker-compose run [Nom de l'application] rails db:comme créer
⇨docker-C'est une affaire privée pour l'application en composition. db:créer

À la fin

Non, la mise en œuvre a vraiment pris du temps. Surtout Nginx a eu du mal car c'était un proxy et un serveur rafraîchissants.

Recommended Posts

Maintenant que vous avez déployé AWS avec Rails On Docker, organisons le contenu.
Exécutez l'AWS CLI sur Docker
Vérifiez le contenu du traitement avec [rails] binding.pry
Créer un environnement avec Docker sur AWS
[Rails] Affichez les personnes qui ont DM sur Ma page afin que vous puissiez créer un lien vers la page de discussion! 【mémorandum】
Présentation de Rspec avec Ruby on Rails x Docker
Publiez l'application avec ruby on rails
Déterminez la page actuelle avec Ruby on Rails
Accro au Webpacker fourni en standard avec Rails 6