【问题标题】:Connecting Django docker to remote database将 Django docker 连接到远程数据库
【发布时间】:2020-12-17 11:51:09
【问题描述】:

我有一个在 docker 上运行的 Django 应用程序,它连接到同一主机上另一个容器中的数据库。这似乎可以正常工作,但是当我尝试更改与另一台服务器上的数据库的连接时,它无法连接。不仅如此,当我尝试在浏览器(如 admin 或 api)中连接到 Django 应用程序时,我没有得到任何响应,并且在输出日志中看不到任何活动。如果我在容器外运行应用程序,它可以在远程数据库上正常运行,并且数据库设置为接受我尝试连接的用户的所有 IP。

关于我为什么没有连接的任何想法?

Dockerfile:

FROM python:3.8-alpine

ENV PATH="/scripts:${PATH}"

COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers
RUN apk add mariadb-dev python3-dev postgresql-dev
RUN pip install -r /requirements.txt
RUN apk del .tmp

RUN mkdir /app_django
COPY ./app_django /app_django
WORKDIR /app_django
COPY ./scripts /scripts

RUN chmod +x /scripts/*

RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static
RUN adduser -D user
RUN chown -R user:user /vol
RUN chmod -R 755 /vol/web
USER user

CMD ["entrypoint.sh"]

docker-compose.yml

version: '3.7'

services:
  db:
    build: mysql/
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
      MYSQL_DATABASE: database
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/entrypoint-initdb.d:/docker-entrypoint-initdb.d/
      - ./mysql/backup_database:/var/local/mysql/backups
    ports:
      - 3306:3306
    restart: always
    
  pdb:
    build:
      context: .
    ports:
      - "8000:8000"
    volumes:
      - ./pdb_django:/pdb_django
    command: sh -c "python manage.py runserver 0.0.0.0:8000"
    environment:
      - DEBUG=1

入口点.sh

#!/bin/sh

set -e

python manage.py collectstatic --noinput

uwsgi --socket :8000 --master --enable-threads --module app.wsgi

Django db 设置(注释部分用于连接到宿主容器上的 db):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database',
        'HOST': '<remote IP>',
        # 'HOST': 'db',
        'USER': 'user',
        'PASSWORD': 'password',
        'PORT': '3308'
        # 'PORT': '3306',
    }
}

requirements.txt

Django==3.1.4
uWSGI>=2.0.18,<2.1
django-filter==2.4.0
djangorestframework==3.12.2
mysql-connector-python==8.0.22
mysqlclient==2.0.2
PyMySQL==0.10.1
sqlparse==0.4.1

应用程序的输出日志:

pdb_1  | Watching for file changes with StatReloader
pdb_1  | Exception in thread django-main-thread:
pdb_1  | Traceback (most recent call last):
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
pdb_1  |     self.connect()
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
pdb_1  |     return func(*args, **kwargs)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
pdb_1  |     self.connection = self.get_new_connection(conn_params)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
pdb_1  |     return func(*args, **kwargs)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 234, in get_new_connection
pdb_1  |     return Database.connect(**conn_params)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/MySQLdb/__init__.py", line 130, in Connect
pdb_1  |     return Connection(*args, **kwargs)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/MySQLdb/connections.py", line 185, in __init__
pdb_1  |     super().__init__(*args, **kwargs2)
pdb_1  | MySQLdb._exceptions.OperationalError: (2002, "Can't connect to MySQL server on '<remote IP>' (115)")
pdb_1  |
pdb_1  | The above exception was the direct cause of the following exception:
pdb_1  |
pdb_1  | Traceback (most recent call last):
pdb_1  |   File "/usr/local/lib/python3.8/threading.py", line 932, in _bootstrap_inner
pdb_1  |     self.run()
pdb_1  |   File "/usr/local/lib/python3.8/threading.py", line 870, in run
pdb_1  |     self._target(*self._args, **self._kwargs)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/utils/autoreload.py", line 53, in wrapper
pdb_1  |     fn(*args, **kwargs)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/commands/runserver.py", line 121, in inner_run
pdb_1  |     self.check_migrations()
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 459, in check_migrations
pdb_1  |     executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/executor.py", line 18, in __init__
pdb_1  |     self.loader = MigrationLoader(self.connection)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 53, in __init__
pdb_1  |     self.build_graph()
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/loader.py", line 216, in build_graph
pdb_1  |     self.applied_migrations = recorder.applied_migrations()
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 77, in applied_migrations
pdb_1  |     if self.has_table():
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 55, in has_table
pdb_1  |     with self.connection.cursor() as cursor:
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
pdb_1  |     return func(*args, **kwargs)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 259, in cursor
pdb_1  |     return self._cursor()
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 235, in _cursor
pdb_1  |     self.ensure_connection()
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
pdb_1  |     return func(*args, **kwargs)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
pdb_1  |     self.connect()
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
pdb_1  |     raise dj_exc_value.with_traceback(traceback) from exc_value
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
pdb_1  |     self.connect()
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
pdb_1  |     return func(*args, **kwargs)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/base/base.py", line 200, in connect
pdb_1  |     self.connection = self.get_new_connection(conn_params)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 26, in inner
pdb_1  |     return func(*args, **kwargs)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 234, in get_new_connection
pdb_1  |     return Database.connect(**conn_params)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/MySQLdb/__init__.py", line 130, in Connect
pdb_1  |     return Connection(*args, **kwargs)
pdb_1  |   File "/usr/local/lib/python3.8/site-packages/MySQLdb/connections.py", line 185, in __init__
pdb_1  |     super().__init__(*args, **kwargs2)
pdb_1  | django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on '<remote IP>' (115)")

【问题讨论】:

  • 应用程序正在尝试连接到不是有效 ip 的“”。在 Django 数据库设置中设置正确的 ip
  • @IgorMoraru 嗨,出于安全原因,我在发布之前将其更改为 ,在原始代码中它是一个有效的 IP
  • 你是否更改了远程运行mysql的端口,因为在你的设置中它是3308,但默认是3306
  • @IgorMoraru 是的,远程数据库实际上也在一个 docker 容器中。服务器有多个数据库容器。这是一个测试数据库,因此它被设置为与默认不同的端口
  • 你能显示 entrypoint.sh 吗?

标签: django docker


【解决方案1】:

这似乎是我的 VPN 的问题。当我尝试在网络上的服务器上运行容器时,它运行良好,并且当我关闭我的 VPN 时我也能够得到响应(尽管我显然无法访问服务器上的数据库)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2019-09-13
    • 2017-06-18
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    相关资源
    最近更新 更多