【问题标题】:How to connect to Docker containers using hostnames from Docker host? [duplicate]如何使用来自 Docker 主机的主机名连接到 Docker 容器? [复制]
【发布时间】:2019-12-10 12:41:29
【问题描述】:

我想使用主机名从我的 Docker 主机连接到我的 Docker 容器。

我已经知道如何通过使用docker run -p <host-port>:<container-port> ... 映射它们的端口来连接到容器,然后通过localhost 访问它们。

另外,我可以使用docker inspect <container> 提供的 IP 地址连接到容器。但这些 IP 地址不是静态的。

我怎样才能给容器主机名,这样我就可以通过暴露的端口连接到它们,而不必考虑非静态 IP?

【问题讨论】:

  • (在许多情况下,您不能使用docker inspect IP 地址;它们只能在与运行 Docker 守护程序的主机完全相同的 Linux 本地主机上工作。您应该使用 localhost 和发布的端口,只要 Docker 不在 VM 中,它就可以在同一主机上工作。)
  • @DavidMaze - “你应该使用 localhost 和发布的端口...” - 你不是说这也适用,当 Docker 在 VM 中时,比如 Docker for Mac?
  • 如果您使用 Docker Toolbox(例如,在 Windows 7 主机上),您需要 VM 的 IP 地址。 Docker for Mac 确实在内部使用了 VM,但它知道如何重新发布端口,以便 localhost 在物理主机上工作。

标签: docker


【解决方案1】:

使用docker-compose 并在其中提供服务。每个容器都将成为服务的一部分,一个容器可以使用该容器所属的服务名称与另一个容器通信。

例如:

 $ cat docker-compose.yml
version: '3.1'

services:
    server:
        image: redis
        command: [ "redis-server" ]
    client:
        image: redis
        command: [ "redis-cli", "-h", "server", "ping" ]
        links:
            - server
  $
  $
  $ docker-compose up
Starting server_1 ... done
Starting client_1 ... done
Attaching to server_1, client_1
client_1  | PONG
server_1  | 1:C 10 Dec 2019 12:59:20.161 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
server_1  | 1:C 10 Dec 2019 12:59:20.161 # Redis version=5.0.6, bits=64, commit=00000000, modified=0, pid=1, just started
server_1  | 1:C 10 Dec 2019 12:59:20.161 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
server_1  | 1:M 10 Dec 2019 12:59:20.162 * Running mode=standalone, port=6379.
server_1  | 1:M 10 Dec 2019 12:59:20.162 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
server_1  | 1:M 10 Dec 2019 12:59:20.162 # Server initialized
server_1  | 1:M 10 Dec 2019 12:59:20.162 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
server_1  | 1:M 10 Dec 2019 12:59:20.162 * Ready to accept connections
client_1 exited with code 0

在这里,我创建了两个服务,serverclientserver 启动一个 redis-server 并且 client 尝试连接到服务器。另外,请注意我没有在这里公开端口,所以client 容器正在使用server(服务名称)与server 容器通信

client:
    image: redis
    command: [ "redis-cli", "-h", "server", "ping" ]

【讨论】:

  • 但是主机可以使用这些主机名与容器通信吗?
  • 没有。主机无法使用 服务名称 与容器通信。容器可以使用这些服务名称相互通信。
猜你喜欢
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 2016-03-13
  • 2016-01-25
  • 2018-01-09
  • 2018-01-03
相关资源
最近更新 更多