如何使用指定的暴露端口启动docker bundle?

时间:2016-09-01 20:47:13

标签: docker docker-compose docker-swarm

如果您不熟悉docker bundle,请阅读this.

所以我尝试从以下docker-compose.yml

创建一个简单的docker bundle
version: "2"
services:
  web:
    image: cohenaj194/apache-simple
    ports:
      - 32701:80
  nginx:
    image: nginx
    ports:
      - 32700:80

但是这个捆绑包创建的docker服务的端口没有暴露,我无法通过端口32700或32701访问我的服务中的任何容器,正如我在docker-compose.yml中指定的那样。我该如何公开docker bundle服务的端口?

更新:我认为我的问题可能是使用test.dab创建的docker-compose bundle文件中没有提及端口32700或32701:

{
  "Services": {
    "nginx": {
      "Image": "nginx@sha256:d33834dd25d330da75dccd8add3ae2c9d7bb97f502b421b02cecb6cb7b34a1b6", 
      "Networks": [
        "default"
      ], 
      "Ports": [
        {
          "Port": 80, 
          "Protocol": "tcp"
        }
      ]
    }, 
    "web": {
      "Image": "cohenaj194/apache-simple@sha256:6196c5bce25e5f76e0ea7cbe8e12e4e1f96bd36011ed37d3e4c5f06f6da95d69", 
      "Networks": [
        "default"
      ], 
      "Ports": [
        {
          "Port": 80, 
          "Protocol": "tcp"
        }
      ]
    }
  }, 
  "Version": "0.1"
}

尝试将额外端口插入此文件也不起作用,并导致以下错误:

Error reading test.dab: JSON syntax error at byte 229: invalid character ':' after object key:value pair

Update2:我的服务可通过默认端口访问,当未定义主机端口时,docker swarm会分配给服务:

user@hostname:~/test$ docker service inspect test_nginx --pretty
ID:     3qimd4roft92w3es3qooa9qy8
Name:       test_nginx
Labels:
 - com.docker.stack.namespace=test
Mode:       Replicated
 Replicas:  2
Placement:
ContainerSpec:
 Image:     nginx@sha256:d33834dd25d330da75dccd8add3ae2c9d7bb97f502b421b02cecb6cb7b34a1b6
Networks: 1v5nyqqjnenf7xlti346qfw8n
Ports:
 Protocol = tcp
 TargetPort = 80
 PublishedPort = 30000

然后我可以从端口30000获取我的服务,但是我希望能够定义我的服务将使用的主机端口。

1 个答案:

答案 0 :(得分:0)

从Docker 1.12版本开始,无法在捆绑包中指定“已发布”端口。捆绑包是一种可移植的格式,暴露的端口是不可移植的(因为如果两个捆绑包使用相同的捆绑包,它们会发生冲突)。

因此,暴露的端口不会成为捆绑配置的一部分。目前唯一的选择是运行docker service update来添加已发布的端口。将来可能还有其他方法可以实现这一目标。