我在使用容器名称连接容器时遇到了一些问题。
我有 4 个不同的容器... app_backend、app_web、app_redis、app_db。
在我的 docker-compose 文件中,我定义了一个网络 appnet,并将所有容器放在同一个网络上。我将在下面展示这一点。
app_backend 容器可以很好地连接到 app_redis 和 app_db 容器,容器名称作为主机名...这里是我使用的示例网址:http://app_redis:6379
或 http://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