[RUBY] Nachdem Sie AWS mit Rails On Docker bereitgestellt haben, organisieren wir den Inhalt.

Letzter Bericht

** Endlich! !! !! !! !! ** **. Ich habe Schienen in einen Docker-Container gelegt und bereitgestellt. Es dauerte ungefähr 3 Wochen oder länger! In Bezug auf die Jobsuche wird immer noch gesucht, aber ich habe das Gefühl, dass sich die Reaktion von Green verbessert hat. Ist es ein Zeichen der Genesung von Corona? Vor kurzem hatte ich die Gelegenheit, ein Unternehmen mit gutem Wohlbefinden zu interviewen, aber es war aufgrund mangelnder Unternehmensforschung nicht möglich. Ich war ungefähr zwei Tage lang verbeult, aber ich denke, es war eine Erfahrung, die zu einem großen Wachstum meiner Interviewvorbereitung geführt hat, und ich werde mein Bestes tun, um ein Unternehmen zu finden, das zu mir passt.

Das heutige Thema

Lassen Sie uns ein Docker-Memorandum mit Schienen erstellen

Materialien, auf die vor dem Einsatz Bezug genommen wird

☆ Bereitstellungsreferenz ☆ Wird zum Studium des lokalen Umgebungsbaus verwendet Dieser Artikel war besonders hilfreich beim Erstellen von Containern Ich habe einen Container gemacht und ihn zerbrochen, also habe ich viel organisiert

Umgebung

ruby 2.5.1 rails 5.2.3 Mac OS docker for mac

Grober Schöpfungsfluss

・ In dem von Rails erstellten Portfolio sind verschiedene Dinge wie Docker-Dateien installiert. ← Dieser Abschnitt fasst den Inhalt zusammen ・ Erstellen und überprüfen Sie, ob es in der lokalen Umgebung funktioniert ・ Auf Github hochladen ・ Ziehen Sie an EC2 In Bezug auf die Bereitstellung habe ich nicht das Gefühl, dass ich den obigen ☆ obigen Artikel schreiben kann, daher werde ich ihn weglassen

model

Verzeichnisaufbau


$ tree 

├── app-...Kürzung
├── Dockerfile
├── containers(Es gibt kein Problem, auch wenn dieser Ordner nicht separat ist) --- nginx
│                                     ├── Dockerfile
│                                     └── nginx.conf
├── Gemfile
├── Gemfile.lock
├── docker-compose.yml
・
Kürzung

Um Docker-Anfängern, die gerade das Tech Camp beendet haben, zu erklären, ob alle Umgebungen, in denen die Anwendung funktioniert, in der Box vorbereitet sind (blauer Rahmen im Bild), können die Produktionsumgebung und die lokale Umgebung erstellt werden Sie müssen es nicht einzeln tun, sondern nur ersetzen, oder? Ich fühle mich wie. Ein weiterer Vorteil ist, dass Sie die von Docker vorbereitete Umgebung freigeben können, ohne sich um die unterschiedliche Version oder das Betriebssystem für jeden Computer kümmern zu müssen.

Der Container startet den Rails-Container und den Nginx-Container, empfängt sie am lokalen Host von Nginx, kommuniziert mit Puma und stellt eine Verbindung zu Rails her.

Dockerfile Es ist eine Konstruktionszeichnung des Containers. ** Geben Sie ein, was in den Container eingefügt werden soll, welche Datei gelesen werden soll und was zu tun ist. ** Für jeden Container gibt es eine Docker-Datei. Die, die ich dieses Mal bereitgestellt habe, enthält zwei Docker-Dateien, sodass Sie sich zwei Container vorstellen können. Der Container basiert auf der Docker-Datei.

Zuerst war der Mechanismus erfrischend, weil es nur Wörter gibt, die ich im Tech Camp nicht höre, wie Bilder und Builds.

 .Dockerfile (Schienencontainer)


FROM ruby:2.5.1 

#Aktualisieren Sie das Repository und installieren Sie abhängige Module
RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       nodejs \
vim ← Erforderlich bei Verwendung von vim in einem Container
* Die neueste Version von Rails erfordert einen Webpacker, daher müssen Sie ihn separat installieren.
Bitte beachten Sie das Video "Ich habe den Docker gewonnen" auf Youtube.

#Erstellen Sie ein Arbeitsverzeichnis mit dem Namen webapp direkt unter dem Stammverzeichnis (Anwendungsverzeichnis im Container).
RUN mkdir /webapp ← Es funktioniert auch, wenn es nicht verrückt ist. webapp kann ein beliebiger Name sein
WORKDIR /webapp

#Kopieren Sie die Host-Gemfile in den Container
ADD Gemfile /webapp/Gemfile
ADD Gemfile.lock /webapp/Gemfile.lock 
* Anwendung Gemfile.Erhalte ich eine Fehlermeldung, wenn ich den Inhalt des Schlosses nicht entleere?

#Führen Sie die Bundle-Installation aus
RUN bundle install

#Kopieren Sie alles im Anwendungsverzeichnis des Hosts in einen Container
ADD . /webapp

 .Dockerfile (Nginx-Container)


FROM nginx:1.15.8

