【问题标题】:Having trouble understanding Docker Service port publishing无法理解 Docker 服务端口发布
【发布时间】:2019-09-23 18:10:33
【问题描述】:

我需要您的帮助来了解我是否正确理解了 docker 发布的工作方式。

我使用 Dockerfile 创建了一个自定义镜像。 Dockerfile如下:

FROM mcr.microsoft.com/dotnet/framework/wcf:4.8
COPY ./ .
RUN "C:\assets\vc_redist.x64.exe" /quiet /install
WORKDIR /ServicioOcr .
RUN powershell -NoProfile -Command \    
Import-module IISAdministration; \    
New-IISSite -Name "ServicioOcr" -PhysicalPath C:\ServicioOcr -BindingInformation "*:1990:"; \ 
Add-WindowsFeature NET-WCF-HTTP-Activation45 
ENTRYPOINT ["C:\\KeepAlive.exe"]
EXPOSE 1990

然后我运行一个容器发布暴露的端口没有问题:

d96e49d67157        ocrserviceimage:v1   "C:\\ServiceMonitor.e"   3 hours ago         Up 2 hours          80/tcp, 808/tcp, 0.0.0.0:2019->1990/tcp   ocrservcont

然后,我创建了一个 Docker 服务,因此我可以拥有托管该服务的容器的多个副本,使用以下命令:

docker service create --name=SWARM_OCR_SERVICE ocrserviceimage:v8 --publish 2020:1990

然后我让容器在服务中运行,所以我检查端口是否正确发布,但不是

shkmfrrodg1a        SWARM_OCR_SERVICE.1       ocrserviceimage:v8   BAZ1573221          Running             Running 2 hours ago 

据我了解,Docker Service 的工作方式如下:

  • Docker 服务在其中创建指定数量的副本。每个副本 运行服务的单独实例。
  • 容器内的服务应该可以通过发布的 ip:端口。
  • 向发布的 ip:port 发出请求,然后转发 到可以处理它的可用副本/容器。

我的理解对吗?

提前致谢。

【问题讨论】:

    标签: docker docker-swarm docker-swarm-mode


    【解决方案1】:

    为了确保服务端口已发布运行:

    docker service inspect --format="{{json .Endpoint.Spec.Ports}}" [service_id]
    
    • Docker 服务在其中创建指定数量的副本。每个副本运行一个单独的服务实例。

    是的。我会说不同的。 Docker swarm 创建指定数量的副本。副本数是 docker swarm 强制执行的理想状态。

    • 容器内的服务应该可以通过发布的 ip:port 获得。

    您在服务副本(单个容器)中的应用程序应该可以通过已发布的端口访问。

    • 向发布的 ip:port 发出请求,然后转发到可以处理它的可用副本/容器。

    是的。假设您在由 ip 标识的机器上运行您的服务。发布端口后,某些 http 客户端可以通过 ip:[published_port] 访问服务副本

    Docker swarm 使用routing mesh 将请求转发到每个服务副本,除非您使用bypassed 它。如果您确实绕过了路由网格,则每个主机 vm 将只能运行一个具有已发布端口的服务副本。如果在发布服务端口时使用路由网格(默认),则可以在一个主机 vm 上拥有多个服务副本。

    查看工作运行中的路由网格:

    docker service create \
      --name my-web \
      --publish published=8080,target=80 \
      --replicas 2 \
      nginx
    

    检查服务日志:docker service logs -f my-web

    然后尝试从 2 个不同的浏览器向localhost:8080/[any_url] 发送多个请求,并检查上一步的服务日志。

    由于路由网格,您应该看到两个服务副本都在 ip:[published_port] 上为您的请求提供服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 2019-04-12
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多