我有一个docker应用程序,我使用以下docker compose。yml运行它:
version: '3.1'
services:
db:
image: mysql:5.7
ports:
- "3306:3306"
env_file:
- ./docker/db/.env
volumes:
- ./docker/db/data:/var/lib/mysql:rw
- ./docker/db/config:/etc/mysql/conf.d
command: mysqld --sql_mode="NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
php:
build: ./docker/php/7.4/
volumes:
- ./docker/php/app.ini:/usr/local/etc/php/conf.d/docker-php-ext-app.ini:ro
- ./docker/logs/app:/var/www/app/var/log:cached
- .:/var/www/app:cached
working_dir: /var/www/app
links:
- db
env_file:
- ./docker/php/.env
webserver:
image: nginx:1
depends_on:
- php
volumes:
- ./docker/webserver/app.conf:/etc/nginx/conf.d/default.conf:ro
- ./docker/logs/webserver/:/var/log/nginx:cached
- .:/var/www/app:ro
ports:
- "80:80"
我有一个没有docker化的服务器在我的机器上运行,我可以通过localhost:3000
访问它。我希望我的php
服务能够访问它。
我发现有人建议在我的php
服务配置中添加以下内容:
extra_hosts:
- "host.docker.internal:host-gateway"
但是当我添加这个时,docker编写up-d
并尝试dockerexec-tiphp_1curlhttp://localhost:3000
,我得到curl:(7)0毫秒后无法连接到本地主机端口3000:连接被拒绝
。当我尝试<code>curl时,也会出现同样的错误http://host.docker.internal:3000。
我拼命地尝试将端口映射添加到php
容器:
ports:
- 3000:3000
但是当我启动服务时,我有以下错误:
ERROR: for php_1 Cannot start service php: driver failed programming external connectivity on endpoint php_1 (9dacd567ee97b9a46699969f9704899b04ed0b61b32ff55c67c27cb6867b7cef): Error starting userland proxy: listen tcp4 0.0.0.0:3000: bind: address already in use
ERROR: for php Cannot start service php: driver failed programming external connectivity on endpoint php_1 (9dacd567ee97b9a46699969f9704899b04ed0b61b32ff55c67c27cb6867b7cef): Error starting userland proxy: listen tcp4 0.0.0.0:3000: bind: address already in use
这是显而易见的,因为我的服务器正在那个3000
端口上运行。
我还试图补充一点
network_mode: host
但是它失败了,因为我已经有了一个< code >链接。我得到以下错误:
Cannot create container for service php: conflicting options: host type networking can't be used with links.
我在Ubuntu 21.10上运行docker v20.10.6。
感谢您的帮助,提前感谢!
确保您使用的是支持 host.docker.internal 的 docker 版本。如果您使用的是linux版本,那么20.10支持它。对于其他系统,您可能应该参考文档,并且可能在docker-for-linux /其他项目OS狂欢的github上咨询一些问题。
然后。。。
确保extra_hosts是php服务的直接子级:
php:
extra_hosts:
host.docker.internal: host-gateway
build: ./docker/php/7.4/
首先尝试使用pinghost.docker.internal
检查主机是否正确响应。
确保端口3000上的服务工作正常,并且没有防火墙问题。
请记住,从当前容器的角度来看,localhost
意味着始终是本地IP。这意味着容器内的本地主机
映射到本地容器 IP,而不是主机 IP。这是发送extra_hosts部分的原因。
也是docker.host。内部不是您的主机环回接口。如果您试图访问的服务只在本地主机接口上侦听,那么如果不使用iptables/firewall,就不可能访问它。
您可以检查哪些服务正在监听主机上运行以下命令的哪个接口/IP地址:netstat-tulpn
这应该会返回类似以下的输出:
$ netstat -tulpn
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:39195 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 ::1:631 :::* LISTEN -
从 Docker 容器,我可以访问侦听 0.0.0.0 的服务(所有接口),但无法访问 631 端口,因为它仅在 127.0.0.1 上
$ docker run --rm -it --add-host="host.docker.internal:host-gateway" busybox
/ # ping host.docker.internal
PING host.docker.internal (172.17.0.1): 56 data bytes
64 bytes from 172.17.0.1: seq=0 ttl=64 time=0.124 ms
64 bytes from 172.17.0.1: seq=1 ttl=64 time=0.060 ms
^C
--- host.docker.internal ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.060/0.092/0.124 ms
/ # telnet host.docker.internal 631
telnet: can't connect to remote host (172.17.0.1): Connection refused
/ # telnet host.docker.internal 22
Connected to host.docker.internal
SSH-2.0-OpenSSH_8.6
问题内容: 我是Docker的新手。 我运行了一个10节点的图像,并在运行的容器中克隆了一个存储库,运行了使用文件监视程序启动服务器的应用程序。我需要访问容器内的代码库,并在Windows主机上运行的IDE中打开它。如果完成了,那么我还希望当我在IDE中更改文件时,这些更改会在容器中引起文件监视程序。 任何帮助表示赞赏。谢谢, 问题答案: 您正在寻找的概念称为卷。您需要启动一个容器并在其中安装主机
问题内容: 如果我在某个主机上运行mysql数据库,并且该主机也正在运行docker容器:我如何从主机上运行的docker容器中访问mysql数据库? 例如,是否有一种方法可以将主机端口发布到容器(与docker run -p的作用相反)? 问题答案: 关于如何以一致的,易于理解的和可移植的方式执行此操作的问题已有很长时间的讨论。尚无完整的解决方案,但我会将您链接到下面的讨论。 无论如何,您都想尝
我有一个关于这个问题的问题https://hub.docker.com/r/jupyter/scipy-notebook.我正在尝试使用docker compose运行此图像: 组成: Dockerfile 我用手够不着它http://locahost:8888 .... 网址。我使用Windows10作为主机,并尝试从这个docker compose和这些工作中访问其他服务。
问题内容: 我正在开发服务,并在那里使用docker compose来旋转诸如postgres,redis,elasticsearch之类的服务。我有一个基于RubyOnRails的Web应用程序,并从所有这些服务中进行读写操作。 这是我的 我可以在此网络中ping容器 到目前为止,一切都很好。现在我想在主机上的Rails应用程序上运行ruby,但是能够像目前这样使用url访问postgres实例
问题内容: 我有一个运行詹金斯的码头集装箱。作为构建过程的一部分,我需要访问在主机上本地运行的Web服务器。是否可以将主机Web服务器(可以配置为在端口上运行)暴露给jenkins容器? 编辑:我正在Linux机器上本地运行docker。 更新: 除了下面的@larsks答案之外,要从主机获取主机IP的IP地址,我还要执行以下操作: 问题答案: 在Linux上本地运行Docker时,您可以使用接口