更改端口号时无法连接到mysql服务器
我试图将MYSQL容器更改为在docker compose文件中的不同端口号ie3307上运行,但在使用更改端口号时无法连接到mysql服务器,mysql,docker,docker-compose,Mysql,Docker,Docker Compose,我试图将MYSQL容器更改为在docker compose文件中的不同端口号ie3307上运行,但在使用docker compose up启动服务后,出现了如下所示的数据库连接错误可能是什么问题 web_1 | Traceback (most recent call last): web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py&q
docker compose up启动服务后,出现了如下所示的数据库连接错误
可能是什么问题
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
web_1 | self.connect()
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 194, in connect
web_1 | self.connection = self.get_new_connection(conn_params)
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 227, in get_new_connection
web_1 | return Database.connect(**conn_params)
web_1 | File "/usr/local/lib/python3.7/site-packages/MySQLdb/__init__.py", line 130, in Connect
web_1 | return Connection(*args, **kwargs)
web_1 | File "/usr/local/lib/python3.7/site-packages/MySQLdb/connections.py", line 185, in __init__
web_1 | super().__init__(*args, **kwargs2)
web_1 | MySQLdb._exceptions.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")
web_1 |
web_1 | The above exception was the direct cause of the following exception:
web_1 |
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
web_1 | worker.init_process()
web_1 | File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 129, in init_process
web_1 | self.load_wsgi()
web_1 | File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
web_1 | self.wsgi = self.app.wsgi()
web_1 | File "/usr/local/lib/python3.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
web_1 | self.callable = self.load()
web_1 | File "/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
web_1 | return self.load_wsgiapp()
web_1 | File "/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
web_1 | return util.import_app(self.app_uri)
web_1 | File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 350, in import_app
web_1 | __import__(module)
web_1 | File "/src/core/wsgi.py", line 16, in <module>
web_1 | application = get_wsgi_application()
web_1 | File "/usr/local/lib/python3.7/site-packages/django/core/wsgi.py", line 12, in get_wsgi_application
web_1 | django.setup(set_prefix=False)
web_1 | File "/usr/local/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
web_1 | apps.populate(settings.INSTALLED_APPS)
web_1 | File "/usr/local/lib/python3.7/site-packages/django/apps/registry.py", line 120, in populate
web_1 | app_config.ready()
web_1 | File "/usr/local/lib/python3.7/site-packages/django_prometheus/apps.py", line 23, in ready
web_1 | ExportMigrations()
web_1 | File "/usr/local/lib/python3.7/site-packages/django_prometheus/migrations.py", line 49, in ExportMigrations
web_1 | executor = MigrationExecutor(connections[alias])
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/migrations/executor.py", line 18, in __init__
web_1 | self.loader = MigrationLoader(self.connection)
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/migrations/loader.py", line 49, in __init__
web_1 | self.build_graph()
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/migrations/loader.py", line 212, in build_graph
web_1 | self.applied_migrations = recorder.applied_migrations()
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/migrations/recorder.py", line 61, in applied_migrations
web_1 | if self.has_table():
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/migrations/recorder.py", line 44, in has_table
web_1 | return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 255, in cursor
web_1 | return self._cursor()
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 232, in _cursor
web_1 | self.ensure_connection()
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
web_1 | self.connect()
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/utils.py", line 89, in __exit__
web_1 | raise dj_exc_value.with_traceback(traceback) from exc_value
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
web_1 | self.connect()
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/backends/base/base.py", line 194, in connect
web_1 | self.connection = self.get_new_connection(conn_params)
web_1 | File "/usr/local/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 227, in get_new_connection
web_1 | return Database.connect(**conn_params)
web_1 | File "/usr/local/lib/python3.7/site-packages/MySQLdb/__init__.py", line 130, in Connect
web_1 | return Connection(*args, **kwargs)
web_1 | File "/usr/local/lib/python3.7/site-packages/MySQLdb/connections.py", line 185, in __init__
web_1 | super().__init__(*args, **kwargs2)
web_1 | django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")
应用程序数据库设置
运行docker ps后
您还需要告诉MySQL计划的变更:
environment:
MYSQL_TCP_PORT: 3307
(由于@derpirscher,已修复,见下文)
(我之前猜测它将是端口
,数据库端口
,MYSQL端口
,MYSQLD端口
,或者,为了证明我愿意相信我在Github上发现的任何荒谬,MYSQL\u主机=DB:3307),你还需要告诉MYSQL计划的变更:
environment:
MYSQL_TCP_PORT: 3307
(由于@derpirscher,已修复,见下文)
(我之前猜测它将是端口
,数据库端口
,MYSQL端口
,MYSQLD端口
,或者,为了证明我愿意相信在Github上发现的任何荒谬,MYSQL\u主机=DB:3307
)容器之间的连接总是使用“正常”端口号进行服务;这些连接忽略了端口:
可能进行的任何重新映射。如果您只是从另一个容器连接到数据库,实际上,端口:
根本不是必需的;如果存在,第二个端口号也需要是服务的“正常”端口号
更改docker compose.yml
文件应该有用:
版本:“3.8”
服务:
db:
#不需要暴露:`
端口:#可选,如果您不打算从外部Docker连接
-“3307:3306”#第二个端口u必须为“正常”端口3306
phpmyadmin:
#不需要`容器名称:`或`链接:`
环境:
PMA#U主机:db#合成服务名称
PMA_端口:3306#始终为“正常”端口,忽略`端口:`
同样,在您的配置中:
“主机”:“数据库”,
“端口”:“3306”,即“正常”端口,忽略“端口:`
正如我在评论中指出的,expose:
和links:
仅与过时的Docker网络模式相关,并且可以从Docker compose.yml
文件中安全删除。通常,让Compose选择自己的容器\u name:
容器之间的连接始终使用“正常”端口号进行服务,也没有什么害处;这些连接忽略了端口:
可能进行的任何重新映射。如果您只是从另一个容器连接到数据库,实际上,端口:
根本不是必需的;如果存在,第二个端口号也需要是服务的“正常”端口号
更改docker compose.yml
文件应该有用:
版本:“3.8”
服务:
db:
#不需要暴露:`
端口:#可选,如果您不打算从外部Docker连接
-“3307:3306”#第二个端口u必须为“正常”端口3306
phpmyadmin:
#不需要`容器名称:`或`链接:`
环境:
PMA#U主机:db#合成服务名称
PMA_端口:3306#始终为“正常”端口,忽略`端口:`
同样,在您的配置中:
“主机”:“数据库”,
“端口”:“3306”,即“正常”端口,忽略“端口:`
正如我在评论中指出的,expose:
和links:
仅与过时的Docker网络模式相关,并且可以从Docker compose.yml
文件中安全删除。通常情况下,让Compose选择自己的容器\u name:
也没有什么害处。您是否也更改了映像中mysql服务器的端口?目前,您正在从容器中公开端口3307,但容器中的mysql实例可能仍在侦听默认端口3306@derpirscher我将在环境下添加的参数的名称是什么,以声明上面docker compose文件中的端口号?您还应该允许该端口通过防火墙。这解决了我面临的一个类似问题。看一下文档应该是MYSQL\u TCP\u PORT
您是否也更改了图像中MYSQL服务器的端口?目前,您正在从容器中公开端口3307,但容器中的mysql实例可能仍在侦听默认端口3306@derpirscher我将在环境下添加的参数的名称是什么,以声明上面docker compose文件中的端口号?您还应该允许该端口通过防火墙。这解决了我面临的一个类似问题。看一看文档应该是MYSQL\u-TCP\u-PORT
,根据这个文档,它是MYSQL\u-TCP\u-PORT-Hmmm,还有一个,根据url是mysqld\u-PORT
,但是根据实际页面是PORT
。不过,不应该太难尝试@Philip:请注意,配置中设置的任何值都会覆盖环境变量。不太可能设置,但如果tit不起作用,则需要查找一些内容。添加了MYSQL\u TCP\u PORT:3307
在它起作用的环境下;)根据本文档,它的MYSQL_TCP_端口是Hmmm,但也有,根据url,它是mysqld_端口
,但根据实际页面,它是PORT
。不过,不应该太难尝试@Philip:请注意,配置中设置的任何值都会覆盖环境变量。不太可能设置,但如果tit不起作用,则需要查找一些内容。添加了MYSQL\u TCP\u PORT:3307
在它起作用的环境下;)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d60c0265ed9 nllb_frontend "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp frontend
323a7dd77121 nllb_web "gunicorn --bind 0.0…" 7 seconds ago Up 2 seconds 7000/tcp nllb_web_1
89ad90d1fb10 phpmyadmin/phpmyadmin "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 0.0.0.0:8183->80/tcp pma
e5c5e2bda22c mysql:5.7 "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 3306/tcp, 33060/tcp, 0.0.0.0:3307->3307/tcp nllb_db_1
1332ad2e136b redis:latest "docker-entrypoint.s…" 9 seconds ago Up 8 seconds 6379/tcp nllb_redis_1
environment:
MYSQL_TCP_PORT: 3307