【问题标题】:My application container is not able to my mysql container我的应用程序容器无法访问我的 mysql 容器
【发布时间】:2020-02-13 03:40:51
【问题描述】:

在所有的网络搜索和没有答案之后,我想在这个平台上问这个问题。我有一个应用程序容器,我尝试与我的数据库容器连接,但由于不知道我的应用程序无法连接的原因。 我正在提供它所需的所有相关信息。

这是我的 docker-compose 文件

version: '2'

services:

  application: &application
    image: gmasmatrix_application:latest
    command: /start.sh
    volumes:
      - .:/app
    depends_on:
      - db
    ports:
    - 8000:8000
#    cpu_shares: 874
#    mem_limit: 1610612736
#    mem_reservation: 1610612736
    build:
      context: ./
      dockerfile: ./compose/local/application/Dockerfile
      args:
      - GMAS_ENV_TYPE=local

  db:
    image: mysql:5.7.10
    environment:
      MYSQL_DATABASE: gmas_mkt
      MYSQL_ROOT_PASSWORD: pulkit1607
    ports:
    - '3306:3306'
    volumes:
      - my-db:/var/lib/mysql


volumes:
  my-db:

我还在settings.py文件中更改了主机

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'gmas_mkt',
        'USER': 'root',
        'PASSWORD': 'pulkit1607',
        'HOST': 'db',
        'PORT': '3306',
    }
}

这是我在运行 docker-compose up 文件时遇到的错误

application_1  | Traceback (most recent call last):
application_1  |   File "manage.py", line 22, in <module>
application_1  |     execute_from_command_line(sys.argv)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
application_1  |     utility.execute()
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 346, in execute
application_1  |     self.fetch_command(subcommand).run_from_argv(self.argv)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 394, in run_from_argv
application_1  |     self.execute(*args, **cmd_options)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 444, in execute
application_1  |     self.check()
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 482, in check
application_1  |     include_deployment_checks=include_deployment_checks,
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/core/checks/registry.py", line 72, in run_checks
application_1  |     new_errors = check(app_configs=app_configs)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/core/checks/model_checks.py", line 28, in check_all_models
application_1  |     errors.extend(model.check(**kwargs))
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py", line 1205, in check
application_1  |     errors.extend(cls._check_fields(**kwargs))
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py", line 1282, in _check_fields
application_1  |     errors.extend(field.check(**kwargs))
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 934, in check
application_1  |     errors = super(AutoField, self).check(**kwargs)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 207, in check
application_1  |     errors.extend(self._check_backend_specific_checks(**kwargs))
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 306, in _check_backend_specific_checks
application_1  |     return connection.validation.check_field(self, **kwargs)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/mysql/validation.py", line 18, in check_field
application_1  |     field_type = field.db_type(connection)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 614, in db_type
application_1  |     return connection.data_types[self.get_internal_type()] % data
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/__init__.py", line 36, in __getattr__
application_1  |     return getattr(connections[DEFAULT_DB_ALIAS], item)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 59, in __get__
application_1  |     res = instance.__dict__[self.name] = self.func(instance)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 196, in data_types
application_1  |     if self.features.supports_microsecond_precision:
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 59, in __get__
application_1  |     res = instance.__dict__[self.name] = self.func(instance)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/mysql/features.py", line 52, in supports_microsecond_precision
application_1  |     return self.connection.mysql_version >= (5, 6, 4) and Database.version_info >= (1, 2, 5)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 59, in __get__
application_1  |     res = instance.__dict__[self.name] = self.func(instance)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 371, in mysql_version
application_1  |     with self.temporary_connection():
application_1  |   File "/usr/local/lib/python2.7/contextlib.py", line 17, in __enter__
application_1  |     return self.gen.next()
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 462, in temporary_connection
application_1  |     cursor = self.cursor()
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 162, in cursor
application_1  |     cursor = self.make_debug_cursor(self._cursor())
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 135, in _cursor
application_1  |     self.ensure_connection()
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 130, in ensure_connection
application_1  |     self.connect()
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/utils.py", line 98, in __exit__
application_1  |     six.reraise(dj_exc_type, dj_exc_value, traceback)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 130, in ensure_connection
application_1  |     self.connect()
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 119, in connect
application_1  |     self.connection = self.get_new_connection(conn_params)
application_1  |   File "/usr/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 276, in get_new_connection
application_1  |     conn = Database.connect(**conn_params)
application_1  |   File "/usr/local/lib/python2.7/site-packages/MySQLdb/__init__.py", line 84, in Connect
application_1  |     return Connection(*args, **kwargs)
application_1  |   File "/usr/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 166, in __init__
application_1  |     super(Connection, self).__init__(*args, **kwargs2)
application_1  | django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")

无法弄清楚我做错了什么。

【问题讨论】:

  • 一个典型的原因是应用程序在数据库准备好之前启动。如果您运行了docker-compose up -d,请尝试等待一分钟并再次运行它,这将重新启动死去的应用程序容器,但不理会正在运行的数据库。 (仅depends_on: 无法确保这一点。)

标签: python django docker docker-compose dockerfile


【解决方案1】:

就我而言 我变了

mysql://root:root@localhost:3307/db

mysql://root:root@Gateway ip:3307/test_db

您可以在其中找到它的网关 ip

docker network ls

docker network inspect 

【讨论】:

    【解决方案2】:

    在 settings.py 文件中将 'HOST': 'db' 更改为 'HOST': 'localhost'。因为您将默认 MySQL 端口从容器映射到主主机中的 MySQL 默认端口。

    【讨论】:

    • 没用。收到此错误django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2)")
    • 好的,请尝试以下操作:登录到您的容器并运行 ifconfig 以获取容器 IP。如果此命令不起作用,请安装 net-tools 包。然后将 HOST 键的值设置为容器 IP。
    • Docker 的一个常见答案是与您的建议完全相反:Docker 中的localhost 通常表示“此容器”。手动查找容器 IP 也几乎不是最佳实践。
    • 是的,这不是最佳做法。你检查mysql服务器是否运行?
    猜你喜欢
    • 2022-12-14
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2021-02-18
    • 1970-01-01
    • 2020-08-10
    • 2021-12-07
    相关资源
    最近更新 更多