簡體   English   中英

Docker撰寫:服務無法相互連接

[英]Docker compose: services cannot connect to each other

我一直在關注有關docker服務和集群的本教程 但是我在不同的Docker容器之間建立網絡時遇到了一些麻煩。

以下是我docker-compose.yml文件,它基本上包含兩個服務。 一個只是連接到兩個網絡的redis映像(盡管第二個目前尚無用)。 另一個是我的應用程序,需要連接到Redis。 因此,我選擇為redis服務提供一個靜態IP。

version: "3"

services:
  my_redis:
    image: redis
    ports:
      - "6379:6379"
    networks:
      first_network:
        ipv4_address: 172.20.1.1
      second_network:
        ipv4_address: 172.30.1.1
  my_app:
    build:
      context: .
      dockerfile: Dockerfile_my_app
    image: my_app_image
    depends_on:
      - my_redis
    deploy:
      replicas: 1 # 4
    networks:
      - first_network

networks:
  first_network:
    ipam:
      config:
        - subnet: 172.20.1.0/24
  second_network:
    ipam:
      config:
        - subnet: 172.30.1.0/24

以下是my_app Dockerfile:

FROM python:3.7
WORKDIR /app
COPY . /app
RUN pip3 install --trusted-host pypi.python.org -r requirements.txt
CMD ip a && wait-for-it.sh 172.20.1.1:6379 && PYTHONPATH=. python3 my_app.py

現在我遇到的問題是由於某種原因,我的應用程序無法連接到redis服務。 所以我嘗試了以下方法:

  1. 我嘗試使用以下命令單獨運行redis容器: sudo docker run -p 6379:6379 redis ,然后使用wait-for-it來確保localhost:6379已啟動並正在運行。
  2. 我以為那可能是docker stack deploy在redis服務之前創建了app服務,所以我在depends_on docker-compose文件中添加了depends_on部分。
  3. 我發現,即使depends_on 只能保證啟動的順序 (未准備好,即在繼續處理下一個圖像之前未運行所有命令),並且我必須找到其他解決方案 基於此,我還更改了Dockerfile_my_app以在它實際運行我的應用程序之前運行wait-for-it 沒用
  4. 最后,我不知道該怎么辦,我運行ip a來查看my_app服務是否獲得了正確的IP。 並且它獲得了正確范圍內的IP:

     my_test_my_app.1.jydyydckzyfh@snode-01 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 my_test_my_app.1.jydyydckzyfh@snode-01 | link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 my_test_my_app.1.jydyydckzyfh@snode-01 | inet 127.0.0.1/8 scope host lo my_test_my_app.1.jydyydckzyfh@snode-01 | valid_lft forever preferred_lft forever my_test_my_app.1.jydyydckzyfh@snode-01 | 1010: eth0@if1011: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default my_test_my_app.1.jydyydckzyfh@snode-01 | link/ether 02:42:ac:14:01:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 my_test_my_app.1.jydyydckzyfh@snode-01 | inet 172.20.1.3/24 brd 172.20.1.255 scope global eth0 my_test_my_app.1.jydyydckzyfh@snode-01 | valid_lft forever preferred_lft forever my_test_my_app.1.jydyydckzyfh@snode-01 | 1012: eth1@if1013: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default my_test_my_app.1.jydyydckzyfh@snode-01 | link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 1 my_test_my_app.1.jydyydckzyfh@snode-01 | inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1 my_test_my_app.1.jydyydckzyfh@snode-01 | valid_lft forever preferred_lft forever my_test_my_app.1.jydyydckzyfh@snode-01 | wait-for-it.sh: waiting 15 seconds for 172.20.1.1:6379 my_test_my_app.1.jydyydckzyfh@snode-01 | wait-for-it.sh: timeout occurred after waiting 15 seconds for 172.20.1.1:6379 

簡而言之,IP已正確分配。 但是, my_app服務無法連接到redis服務。 有什么原因嗎? 我在撰寫文件中缺少什么嗎?

任何幫助,將不勝感激。

嘗試將wait-for-it.sh 172.20.1.1:6379更改為:

wait-for-it.sh my_redis:6379

看看是否可行。

說明:如果我沒記錯,那么一旦容器成為同一網絡的一部分,它們便能夠通過docker-compose文件中聲明的服務名稱相互通信。

有關詳細信息,請參見``網絡''下的https://docs.docker.com/compose/compose-file/https://docs.docker.com/compose/networking/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM