访问节点内部docker-swarm的简单方法

访问节点内部docker-swarm的简单方法

expose在docker文件中使用并打开了端口。

然而问题仍然存在,@BMitch 的答案ports也是这种情况下必要的解决方案。

现在,我的第一个问题已经解决了。非常感谢。


最新更新。

我登录管理器并检查服务docker service ls和容器docker container ls

然后发现

服务端口开放,容器端口未开放。

手动运行容器时,您可以进行如下设置-p 8000:8000

然而在这种情况下,容器由堆栈配置 yml 启动, ports适用于服务但不适用于容器。

那么,我该如何打开集装箱港口呢?

docker service ls

t402qi5kqifz        django_python           global              1/1                 registry:5000/myapp/djangosrc:latest   *:8000->8000/tcp
yadtkm6nhwdc        phpmyadmin_phpmyadmin   global              1/1                 phpmyadmin/phpmyadmin:latest             *:8009->80/tcp
3mvzc1rjc8pg        visualizer_app          global              1/1                 dockersamples/visualizer:latest          *:9009->8080/tcp

docker container ls

CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                 PORTS               NAMES
1d2b50730959        registry:5000/myapp/djangosrc:latest   "uwsgi --socket :800…"   2 minutes ago       Up 2 minutes                               django_python.ne4qcvhmmtchn3popj26plcmz.20txv4hixixgsvwzw23jmhqln
fd5d42cd5fd6        dockersamples/visualizer:latest          "npm start"              2 hours ago         Up 2 hours (healthy)   8080/tcp            visualizer_app.ne4qcvhmmtchn3popj26plcmz.o60n8gzbxod6p6rmznvpls4z6
fd28f1efd77d        phpmyadmin/phpmyadmin:latest             "/docker-entrypoint.…"   2 hours ago         Up 2 hours             80/tcp              phpmyadmin_phpmyadmin.ne4qcvhmmtchn3popj26plcmz.v1flhjuez68lmhb9erlsoz8wc

我在docker-swarm中有一些服务。

如果我将服务设为全局,则可以简单地访问它

localhost:8000

但是我想从外部访问每个节点中的服务。

我需要针对这个案例进行基本的练习。

我所做的是这样的

1)我创建了覆盖网络

docker container exec -it man docker network create --driver=overlay --attachable djangonet

2)打开管理节点端口8000:8000

version: "3"
services:
  registry:
    container_name: reg
    image: registry:2.6
    ports:
      - 5000:5000
    volumes:
      - "./registry-data:/var/lib/registry"
  manager:
    container_name: man
    image: docker:18.05.0-ce-dind
    privileged: true
    ports:
      - 8000:8000 ## here
      - 8082:8082
      - 9009:9009
    depends_on:
      - registry
    expose:
      - 3375
    command: "--insecure-registry registry:5000"
    volumes:
      - "./stack:/stack"
  node01:
    container_name: node01
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    depends_on:
      - manager
      - registry
    expose:
      - 7946
      - 7946/udp
      - 4789/udp
    command: "--insecure-registry registry:5000"
  node02:
    container_name: node02
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    depends_on:
      - manager
      - registry
    expose:
      - 7946
      - 7946/udp
      - 4789/udp
    command: "--insecure-registry registry:5000"

3)service_port在服务中设置8000并设置外部网络。

services:
  python:
    image: registry:5000/myapp/djangosrc:latest
    environment:
      SERVICE_PORTS: 8000
    networks:
      - djangonet
    deploy:
      replicas: 1
      placement:
        constraints: [node.role != manager]
networks:
  djangonet:
    external: true

但仍然不起作用。

我应该在哪里设置更多?


我尝试了一些方法,但都无济于事。所以我改变了方法以进行测试。

用最简单的方式把我的服务作为全球性的放在经理身上。

以同样的方式我可以访问 phpmyadmin 和 visualizer。

但即使在这种情况下,我也无法访问 localhost:8000

我担心有什么东西阻塞了 myapp/djangosrc 中的端口??

有可能发生吗??

w7g3h9poppb4        django_python           global              1/1                 registry:5000/myapp/djangosrc:latest   *:8000->8000/tcp
yadtkm6nhwdc        phpmyadmin_phpmyadmin   global              1/1                 phpmyadmin/phpmyadmin:latest             *:8009->80/tcp
3mvzc1rjc8pg        visualizer_app          global              1/1                 dockersamples/visualizer:latest          *:9009->8080/tcp



version: '3'
services:
  python:
    image: registry:5000/myapp/djangosrc:latest
    #command: uwsgi --socket :8001 --module myapp.wsgi --py-autoreload 1 --logto /tmp/mylog.log

    ports:
      - 8000:8000
    deploy:
      mode: global
      placement:
        constraints: [node.role == manager]

答案1

man我假设您使用 在容器内部署了第二个撰写文件docker stack deploy,并且该文件具有版本 3 或更高版本。

要从外部访问 docker 内部运行的任何应用程序的端口,您需要发布该端口:

version: '3'
services:
  python:
    image: registry:5000/myapp/djangosrc:latest
    environment:
      SERVICE_PORTS: 8000
    # include the below ports section to publish a port
    ports:
      - 8000:8000
    networks:
      - djangonet
    deploy:
      replicas: 1
      placement:
        constraints: [node.role != manager]
networks:
  djangonet:
    external: true

请注意,使用 swarm 时无需使用外部或可连接网络来访问端口。可连接网络允许您在同一网络上以 swarm 模式之外的方式运行其他容器,而外部网络则提供可预测的网络名称,而无需堆栈名称前缀。

相关内容