Docker群不暴露端口

时间:2019-01-29 00:24:02

标签: docker docker-compose

我正在尝试在单个节点上运行docker swarm,并且无法使docker app端口暴露给主机。

这类似于Docker swarm service port not exposed,但我在单个节点上运行,并提供了有关我的问题和研究的更多详细信息。

例如,给定以下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 run时代码有效

以下命令启动映像,并显示如何验证端口是否暴露。

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

然后卷曲。

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

提供在docker中运行的应用的输出。

当我运行docker ps时,“端口”部分的输出将显示:0.0.0.0:8123:8123/tcp

docker network inspect bridge-显示docker容器已分配给 bridge 网络。默认情况下,docker bridge网络与docker run命令一起使用。

命令docker port myapp显示:

8123/tcp -> 0.0.0.0:8123

docker ps PORT 字段的输出相匹配。

docker stack deploy不公开端口

开始使用docker stack deploy -c myapp.yml myapp之后,我运行docker ps命令,在输出的 PORTS 字段中仅看到8123/tcp

命令docker port myapp没有输出(表示Docker主机没有可用的端口。

运行docker network ls时,我看到:

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

所以我注意到网络 myapp_default 与本地网桥的模式不同。我尝试使用现有的 bridge 网络,但是当我在堆栈/撰写文件中引用 bridge 网络时,我发现创建了网络 myapp_bridge

所以我读过docker网络https://blog.alexellis.io/docker-stacks-attachable-networks/是一篇不错的文章。

到目前为止,我还没有开始工作,所以我起草了该文件以寻求建议/帮助。

注意:This aricle (dated Feb 2017)说应该可以,但是不能解决我的问题。

我想我要走了。

资源和其他相关问题

https://docs.docker.com/v17.12/get-started/part5/-是有关docker stack技术的docker主要文档。但是在该页面上搜索网络并没有什么用。

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

Docker swarm service port not exposed-与我要问的问题类似。

https://runnable.com/docker/basic-docker-networking-在Docker网络上撰写文章。创建覆盖网络时,它会显示以下内容(使用docker stack deploy时的默认设置)。

  

这些网络需要有效的键值存储服务,例如   领事,Etcd或ZooKeeper。您必须安装并配置您的   键值存储服务,然后再创建网络。

Can not use user-defined bridge in swarm compose yaml file

2 个答案:

答案 0 :(得分:3)

群居

ports:
  - "8123:8123"

将在所有群集节点上公开端口,如果其他服务在某些节点上使用端口,则可能会出现问题

您只能使用下一个docker-compose.yml配置

在带有容器的主机上公开端口
services:
  app:
    ports:
      - target: 8123
        published: 8123
        mode: host

答案 1 :(得分:1)

您应该为您的服务定义一个网络。在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服务的名称放入了