簡體   English   中英

Docker 群不暴露端口

[英]Docker swarm not exposing port

我正在嘗試在單個節點上運行 docker 群,但無法將 docker 應用程序端口暴露給主機。

這類似於未公開的 Docker 群服務端口,但我在單個節點中運行,並提供有關我的問題和研究的更多詳細信息。

例如,給定以下 myapp.yml 文件:

version: "3"
services:
  app:
    image: myapp
    ports: 
      - "8123:8123"

堆棧通過以下方式啟動

docker stack deploy -c myapp.yml myapp

堆棧啟動后,當我嘗試訪問端口(通過 curl)時失敗。 例如,

curl -v http://localhost:8123/myapp

顯示連接被拒絕(該端口上沒有任何監聽)。

使用 docker 運行時代碼有效

以下命令啟動圖像並顯示如何驗證端口是否公開。

docker run -p 8123:8123 --name myapp myapp

Curl 然后工作。

curl -v http://localhost:8123/myapp

從 docker 中運行的應用程序給出 output。

當我運行docker ps時,PORTS 部分中的 output 顯示: 0.0.0.0:8123:8123/tcp

docker.network inspect bridge - 顯示 docker 容器已分配給網橋.network。 docker bridge.network 默認與 docker run 命令一起使用。

命令docker port myapp顯示:

8123/tcp -> 0.0.0.0:8123

它與docker ps PORT字段中的 output 相匹配。

docker 堆棧部署不暴露端口

開始使用docker stack deploy -c myapp.yml myapp后,我運行docker ps命令,在 output 的PORTS字段中只看到8123/tcp

命令docker port myapp沒有 output(表示 docker 主機沒有可用端口。

當我運行docker.network ls時,我看到:

NETWORK ID       NAME            DRIVER     SCOPE
1234567890      bridge           bridge     local
9999999999      myapp_default   overlay    swarm

所以我注意到 the.network myapp_default與 bridge,local 處於不同的模式。 我嘗試使用現有的bridge .network,但是當我在我的堆棧/撰寫文件中引用bridge .network 時,我發現創建了 .network myapp_bridge

所以我閱讀了 docker.networking https://blog.alexellis.io/docker-stacks-attachable.networks/是一篇很好的文章。

到目前為止,我還沒有得到它的工作,所以我起草了這個來尋求建議/幫助。

注意: 這篇文章(日期為 2017 年 2 月)說它應該有效,但沒有解決我的問題。

我想我很接近了。

資源和其他相關問題

https://docs.docker.com/v17.12/get-started/part5/ - 是 docker 堆棧技術的主要文檔 docker。 但是在該頁面上搜索 .networks 沒有任何用處。

https://blog.alexellis.io/docker-stacks-attachable.networks/ - 寫得好。

Docker 群服務端口未公開- 類似於我要問的問題。

https://runnable.com/docker/basic-docker.networking - 在 docker.networking 上寫文章。 它在創建 overlay.network 時說了以下內容(這是使用 docker 堆棧部署時的默認設置)。

這些網絡需要有效的鍵值存儲服務,例如 Consul、Etcd 或 ZooKeeper。 在創建您的 .network 之前,您必須安裝和配置您的鍵值存儲服務。

無法在 swarm compose yaml 文件中使用用戶定義的橋

成群結隊

ports:
  - "8123:8123"

將公開所有 swarm 節點上的端口,如果其他服務使用某些節點上的端口,您可能會遇到問題

您只能使用下一個 docker-compose.yml 配置在帶有容器的主機上公開端口

services:
  app:
    ports:
      - target: 8123
        published: 8123
        mode: host

您應該為您的服務定義一個網絡。 在 Docker Swarm 模式下,docker 容器變成了“Service”,要訪問它的端口,你調用 Service 的名字我為你提供了一個 docker-compose 文件如何連接 nginx 和 php-fpm 的例子

version: '3.2'
  services:
    nginx:
      image: nginx
      links:
      - php
      - mariadb:mysql
      ports:
      - "8880:80"
      networks:
      - frontend
      deploy:
        #mode: replicated
        replicas: 1
        placement:
          constraints: [node.role == manager]
    php:
       image: php
       deploy:
         #mode: replicated
         replicas: 1
         placement:
           constraints: [node.role == manager]
           #endpoint_mode: dnsrr
       links:
         - mariadb:mysql
    mariadb:
       image: mariadb:10.4.1
       #restart: always
       deploy:
         mode: replicated
         replicas: 1
         #placement:
         #constraints: [node.role == manage]
         environment:
           MYSQL_ROOT_PASSWORD: SECRET          
         volumes:
           - type: volume
              source: mydatabase
              target: /var/lib/mysql/data
              volume:
                nocopy: true # do not copy data from container when a volume is created?
    networks:
      frontend  
    volumes:
      mydatabase:

部署后(docker stack deploy -c docker-compose.yaml) ,查看服務列表:

docker service ls 

要指導 nginx 如何訪問您的 php-fpm 后端,請編輯您的 nginx 配置文件:

location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass **NAME_OF_PHP_SERVICE_IN SWARM**:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

不是將容器的 IP 地址 ( IP:9000 ) 放入 Swarm 集群中,而是將 php 服務的名稱放入

我有一個在 SWARM 和本地 Linux 操作系統中使用的端口,兩個應用程序都運行但只有一個接收到傳入連接。

奇怪的是,當我預計嘗試使用該端口的應用程序之一發生錯誤時,卻沒有發生 EADDRINSE 錯誤。

例如,在端口 8080 上運行本地應用程序,並在使用端口 8080 的此主機上使用 SWARM。

傳入連接到達端口 8080,連接被發送到其中一個(我不記得是哪個)。

我有同樣的問題。 通過更改IP解決。首先,獲取當前docker swarm節點IP地址。

docker info

找到你 IP Manager Addresses行。 例如,我的 IP 是192.168.0.13 現在您可以通過此地址192.168.0.13:8123打開您的應用程序。

我有同樣的問題 - 在我的 ubuntu 機器上它正在工作 - 在我的 debian 服務器上沒有。 最后我把它縮小到 debian 上使用的 kernel 版本。 升級到 5.11.22-5 為我解決了這個問題。

有關於缺少 kernel 模塊的帖子(沒有提及哪個)-也許這是相關的。

由於 IPv6,這種情況經常發生。 在主機上, localhost/etc/hosts中定義為::1而不是127.0.0.1 swarm 中的 Ingress.networking 不支持 IPv6 所以有兩種可能的解決方案:

  1. 使用 IPv4 連接: curl -v http://127.0.0.1:8123/myapp

  2. 使用主機模式而不是 ingress.networking 發布端口。 這僅在運行容器的主機上發布端口。 這對於部署在每個節點上的服務( deploy: mode: global )以刪除節點之間的額外網絡躍點很有用。 要為已發布的端口切換到主機模式,請遵循Ryabchenko Alexander 的建議,在發布端口時切換到長語法:

     ports: - target: 8123 published: 8123 mode: host

    更多詳細信息在撰寫文件 v3 參考中: https://docs.docker.com/compose/compose-file/compose-file-v3/#long-syntax-1 請注意,在此處以主機模式發布端口不同於在沒有 .network 沙箱的情況下運行容器的 host.networking,遺憾的是“主機”在這里用於兩種不同的事物,一種在 swarm 之外,另一種在 docker 之外隔離。

暫無
暫無

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

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