docker-swarm 如何暴露端口?

how does docker-swarm expose port?

在我使用 docker-swarm 部署了一个 docker 应用程序之后,可以从 $mac-host-ip:8481 访问该应用程序,然后我注意到我的以下内容主持人(Mac),

$ sudo lsof -PiTCP -sTCP:LISTEN |grep 8481
dockerd   1882   root   97u  IPv6 287775      0t0  TCP *:8481 (LISTEN)

$ docker ps --filter publish=8481
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

$ docker ps --filter expose=8481
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Compose 应用程序需要这样做吗?

谢谢!

使用入口时,端口会直接在服务上发布,您会在端口列下的 docker service ls 下看到它。发布的端口被转发到分配给服务的 VIP,然后使用 IPVS 转发到服务中的一个容器。

$ docker service create -p 8080:80 --name nginx-test nginx
mvwgqaolsjbiqsoo4d1ett20v
overall progress: 1 out of 1 tasks    
1/1: running   [==================================================>]                                                                                                                                               
verify: Service converged                  

$ docker service ls | grep nginx-test                                                                     
mvwgqaolsjbi        nginx-test                 replicated          1/1                 nginx:latest                                       *:8080->80/tcp

您还可以使用 service inspect 查看已发布的端口,例如以下循环遍历所有服务以显示其端口:

docker service ls -q | while read service_id; do
  docker service inspect $service_id -f \
    '{{.Spec.Name}} - {{range .Spec.EndpointSpec.Ports}}{{.PublishedPort}} {{end}}'
done | sort