#Das Include-Verzeichnis wurde gelöscht (wahrscheinlich, um ein Beschlagen zu verhindern).
RUN rm -f /etc/nginx/conf.d/*

#Kopieren Sie die Nginx-Konfigurationsdatei in den Container
ADD nginx.conf /etc/nginx/conf.d/nginx.conf

#Starten Sie Nginx, nachdem der Build abgeschlossen ist
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

FROM Holen Sie sich das Bild vom Docker-Hub. Alles im Docker-Hub kann gezogen werden. Auf dem ersten Container ist nichts wie ein frisch gekaufter PC installiert, daher bereite ich ihn für die Ausführung von Ruby vor. Wenn Sie die Version nicht angeben, wird die neueste Version installiert. RUN Ausführungsbefehl. Der Prozess, der beim Erstellen eines Containers stattfindet. Es wird wie ein Terminalbefehl verarbeitet. COPY Kopieren Sie die Dateien in das Verzeichnis des Host-Computers (in diesem Fall MAC). ADD Kopieren Sie die Dateien in das Verzeichnis. -Der Unterschied zum Kopieren besteht darin, ob die entfernte Datei kopiert werden kann (ADD) oder nicht (COPY) oder die Komprimierung beantwortet wird (COPY) oder nicht (ADD). CMD Verarbeitung, die ausgeführt wird, wenn der Container erstellt und dann ausgeführt wird. Es wird wie ein Terminalbefehl verarbeitet. ・ Der Unterschied zu RUN ist der Zeitpunkt der Ausführung. Gibt an, ob die Aktualisierung zur Erstellungszeit erfolgt oder der Befehl beim Starten des Containers ausgeführt wird.

.conf Datei

Bezieht sich auf die Konfigurationsdatei von nginx selbst. Ohne das wird Nginx nicht gestartet. Solange der Inhalt gut ist, behindern weder nginz.conf noch default.conf die Ausführung, aber ein Name, den jeder sehen und verstehen kann, ist besser.

nginx.conf


#Angeben des Proxy-Ziels
#Senden Sie die von Nginx erhaltene Anfrage an das Backend-Puma
upstream webapp {
  #Ich möchte mit Steckdosen kommunizieren, also Puma.Geben Sie die Socke an
  server unix:///webapp/tmp/sockets/puma.sock;
}

server {
  listen 80;
  #Geben Sie die Domäne oder IP an
  server_name localhost;

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

  #Geben Sie root an. Andernfalls geht der Pfad beim Herstellen einer Verbindung zur Anwendung verloren.
  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;

  #Proxy-bezogene Einstellungen umkehren
  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;
  }
}

Legen Sie die Anforderungsempfangsmethode in Server {} fest. Wenn alle erfolgreich sind, fahren Sie mit dem Upstream fort, und die Socket-Kommunikation wird durchgeführt. Es ist kein Ort zum Verstehen, wenn Sie einen Container starten. Merken Sie ihn sich also nicht und kopieren Sie ihn nicht. Überprüfen Sie jedoch den Namen des Verzeichnisses. Ich studiere über Proxy.

docker-compose.yml Eine Datei, die die Ausführung mehrerer Container verwaltet. Wenn es nur einen Container gab, wurde er wie Docker-Container ausgeführt ....., aber Docker-Compose Up kann alle in die Datei geschriebenen Container starten.

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:

Beschreiben der Dateien, Befehle usw., auf die beim Start verwiesen werden soll. depends_on Zeigt Containerabhängigkeiten an. Beginnen Sie im obigen Fall in der Reihenfolge DB ⇨ app ⇨ web (nginx). volume Datenspeicherplatz außerhalb des Containers. Der Container funktioniert auch dann, wenn kein Volumen vorhanden ist. Wenn der Container zerstört wird, gehen zu diesem Zeitpunkt die Informationen im Container verloren, und es dauert einige Zeit, bis dieselben Informationen auf die Seite gelegt werden. Verwenden Sie diese Option, wenn Sie Daten haben, die Sie behalten möchten, obwohl Sie den Container häufig zerdrücken. Das Image ist eine externe Festplatte montieren Stellen Sie Daten außerhalb des Dockers im Docker zur Verfügung. env_file Der Leseport für das als Umgebungsvariable verwendete Kennwort. Sie können es direkt in die Datei schreiben oder wie oben beschrieben in die Datei schreiben. Letzteres ist (wahrscheinlich) besser für die Sicherheit

db.env(Beispiel)


MYSQL_ROOT_PASSWORD=aaaaa
MYSQL_USER=aaaaa
MYSQL_PASSWORD=aaaaa

Befehl

#Bauen
docker-compose build
#anfangen
docker-compose up
#Beginnen Sie hinter den Kulissen
docker-compose up -d
#Stoppen Sie den Behälter
docker-compose stop
#Stoppen Sie den Behälter und entsorgen Sie ihn
docker-compose down
#Stoppen Sie den Behälter und entsorgen Sie ihn&Volume gelöscht
docker-compose down --volume
#Überprüfen Sie im Inneren des Behälters
docker ps
docker images
#Bild gelöscht
docker image prune
#Löschen Sie alles, was nicht funktioniert
docker system prune

#Rails-Aktionen im Docker
docker-compose run [Anwendungsname] rails db:wie erstellen
⇨docker-Es ist eine private Angelegenheit für die Anwendung beim Verfassen. db:erstellen

Am Ende

Nein, die Implementierung hat wirklich lange gedauert. Besonders Nginx hatte es schwer, weil es ein erfrischender Proxy und Server war.

Recommended Posts

Nachdem Sie AWS mit Rails On Docker bereitgestellt haben, organisieren wir den Inhalt.
Führen Sie die AWS CLI in Docker aus
Überprüfen Sie den Verarbeitungsinhalt mit [Rails] Binding.pry
Erstellen Sie eine Umgebung mit Docker unter AWS
[Rails] Zeigen Sie Personen mit DM auf meiner Seite an, damit Sie auf die Chat-Seite verlinken können! 【Memorandum】
Einführung in Rspec mit Ruby on Rails x Docker
Veröffentlichen Sie die mit Ruby on Rails erstellte App
Bestimmen Sie die aktuelle Seite mit Ruby on Rails
Süchtig nach dem Webpacker, der standardmäßig mit Rails 6 geliefert wird