我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 模式之外的方式运行其他容器,而外部网络则提供可预测的网络名称,而无需堆栈名称前缀。