所以我在Docker容器中运行了一个Nginx,我在localhost上运行了一个mysql,我想从我的Nginx中连接到MySql.MySql在localhost上运行,而不是将端口暴露给外部世界,所以它绑定在localhost上,而不是绑定在机器的ip地址上.
有没有办法从这个docker容器中连接到这个MySql或localhost上的任何其他程序?
与docker的新手,我正在尝试通过pgAdmin容器将localhost连接到postgres容器。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b00555238ba dpage/pgadmin4 "/entrypoint.sh" 43 minutes ago Up 43 minutes 0.0.0.0:80->80/tcp, 443/tcp pedantic_turing
e79fb6440a95 postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:5432->5432/tcp pg-docker
Run Code Online (Sandbox Code Playgroud)
我成功连接了psql命令。
psql -h localhost -U postgres -d postgres
Run Code Online (Sandbox Code Playgroud)
但是,当我在pgAdmin上使用与psql相同的参数创建服务器时,出现以下错误。
无法连接到服务器:
无法连接到服务器:连接被拒绝服务器是否在主机“ localhost”(127.0.0.1)上运行并在端口5432上接受TCP / IP连接?无法连接到服务器:地址不可用服务器是否在主机“ localhost”(:: 1)上运行并接受端口5432上的TCP / IP连接?
我成功地通过docker inspect容器上给定的IPAddress连接。
顺便说一句,我检查了postgresql.conf并断言了它,listen_addresses = '*'并且还断言了pg_hba.conf包含host all all all md5。
但是我不明白,为什么我不能使用本地主机地址?为什么码头工人甚至给我一个非本地地址?
我目前正在学习docker的基础知识。我了解到,当容器需要连接到主机时(假设我有一个本地 mysql 数据库),localhost它必须使用 as 域,而不是用作host.docker.internal域。
所以不要这样:
createConnection(
host: "localhost",
...
)
Run Code Online (Sandbox Code Playgroud)
我会这样做:
createConnection(
host: "host.docker.internal",
...
)
Run Code Online (Sandbox Code Playgroud)
我想我明白为什么会这样,但我只是想澄清为什么 docker 不明白什么localhost意思,以及为什么它必须替换为host.docker.internal.
提前致谢。