我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
Howeber 我想从外部访问每个节点中的服务。
我需要这个案例的基本练习。
我所做的如下所示
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 和可视化工具。
但即使在这种情况下,我也无法访问 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]
我假设您使用 部署了
man
容器内的第二个 compose 文件docker stack deploy
,并且该文件具有版本 3 或更高版本。要从外部访问在 docker 内部运行的任何应用程序的端口,您需要发布该端口:
请注意,不必使用带有 swarm 的外部或可连接网络来访问端口。Attachable 允许您在同一网络上运行 swarm 模式之外的其他容器,并且 external 提供了一个可预测的网络名称,没有堆栈名称前缀。