Cyr*_*lle 9 docker docker-compose
我有一个 dockerized 应用程序,我使用以下 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"
Run Code Online (Sandbox Code Playgroud)
我的机器上运行着一台未 dockerized 的服务器,我可以通过localhost:3000. 我希望我的php服务能够访问它。
我发现有人建议将以下内容添加到我的php服务配置中:
extra_hosts:
- "host.docker.internal:host-gateway"
Run Code Online (Sandbox Code Playgroud)
但是当我添加这个,然后docker-compose up -d尝试docker exec -ti php_1 curl http://localhost:3000,我得到了curl: (7) Failed to connect to localhost port 3000 after 0 ms: Connection refused。当我尝试时,我遇到了同样的错误curl http://host.docker.internal:3000。
我拼命尝试向容器添加端口映射php:
ports:
- 3000:3000
Run Code Online (Sandbox Code Playgroud)
但是当我启动服务时出现以下错误:
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
Run Code Online (Sandbox Code Playgroud)
这是显而易见的,因为我的服务器正在该3000端口上运行。
我也尝试添加
network_mode: host
Run Code Online (Sandbox Code Playgroud)
但它失败了,因为我已经有一个links. 我收到以下错误:
Cannot create container for service php: conflicting options: host type networking can't be used with links.
Run Code Online (Sandbox Code Playgroud)
我在 Ubuntu 21.10 上运行 docker v20.10.6。
任何帮助表示感谢,提前致谢!
确保您使用的 docker 版本支持 host.docker.internal。如果您使用的是linux版本,那么20.10+支持它。对于其他系统,您可能应该查阅 docker-for-linux / 其他项目操作系统相关的文档以及 github 上的一些问题。
在那之后...
确保 extra_hosts 是 php 服务的直接子级:
php:
extra_hosts:
host.docker.internal: host-gateway
build: ./docker/php/7.4/
Run Code Online (Sandbox Code Playgroud)
首先尝试使用ping host.docker.internal检查您的主机是否正确响应。
确保端口 3000 上的服务正常工作并且不存在防火墙问题。
请记住,这localhost意味着从当前容器的角度来看始终是本地 IP。这意味着localhost容器内部映射到本地容器 IP,而不是您的主机 IP。这是发送 extra_hosts 部分的原因。
另外 docker.host.internal 也不是您的主机环回接口。如果您尝试访问的服务仅在本地主机接口上侦听,那么如果不使用 iptables/防火墙进行一些魔法,就没有机会访问它。
您可以在主机上运行以下命令来检查哪个服务正在侦听哪个接口/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 -
Run Code Online (Sandbox Code Playgroud)
从 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13606 次 |
| 最近记录: |