我一直在努力Dockerize一个现有的Django应用程序一个多星期了,我有点不知道如何继续下去。我已经复制了prod环境和环境设置,但我仍然在努力与最后一部分,是与Nginx有关。我将概述我的Docker文件和YML文件,使应用程序的生活。Django应用程序,SQL DB,Redis示例和CRON服务器都在工作,但最后一块拼图是Nginx容器。docker-compose.yml
是:
version: '3.8'
services:
xyz_web:
image: xyz-web:latest
networks:
- xyz_backend
volumes:
- ../app:/app
- xyz_static:/app/static
depends_on:
- xyz_db
- xyz_cache
# ports:
# - 8000:8000
command: gunicorn xyz_src.wsgi:application --bind :8000 --workers 1 --threads=3 --access-logfile -
env_file:
- django/.env
xyz_cron:
image: xyz-web:latest
networks:
- xyz_backend
volumes:
- ../app:/app
depends_on:
- xyz_db
- xyz_cache
command: cron -f
env_file:
- django/.env
xyz_cache:
image: xyz-cache:latest
networks:
- xyz_backend
volumes:
- ../build/redis/data:/data
command: /bin/sh -c "redis-server --requirepass $$REDIS_CACHE_PASS"
env_file:
- redis/.env
xyz_db:
image: xyz-db:latest
networks:
- xyz_backend
volumes:
- ../build/mysql/data:/var/lib/mysql
- ../build/mysql/mysqld:/var/run/mysqld
ports:
- 3306:3306
env_file:
- mysql/.env
xyz_proxy:
image: xyz-proxy:latest
networks:
- xyz_backend
volumes:
- xyz_static:/app/static
ports:
- 8000:80
depends_on:
- xyz_web
networks:
xyz_backend:
external: false
driver: bridge
volumes:
xyz_static:
字符串Django
应用程序的Dockerfile
是:
FROM python:3.10.13-bullseye
ENV PYTHONUNBUFFERED 1
# update and upgrade the image
RUN set -x \
&& apt-get update \
&& apt-get upgrade -y \
&& apt-get install cron -y
# install TA-Lib dependency
RUN set -x \
&& wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz \
&& tar -xzf ./ta-lib-0.4.0-src.tar.gz \
&& cd ta-lib \
&& ./configure \
&& make \
&& make install
# upgrade the pip package manager
RUN pip install --upgrade pip
WORKDIR /app
ADD app /app
COPY build/django/requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
# EXPOSE 8000
型SQL
DB的Dockerfile
是:
FROM mysql:8.0.34-debian
# update and upgrade the image
RUN set -x \
&& apt-get update \
&& apt-get upgrade -y
CMD ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_general_ci", "--skip-character-set-client-handshake"]
WORKDIR /app
型Redis
示例的Dockerfile
为:
FROM redis:6.2.13-bookworm
# update and upgrade the image
RUN set -x \
&& apt-get update \
&& apt-get upgrade -y
COPY build/redis/etc/redis /etc/redis
型
最后,Nginx
代理的Dockerfile
是:
FROM nginx:1.25.2-bookworm
RUN set -x \
&& apt-get update \
&& apt-get upgrade -y
RUN rm /etc/nginx/conf.d/default.conf
COPY build/nginx/etc/nginx/conf.d/prod.conf /etc/nginx/conf.d
EXPOSE 80
型prod.conf
是:
upstream prod_server {
server xyz_web:8000;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://prod_server;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
autoindex on;
root /app/staticfiles;
}
}
型
问题是Nginx不通过localhost在端口80上提供流量,但我仍然可以在端口8000上使用该应用程序。我不确定我错过了什么,任何关于错误的提示都将非常感谢。我还设置了Nginx来提供静态流量,但我不知道它是否工作,因为代理似乎没有运行,即使所有容器都报告工作。我已经执行了艾德进入他们,以确认文件在那里,他们似乎看起来很好:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0acefca3fdd xyz-proxy:latest "/docker-entrypoint.…" 32 hours ago Up 32 hours 0.0.0.0:8000->80/tcp build-xyz_proxy-1
ee40391a2259 xyz-web:latest "gunicorn xyz_sr…" 32 hours ago Up 32 hours build-xyz_web-1
5b47db517201 xyz-web:latest "cron -f" 32 hours ago Up 32 hours build-xyz_cron-1
d93d5e1c568b xyz-db:latest "docker-entrypoint.s…" 32 hours ago Up 32 hours 0.0.0.0:3306->3306/tcp, 33060/tcp build-xyz_db-1
b944a33ea68a xyz-cache:latest "docker-entrypoint.s…" 32 hours ago Up 32 hours 6379/tcp build-xyz_cache-1
型
1条答案
按热度按时间oug3syen1#
你提到nginx在端口8000而不是80上为应用提供服务是正确的。根据你在docker-compose上的nginx配置,
字符串
左侧表示
host machine
上的端口,右侧是container
内部的端口。因此,您的应用程序不在端口80
上提供服务,它在端口8000
上提供服务。要在主机上的端口80
上提供服务,请将8000也更改为80。还要确保端口80在主机上可用,并且您没有服务使用它。如果它不可用,您将不得不关闭这些服务。nginx的portsMap应该是:
型