Es gibt verschiedene Möglichkeiten, eine mit ** Django ** erstellte WEB-Anwendung in einer ** Entwicklungs- / Produktionsumgebung ** auszuführen. In letzter Zeit ist ** Kubernetes ** populär geworden und es gibt viele Fälle, in denen Anwendungen containerisiert werden.
Dieser Artikel beschreibt, wie ein ** Docker-Container ** mit einer ** Django-Anwendung ** in einer ** Entwicklungs- / Produktionsumgebung ** erstellt wird.
Die in diesem Artikel verwendete Umgebung ist ** CentOS7 **, ** Docker **, ** Django2-Serie **.
Solange ** Docker ** funktioniert, ** funktioniert der Docker-Container **, sodass auch unter Windows kein Problem besteht.
Die für die Entwicklungsumgebung verwendete Docker-Datei lautet wie folgt.
Diese Docker-Datei basiert auf ** debian: 10 ** und hat ** Python ** aus dem Quellcode installiert. Es gibt auch ein ** offizielles Python ** Docker-Image, daher ist es in Ordnung, es zu verwenden, aber es ist für Studienzwecke so konfiguriert.
FROM debian:10
# Install Python3.7.7
WORKDIR /work
ADD ./Python-3.7.7.tar.xz .
WORKDIR Python-3.7.7
RUN apt-get update && apt-get install -y \
gcc \
libbz2-dev \
libssl-dev \
libffi-dev \
libsqlite3-dev \
make \
tk-dev \
zlib1g-dev \
apache2-dev \
python3-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN ./configure --enable-shared && \
make && \
make install && \
make distclean && \
./configure && \
make && \
make altbininstall
# Install with pip
COPY ./requirements.txt .
RUN pip3 install --upgrade pip setuptools
RUN pip3 install --upgrade wheel
RUN pip3 install -r requirements.txt
# Deploy App
WORKDIR /
ADD ./deployfiles.tar.xz .
WORKDIR /myapp
CMD ["python3", "manage.py", "runserver", "0.0.0.0:80"]
FROM debian:10
Geben Sie beim Schreiben einer ** Docker ** -Datei zunächst an, was als ** Basis ** verwendet werden soll. Hier wird ** debian: 10 ** angegeben.
# Install Python3.7.7
WORKDIR /work
ADD ./Python-3.7.7.tar.xz .
WORKDIR Python-3.7.7
Als nächstes folgt die Installation von ** Python **.
** [WORKDIR] 7 ** ist eine Syntax, die das aktuelle Verzeichnis des Betriebssystems verschiebt. Wenn ** WORKDIR / work ** angegeben ist, wird ein Verzeichnis mit dem Namen ** work ** direkt unter dem ** Stammverzeichnis (/) ** erstellt (** es wird erstellt, wenn kein angegebenes Verzeichnis ** vorhanden ist), und das ist das aktuelle. Es wird ein Verzeichnis sein.
** ADD ** kann ** in den Pfad im Docker-Container kopiert / erweitert ** werden, indem ** ADD auf dem Host-Betriebssystem auf den Pfad im Docker-Container ** gesetzt wird. Ich kann es schaffen ** Im Gegensatz zu [ADD is COPY] 5 ** können Sie ** eine komprimierte Datei dekomprimieren **. Daher sollten Dateien wie ** tar ** und ** xz ** mit ** ADD ** in den ** Docker-Container ** kopiert werden.
RUN apt-get update && apt-get install -y \
gcc \
libbz2-dev \
libssl-dev \
libffi-dev \
libsqlite3-dev \
make \
tk-dev \
zlib1g-dev \
apache2-dev \
python3-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
** [RUN] 3 ** kann Befehle im Docker-Container ausführen. Ich verwende apt-get, um die abhängigen Pakete zu installieren, die für die Installation von ** Python ** benötigt werden.
** apt-get clean **, ** rm -rf / var / lib / apt / lists / \ *** werden ausgeführt, um unnötige Caches und Dateien zu entfernen. Wenn Sie dies entfernen, können Sie die ** Kapazität des erstellten ** Docker-Images ** klein ** halten.
RUN ./configure --enable-shared && \
make && \
make install && \
make distclean && \
./configure && \
make && \
make altbininstall
Der Rest ist **. / Configure **, ** make **, ** make install **. Es gibt ungefähr 4 zusätzliche Zeilen, aber diese werden hinzugefügt, um Fehler zu behandeln.
*** Ich denke, es ist ein Kombinationsproblem **, aber als ich es ausgeführt habe, musste ich dies tun. Vielleicht ist es unnötig.
# Install with pip
COPY ./requirements.txt .
RUN pip3 install --upgrade pip setuptools
RUN pip3 install --upgrade wheel
RUN pip3 install -r requirements.txt
Installieren Sie nach der Installation von ** Python ** das Paket ** Python **. Verwenden Sie hier den Befehl ** pip **, um die in ** require.txt ** aufgeführten Pakete zu installieren.
** [COPY ähnelt ADD] 5 **, ** COPY Path auf dem Host-Betriebssystem Pfad auf dem Docker-Container ** Kopieren Sie Dateien auf dem Host-Betriebssystem in den Pfad auf dem Docker-Container Ich kann es schaffen Dies ist buchstäblich nur eine Kopie.
Aktualisieren Sie danach ** pip ** mit ** [RUN] 3 ** und installieren Sie das ** Python ** -Paket basierend auf ** require.txt **.
# Deploy App
WORKDIR /
ADD ./deployfiles.tar.xz .
WORKDIR /myapp
CMD ["python3", "manage.py", "runserver", "0.0.0.0:80"]
Fügen Sie abschließend Ihre Anwendung ** zum Docker-Container ** hinzu.
** deployfiles.tar.xz ** ist ein komprimiertes Verzeichnis mit dem Namen ** myapp **, mit ** manage.py ** direkt unter ** myapp **.
** [CMD] 4 ** ist die Syntax zum Festlegen des Befehls, der ausgeführt werden soll, wenn der ** Docker-Container ** gestartet wird. Dies kann wie ein ** Python ** -Listenformat beschrieben werden, und jedes Element wird mit einem Leerzeichen halber Breite verbunden. Mit anderen Worten lautet der Befehl wie folgt.
CMD ["python3", "manage.py", "runserver", "0.0.0.0:80"]
↓
python3 manage.py runserver 0.0.0.0:80
Führen Sie den folgenden Befehl aus, um das ** Docker-Image ** zu erstellen.
docker build -t test/myapp .
Die Option ** -t ** wird verwendet, um das ** Docker-Image ** zu markieren. Das Markieren erleichtert die Verwaltung.
Geben Sie am Ende des Befehls den Pfad der ** Docker-Datei ** ein. Hier wird ** aktuelles Verzeichnis (.) ** angegeben.
Standardmäßig wird die Datei mit dem Namen ** Dockerfile ** über den angegebenen Pfad durchsucht, daher sollte der oben erstellte Dateiname ** Dockerfile ** sein.
Führen Sie den folgenden Befehl aus, um das erstellte Bild zu überprüfen.
docker image ls
Führen Sie den folgenden Befehl aus, um den ** Docker-Container ** über das ** Docker-Image ** zu starten.
docker run --name myapp -d -p 80:80 -v /work/db.sqlite3:/myapp/db.sqlite3 test/myapp:latest
Die Option ** --name ** benennt den ** Docker-Container **. Dies ist später nützlich, wenn Sie diesen ** Docker-Container ** stoppen, starten oder löschen möchten. Der Name ist eindeutig. Wenn Sie ihm also einen Namen geben, können Sie ihn stoppen, starten oder löschen, indem Sie einfach den Namen angeben. Wenn kein Name vorhanden ist, geben Sie die Container-ID an.
Die Option ** -d ** führt den Container im ** Hintergrund ** aus. Wenn dies nicht angehängt ist, wird die Standardausgabe von ** Docker Container ** auf der Konsole angezeigt. Sie können mit ** Strg + c ** beenden. Ich denke, dass es in den meisten Fällen im Hintergrund läuft, also werde ich es hinzufügen.
Die Option ** - p ** ordnet den ** Host-Betriebssystem-Port ** dem ** Docker-Container-Port ** zu. ** Host-Betriebssystem-Port: Docker-Container-Port **. Geben Sie diesmal 80 an, da der ** Django ** -Prozess über ** Port 80 ** des Docker-Containers veröffentlicht wird.
Die Option ** -v ** ordnet das ** Host-Betriebssystem-Volume (Docker-Volume oder Dateipfad auf dem Host-Betriebssystem) ** dem ** Docker-Container-Dateipfad ** zu. Der Container enthält beim Beenden keine Daten. Daher müssen die Daten, die Sie behalten möchten, extern gespeichert werden. ** Empfohlen wird Docker-Volume **, jedoch aufgrund der Entwicklungsumgebung ** Daten im Betriebssystemdateipfad ** auf dem Host speichern. Hier ist ** db.sqlite3 ** vom ** Host-Betriebssystem ** mit dem ** Docker-Container ** verknüpft.
** test / myapp ** ist die Spezifikation des zugrunde liegenden ** Docker-Images **. ** neueste ** ist der Versionsname und wird ** neueste ** sein, wenn beim Erstellen des ** Docker-Images ** nichts angegeben wird. Sie können dies überprüfen, indem Sie sich auf die Spalte ** TAG ** beziehen, die von ** docker image ls ** ausgegeben wird.
Führen Sie den folgenden Befehl aus, um zu überprüfen, ob es normal gestartet wurde.
docker ps
Wenn die Spalte ** STATUS ** ** UP ** ist, wurde sie normal gestartet.
Wenn nichts ausgegeben wird, fügen Sie ** -a ** hinzu, um den gestoppten Prozess zu überprüfen. Wenn Sie das Protokoll von ** Docker-Container ** überprüfen möchten, führen Sie den folgenden Befehl aus.
docker logs [Containername oder Container-ID]
Überprüfen Sie den Fehler und ergreifen Sie Korrekturmaßnahmen.
Greifen Sie auf die öffentliche Portnummer der IP-Adresse des ** Host-Betriebssystems ** zu, auf dem ** Docker ** ausgeführt wird.
Die für die Produktionsumgebung verwendete ** Docker-Datei ** lautet wie folgt.
Im Gegensatz zur Entwicklungsumgebung können Sie mit ** python3 manage.py runserver ** keinen Prozess starten. Es ist stabiler, auf ** Apache ** usw. zu laufen.
Hier verwenden wir ** httpd: 2.4 ** als Basis. [** Offizielles Docker-Image ** von Apache Web Server **] 1.
Um ** Django ** auf ** Apache ** auszuführen, müssen Sie ein Modul namens ** [mod_wsgi] 2 ** in ** Apache ** einfügen. Daher werden ** Python ** und ** [mod_wsgi] 2 ** installiert.
FROM httpd:2.4
# Install Python3.7.7
WORKDIR /work
ADD ./Python-3.7.7.tar.xz .
WORKDIR Python-3.7.7
RUN apt-get update && apt-get install -y \
gcc \
libbz2-dev \
libssl-dev \
libffi-dev \
libsqlite3-dev \
make \
tk-dev \
zlib1g-dev \
apache2-dev \
python3-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN ./configure --enable-shared && \
make && \
make install && \
make distclean && \
./configure && \
make && \
make altbininstall
# Install with pip
COPY ./requirements.txt .
RUN pip3 install --upgrade pip setuptools
RUN pip3 install --upgrade wheel
RUN pip3 install -r requirements.txt
# install ModWsgi
WORKDIR /work
ADD ./mod_wsgi-4.7.1.tar.gz .
WORKDIR mod_wsgi-4.7.1
RUN ./configure \
--with-apxs=/usr/local/apache2/bin/apxs \
--with-python=/usr/local/bin/python3.7 && \
make && \
make install
# Set Apache
WORKDIR /usr/local/apache2/conf
COPY ./httpd.conf .
COPY ./server.crt .
COPY ./server.key .
COPY ./wsgi.conf ./extra
COPY ./httpd-ssl.conf ./extra
FROM httpd:2.4
** [httpd: 2.4] 1 ** wird als Basis angegeben.
# Install Python3.7.7
WORKDIR /work
ADD ./Python-3.7.7.tar.xz .
WORKDIR Python-3.7.7
RUN apt-get update && apt-get install -y \
gcc \
libbz2-dev \
libssl-dev \
libffi-dev \
libsqlite3-dev \
make \
tk-dev \
zlib1g-dev \
apache2-dev \
python3-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN ./configure --enable-shared && \
make && \
make install && \
make distclean && \
./configure && \
make && \
make altbininstall
Installieren Sie ** Python ** wie in der Entwicklungsumgebung.
# Install with pip
COPY ./requirements.txt .
RUN pip3 install --upgrade pip setuptools
RUN pip3 install --upgrade wheel
RUN pip3 install -r requirements.txt
Installieren Sie das ** Python ** -Paket basierend auf ** require.txt ** mit ** pip ** wie in der Entwicklungsumgebung.
# install ModWsgi
WORKDIR /work
ADD ./mod_wsgi-4.7.1.tar.gz .
WORKDIR mod_wsgi-4.7.1
RUN ./configure \
--with-apxs=/usr/local/apache2/bin/apxs \
--with-python=/usr/local/bin/python3.7 && \
make && \
make install
Installiere ** [mod_wsgi] 2 **, damit ** Django ** an ** Apache ** funktioniert.
# Set Apache
WORKDIR /usr/local/apache2/conf
COPY ./httpd.conf .
COPY ./server.crt .
COPY ./server.key .
COPY ./wsgi.conf ./extra
COPY ./httpd-ssl.conf ./extra
Kopieren Sie abschließend die ** Apache ** verschiedenen ** Konfigurationsdateien ** und ** zertifikatsbezogenen ** Dateien.
Ähnlich wie in der Entwicklungsumgebung.
Führen Sie den folgenden Befehl aus, um ** [Docker Volume] 10 ** zu erstellen.
docker volume create --name volume-name
** [Docker Volume] 10 ** wird mit dem durch ** - name ** angegebenen Namen erstellt. Dieses Volume ist mit ** Docker-Container ** verknüpft.
** [Docker Volume] 10 ** hat eine andere Lebensdauer als ** Docker Container **. Selbst wenn der ** Docker-Container ** verschwindet, bleibt ** [Docker-Volume] 10 ** bestehen, sodass Daten beibehalten werden können.
Führen Sie den folgenden Befehl aus, um den ** Docker-Container ** über das ** Docker-Image ** zu starten.
docker run --name myapp -d -p 443:443 -v volume-name:/myapp test/myapp
Nur die Option ** -v ** unterscheidet sich von der Entwicklungsumgebung. Hier wird ** [Docker-Volume] 10 ** anstelle von ** Dateipfad ** auf dem Host-Betriebssystem angegeben. Ein ** [Docker-Volume] 10 ** mit dem Namen ** Volume-Name ** ist ** / myapp ** im ** Docker-Container ** zugeordnet. Dadurch werden die Daten auf ** / myapp ** unter ** [Docker Volume] 10 ** gespeichert.
Ähnlich wie in der Entwicklungsumgebung.
Recommended Posts