Bash 如何在docker compose中访问链接服务?

Bash 如何在docker compose中访问链接服务?,bash,docker,docker-compose,netcat,Bash,Docker,Docker Compose,Netcat,根据,如果我在docker compose中的links下指定另一个服务的名称,我应该能够以与服务名称相同的主机名访问该服务 为了测试这一点,我尝试了以下docker compose.yml: version: '3' services: tor: build: ./tor use_tor: build: ./use_tor links: - tor 其中tor和use\tor目录包含Dockerfiles: . ├── docker-compo

根据,如果我在
docker compose
中的
links
下指定另一个服务的名称,我应该能够以与服务名称相同的主机名访问该服务

为了测试这一点,我尝试了以下
docker compose.yml

version: '3'

services:
  tor:
    build: ./tor

  use_tor:
    build: ./use_tor
    links:
      - tor
其中
tor
use\tor
目录包含
Dockerfile
s:

.
├── docker-compose.yml
├── tor
│   └── Dockerfile
└── use_tor
    └── Dockerfile
对于
tor

FROM alpine:latest
EXPOSE 9050
RUN apk --update add tor
CMD ["tor"]
FROM alpine:latest
CMD ["nc", "-z", "tor", "9050"]
对于
,请使用\u tor

FROM alpine:latest
EXPOSE 9050
RUN apk --update add tor
CMD ["tor"]
FROM alpine:latest
CMD ["nc", "-z", "tor", "9050"]
但是,如果我执行
docker compose build
,然后执行
docker compose up
,我会从日志中看到
use-tor
服务以状态代码1退出:

Starting scrapercompose_tor_1
Recreating scrapercompose_use_tor_1
Attaching to scrapercompose_tor_1, scrapercompose_use_tor_1
tor_1      | May 02 15:36:34.123 [notice] Tor v0.2.8.12 running on Linux with Libevent 2.0.22-stable, OpenSSL LibreSSL 2.4.4 and Zlib 1.2.8.
tor_1      | May 02 15:36:34.123 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning
tor_1      | May 02 15:36:34.123 [notice] Configuration file "/etc/tor/torrc" not present, using reasonable defaults.
tor_1      | May 02 15:36:34.129 [notice] Opening Socks listener on 127.0.0.1:9050
tor_1      | May 02 15:36:34.000 [notice] Parsing GEOIP IPv4 file /usr/share/tor/geoip.
tor_1      | May 02 15:36:34.000 [notice] Parsing GEOIP IPv6 file /usr/share/tor/geoip6.
tor_1      | May 02 15:36:34.000 [warn] You are running Tor as root. You don't need to, and you probably shouldn't.
tor_1      | May 02 15:36:34.000 [notice] We were built to run on a 64-bit CPU, with OpenSSL 1.0.1 or later, but with a version of OpenSSL that apparently lacks accelerated support for the NIST P-224 and P-256 groups. Building openssl with such support (using the enable-ec_nistp_64_gcc_128 option when configuring it) would make ECDH much faster.
tor_1      | May 02 15:36:34.000 [notice] Bootstrapped 0%: Starting
scrapercompose_use_tor_1 exited with code 1
tor_1      | May 02 15:36:35.000 [notice] Bootstrapped 80%: Connecting to the Tor network
tor_1      | May 02 15:36:36.000 [notice] Bootstrapped 85%: Finishing handshake with first hop
tor_1      | May 02 15:36:36.000 [notice] Bootstrapped 90%: Establishing a Tor circuit
tor_1      | May 02 15:36:36.000 [notice] Tor has successfully opened a circuit. Looks like client functionality is working.
tor_1      | May 02 15:36:36.000 [notice] Bootstrapped 100%: Done
显然,命令
nc-z tor9050
没有返回
use\u tor
容器上的预期状态代码
0
。然而,在我看来,这应该是可行的。例如,如果我修改
tor
服务,将容器上的端口
9050
映射到主机,如下所示

services:
  tor:
    build: ./tor
    ports:
      - "9050:9050"
然后在我的普通终端中,我确实看到
nc-zlocalhost 9050
产生一个退出代码
0

kurt@kurt-ThinkPad:~$ nc -z localhost 9050
kurt@kurt-ThinkPad:~$ echo $?
0

简言之,在端口映射之后,我希望主机名
tor
的行为与主机上的
localhost
类似,但情况似乎并非如此。为什么这不起作用?

这个问题让我一时愣住了。虽然我克隆了这个示例,但无法获得解决方案。据docker说

EXPOSE
指令通知Docker容器正在侦听 运行时指定的网络端口。EXPOSE不会使端口失效 主机可访问的容器的。要做到这一点,必须使用 可以使用-p标志发布一系列端口,也可以使用-p标志发布一系列端口 发布所有公开的端口。您可以公开一个端口号和 以其他编号对外发布

所以我认为这可能是因为tor服务是在127.0.0.1而不是0.0.0.0上运行的(对于它们之间的差异,您可以查看)

tor|u 1 | May 02 15:36:34.129[通知]在 127.0.0.1:9050

可以通过终端访问它是因为
docker compose.yml
中的
ports
参数与
-p
参数相同


总而言之,如果tor服务监听
0.0.0.0
,那么它应该会按预期工作。

虽然现在只是猜测,但我明天会查看它。印度的夜晚。!!:DAlso我使用docker链接的方式与您使用的方式相同,它们工作绝对正常。!这是完全正确的。我修复了这个问题,将配置文件
torrc
添加到
tor
目录,使用单行
SocksListenAddress 0.0.0
(cf.),并将
COPY torrc/etc/tor/torrc
添加到
Dockerfile
。现在我看到docker compose日志中的
scrapercompose\u use\u toru\u 1已按预期退出,代码为0