Docker-Compose - 容器网络 - 名称或服务未知

时间:2021-01-26 16:37:47

标签: docker docker-compose

我在使用容器名称连接容器时遇到了一些问题。

我有 4 个不同的容器... app_backend、app_web、app_redis、app_db。

在我的 docker-compose 文件中,我定义了一个网络 appnet,并将所有容器放在同一个网络上。我将在下面展示这一点。

app_backend 容器可以很好地连接到 app_redis 和 app_db 容器,容器名称作为主机名...这里是我使用的示例网址:http://app_redis:6379http://app_db:3306

除非我将主机名指定为 localhost,否则 app_web 容器拒绝连接到我的 app_backend。例如... http://localhost:4000 有效,但 http://app_backend:4000 无效。

app_backend 容器正在运行一个快速服务器,我已经通过记录服务器名/主机名确认它在 http://app_backend:4000 上运行。

如果我 ssh (docker exec -it web bash) 进入 app_web 容器并 ping app_backend 容器,ping app_backend,它返回一个 ping!但是,如果我使用端口 ping http://app_backend:4000 甚至只是 app_backend:4000 ping app_backend 容器,它会返回 Name or Service Not Known

无论哪种方式...我的前端正在尝试从我的 express api 请求数据,但我不知道该怎么做才能使其正常工作。

以前,我会从 http://localhost:4000/api/thing-to-call 处的 api 请求。我在上传文件时遇到了一些网络问题,我认为这与作为本地主机有关...我想让它像其他连接一样,例如 http://app_backend:4000/api/thing-to-call。< /p>

感谢您花时间看这个并为我指明正确的方向...

version: '3'
services:
  db:
    image: mysql
    restart: always
    environment:
      MYSQL_DATABASE: 'appdb'
      MYSQL_USER: 'app_user'
      MYSQL_PASSWORD: 'removed_for_this'
      MYSQL_ROOT_PASSWORD: 'removed_for_this'
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - appdb:/var/lib/mysql:Z
    networks:
      - appnet
  redis:
    build:
      context: ./Assets/Docker/redis
    image: registry.location.secret/app:redis
    command: redis-server --requirepass removed_for_this
    ports:
      - '6379:6379'
    container_name: app_redis
    volumes:
      - ./redis-data:/var/lib/redis:Z
      - ./Assets/Docker/redis/redis-dev.conf:/usr/local/etc/redis/redis.conf:Z
    environment:
      - REDIS_REPLICATION_MODE=master
    networks:
      - appnet
  app_backend:
    build:
      context: ./app-backend
    image: registry.location.secret/app:backend
    ports:
      - '4000:4000'
    expose:
      - '4000'
    container_name: app_backend
    volumes:
      - ./app-backend:/app:Z
      - /app/node_modules
      - ./Assets/_dev/backend/.env:/app/.env:Z
    networks:
      - appnet
  app_web:
    build:
      context: ./app-web
    image:
      registry.location.secret/app:web
    ports:
      - '3000:3000'
    container_name: app_web
    stdin_open: true
    volumes:
      - ./app-web:/app/:Z
      - /app/node_modules
      - ./Assets/_dev/web/.env:/app/.env:Z
    networks:
      - appnet
volumes: 
  appdb:
networks:
  appnet:

这是一个 ping 的例子..

root@f82cc599058d:/app# ping app_backend
PING app_backend (172.19.0.2) 56(84) bytes of data.
64 bytes from app_backend.app_appnet (172.19.0.2): icmp_seq=1 ttl=64 time=0.109 ms
64 bytes from app_backend.app_appnet (172.19.0.2): icmp_seq=2 ttl=64 time=0.080 ms
^C
--- app_backend ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1056ms
rtt min/avg/max/mdev = 0.080/0.094/0.109/0.017 ms
root@f82cc599058d:/app# ping app_backend:4000
ping: app_backend:4000: Name or service not known

0 个答案:

没有答案