Docker-compose 使用动态 ip : 端口拨号 tcp 错误

发布于 2025-01-18 07:03:23 字数 2153 浏览 1 评论 0原文

我正在尝试将请求从网关重新路由到目标服务,如果我使用静态端口绑定,一切正常。但它不灵活,所以我想在网络中运行具有动态ip和端口的容器,以便能够运行多个实例。

我将 docker-compose.yml 从 更改为

-ports: 
  "8082:8082"

-ports: 
  "8082"

收到错误

获取“http://c0000203.addr.dc1.consul.:60949/api/v1/users”:拨打 tcp 192.0.2.3:60949: connect: 连接被拒绝

我使用 consul 作为服务发现,并使用 registartor 来注册容器

基础 docker-compose 文件:

version: '3.7'
services:
  postgres:
    image: postgres:13
    restart: 'always'
    environment:
      - POSTGRES_DB=user-db
      - POSTGRES_PASSWORD=password
      - POSTGRES_USER=user
    ports:
      - "5432"
    networks:
      - vpcbr

  consul:
    image: consul:latest
    restart: 'always'
    environment:
      CONSUL_LOCAL_CONFIG: |
        {
          "recursors": [
            "8.8.8.8",
            "8.8.4.4"
          ],
          "dns_config": {
            "recursor_strategy": "random"
          },
          "ports": {
            "dns": 53
          }
        }
    networks:
      vpcbr:
        ipv4_address: 192.0.2.10
    ports:
      - '8500:8500'
      - '53/tcp'
      - '53/udp'

  registrator:
    image: gliderlabs/registrator:latest
    command: "consul://consul:8500"
    container_name: registrator
    depends_on:
      - consul
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock
    networks:
      vpcbr:
        ipv4_address: 192.0.2.20

  krakend_gateway:
    image: devopsfaith/krakend:2
    command: [ "run", "-d", "-c", "/krakend.json" ]
    dns: 192.0.2.10
    volumes:
      - ./krakend-gateway/krakend.json:/krakend.json
    ports:
      - "1234:1234"
      - "8080:8080"
      - "8090:8090"
    networks:
      vpcbr:
        ipv4_address: 192.0.2.23

  user-ms:
    build: user-ms/
    platform: linux/arm64
    restart: 'always'
    depends_on: [consul, krakend_gateway]
    networks:
      - vpcbr
    ports:
      - "8082"

networks:
  vpcbr:
    driver: bridge
    ipam:
      config:
        - subnet: 192.0.2.0/24

发送请求的服务是 Krakend ,目标服务是 user-ms ,它应该接受此请求,当我将 user-ms 端口绑定更改为“8082:8082”时,一切正常,

如果有人可以帮助我,我会很高兴,谢谢

I am trying to re-route request from gateway to a target service , and in case I am using static port binding everything works fine. But it is not flexible , so I want to run containers with dynamic ip and port in the network , to be able to run multiple instances.

I changed docker-compose.yml from

-ports: 
  "8082:8082"

to

-ports: 
  "8082"

And got an error

Get "http://c0000203.addr.dc1.consul.:60949/api/v1/users": dial tcp 192.0.2.3:60949: connect: connection refused

I am using consul as a service discovery , and registartor for registering containers

Base docker-compose file:

version: '3.7'
services:
  postgres:
    image: postgres:13
    restart: 'always'
    environment:
      - POSTGRES_DB=user-db
      - POSTGRES_PASSWORD=password
      - POSTGRES_USER=user
    ports:
      - "5432"
    networks:
      - vpcbr

  consul:
    image: consul:latest
    restart: 'always'
    environment:
      CONSUL_LOCAL_CONFIG: |
        {
          "recursors": [
            "8.8.8.8",
            "8.8.4.4"
          ],
          "dns_config": {
            "recursor_strategy": "random"
          },
          "ports": {
            "dns": 53
          }
        }
    networks:
      vpcbr:
        ipv4_address: 192.0.2.10
    ports:
      - '8500:8500'
      - '53/tcp'
      - '53/udp'

  registrator:
    image: gliderlabs/registrator:latest
    command: "consul://consul:8500"
    container_name: registrator
    depends_on:
      - consul
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock
    networks:
      vpcbr:
        ipv4_address: 192.0.2.20

  krakend_gateway:
    image: devopsfaith/krakend:2
    command: [ "run", "-d", "-c", "/krakend.json" ]
    dns: 192.0.2.10
    volumes:
      - ./krakend-gateway/krakend.json:/krakend.json
    ports:
      - "1234:1234"
      - "8080:8080"
      - "8090:8090"
    networks:
      vpcbr:
        ipv4_address: 192.0.2.23

  user-ms:
    build: user-ms/
    platform: linux/arm64
    restart: 'always'
    depends_on: [consul, krakend_gateway]
    networks:
      - vpcbr
    ports:
      - "8082"

networks:
  vpcbr:
    driver: bridge
    ipam:
      config:
        - subnet: 192.0.2.0/24

Service which is sending request is Krakend , target service is user-ms , which should accept this request , everything is work when I am changing user-ms port binding to "8082:8082"

Will be glad if someone could help me , thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不一样的天空 2025-01-25 07:03:23

使用 Registrator 的 -internal CLI 标志配置为使用 Docker 容器的内部 IP 地址(而不是外部主机 IP)注册服务。

根据 https://gliderlabs.github.io/registrator/latest/用户/运行/#registrator-options

  • -internal 使用公开端口而不是已发布端口。

如果使用-internal选项,Registrator将注册docker0内部IP和端口,而不是主机映射的IP和端口。

修改后的容器定义如下。

# docker-compose.yaml
...
  registrator:
    image: gliderlabs/registrator:latest
    command: "consul://consul:8500 -internal"
    container_name: registrator
    depends_on:
      - consul
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock
    networks:
      vpcbr:
        ipv4_address: 192.0.2.20
...

Use Registrator's -internal CLI flag to configure to register services with the internal IP addresses of the Docker container, not the external host IP.

Per https://gliderlabs.github.io/registrator/latest/user/run/#registrator-options

  • -internal Use exposed ports instead of published ports.

If the -internal option is used, Registrator will register the docker0 internal IP and port instead of the host mapped ones.

The modified container definition will then be as follows.

# docker-compose.yaml
...
  registrator:
    image: gliderlabs/registrator:latest
    command: "consul://consul:8500 -internal"
    container_name: registrator
    depends_on:
      - consul
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock
    networks:
      vpcbr:
        ipv4_address: 192.0.2.20
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文