我正在尝试运行微服务部署的原型(目前仅出于研发目的)。我做了一个非常基本的API端点,并在Visual Studio中使用了docker-compose来创建容器。 API代码如下:
[RoutePrefix("api/test")]
public class TestController : ApiController
{
[HttpGet]
[Route("")]
public HttpResponseMessage Get()
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "Microservice Test Successful 2");
return response;
}
}
部署的容器具有以下详细信息(列表中的第二个):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31d4d7f15d3e testmicroservice:latest "C:\\ServiceMonitor.e…" 16 hours ago Up 16 hours testservice.1.ttt25efcq418xbsu7vqksl94p
816c526ef9f3 testmicroservice "cmd /c 'start /B C:…" 16 hours ago Up 16 hours 0.0.0.0:8785->80/tcp dockercompose2417227251495589316_gdms.testmicroservice_1
我可以很高兴地在发布端口上的浏览器中访问它,并从API中获取预期结果:
我尝试将这个映像与Docker服务部署在一起(在docker中激活了swarm模式),并映射了另一个端口来访问它:
ID NAME MODE REPLICAS IMAGE PORTS
m3wfea6n9anl testservice replicated 1/1 testmicroservice:latest *:5050->80/tcp
该服务似乎运行正常,并且该任务的容器也运行良好(这是上面代码段中的两个容器中的第一个容器。
由于某种原因,当我尝试访问同一端点但使用新端口(再次在浏览器中的localhost上)时,出现“无法连接”的情况。
完整的docker服务详细信息如下。
[
{
"ID": "m3wfea6n9anligjrrihbi03vt",
"Version": {
"Index": 500
},
"CreatedAt": "2018-10-04T16:19:17.2891599Z",
"UpdatedAt": "2018-10-04T16:19:17.2921526Z",
"Spec": {
"Name": "testservice",
"Labels": {},
"TaskTemplate": {
"ContainerSpec": {
"Image": "testmicroservice:latest",
"Init": false,
"StopGracePeriod": 10000000000,
"DNSConfig": {},
"Isolation": "default"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"Delay": 5000000000,
"MaxAttempts": 0
},
"Placement": {},
"ForceUpdate": 0,
"Runtime": "container"
},
"Mode": {
"Replicated": {
"Replicas": 1
}
},
"UpdateConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"RollbackConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"EndpointSpec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 5050,
"PublishMode": "ingress"
}
]
}
},
"Endpoint": {
"Spec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 5050,
"PublishMode": "ingress"
}
]
},
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 5050,
"PublishMode": "ingress"
}
],
"VirtualIPs": [
{
"NetworkID": "ylj65tghq4ek1ewmtysaitmcx",
"Addr": "10.255.0.31/16"
}
]
}
}
]
图像的dockerfile是这样的:
FROM microsoft/aspnet:4.7.2-windowsservercore-1709
ARG source
WORKDIR /inetpub/wwwroot
COPY ${source:-obj/Docker/publish} .
关于我可能错过的任何建议都是很棒的。
答案 0 :(得分:0)
我现在设法解决了这个问题,并认为如果别人遇到相同的情况,我会分享我所做的事情。
我认为我面临的问题是由于以下两个因素造成的:
1)Docker CE上的Windows Server容器/主机不完全支持路由网格
2)容器与主机之间的操作系统内核之间的不匹配,这再次导致入口网络和发布端口出现问题(尽管它并未抛出任何警告/错误来表明这一事实)。
>我是如何工作的:
1)创建了一个1803 Windows Server VM,并安装了Docker EE Basic(Windows Server 2016及更高版本免费提供)。我相信在1709年上运行VM也可以工作)。如果您有运行Windows Server 2016+的VM,则可以按照Docker Website中的说明安装EE Basic版本的docker(请确保将其更新为最新版本)。
2)更改了我用来创建映像的Dockerfile以使用Microsoft / aspnet的1803版本:
FROM microsoft/aspnet:4.7.2-windowsservercore-1803
ARG source
WORKDIR /inetpub/wwwroot
COPY ${source:-obj/Docker/publish} .
(如果您使用的是1709 Windows Server VM,则应该是:
FROM microsoft/aspnet:4.7.2-windowsservercore-1709
ARG source
WORKDIR /inetpub/wwwroot
COPY ${source:-obj/Docker/publish} .
3)将新映像部署到VM。
4)在服务器上设置群模式:
Docker Swarm Init
5)将映像作为服务部署:
Docker Service Create --name testservice --publish 3000:80 testmicroservice
完成这些步骤之后,我现在有了一个功能齐全的集群,该集群在具有许多不同复制服务的多节点集群上运行。
希望这会有所帮助。