Docker撰写并从Windows主机连接到容器

时间:2018-08-14 20:22:24

标签: docker docker-compose

我正在学习docker,请谅解。

我的环境配置

  • 我正在Windows(8 64-bit)上工作
  • 我有Docker toolbox(以及kitematic,但我仅使用quickterminal
  • Docker版本:
    • 客户:18.03.0-ce
    • 服务器:18.06.0-ce
  • docker计算机:ip:192.168.99.100
  • 假设我有以下kibana图片docker.elastic.co/kibana/kibana:6.3.2

创建容器:1-通过run命令,2-通过docker-compose

1 docker container run -p 5601:5601 <image_name>(让我们跳过其他             标志和设置)

在Windows端发出http://192.168.99.100:5601时,它将我连接到在virtualbox上运行的default码头工人机器,并提供-p <docker_host>:<container>映射(libnetwork?)来重定向我的呼叫到kibana容器中,因此我可以从Windows主机连接到该容器。

docker container inspect <container_name>告诉我使用了默认的bridge网络。这意味着一切都按预期进行:

"NetworkSettings": {
            (...)
            "Ports": {
                "5601/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "5601"
                    }
                ]
            },
            (...)
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "7(...)1",
                    "EndpointID": "3(...)4",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "0(...)2",
                    "DriverOpts": null
                }
            }

2 。我想通过docker-compose实现相同的目标。让我们暂时跳过该示例的无意义的操作-就像我说的那样,仅出于学习目的。

version: "2" 

services:
    kibana:
        container_name: kibana
        hostname: kibana
        image: "docker.elastic.co/kibana/kibana:6.3.2"
        volumes:
         - ./kibana.yml:/usr/share/kibana/config/kibana.yml
        ports:
         - "5601:5601"
        networks:
         - tmp_net
networks:
  tmp_net:
    driver: bridge

让我们提出docker-compose up。在docker network ls命令的输出中,我看到它用id:src_tmp_netdriver:bridge创建了一个新的网络scope:local。正在检查新的网络:

[
    {
        "Name": "src_tmp_net",
        "Id": "4(...)6",
        "Created": "2018-08-14T19:59:50.269922334Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.27.0.0/16",
                    "Gateway": "172.27.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "7(...)c": {
                "Name": "kibana",
                "EndpointID": "d(...)f",
                "MacAddress": "02:42:ac:1b:00:02",
                "IPv4Address": "172.27.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

无法像使用http://192.168.99.100:5601命令创建容器那样,将Windows主机上的kibana连接到docker container run (...)

我认为问题出在创建的新网络(src_tmp_net)中。 Docker机器中172.27.0.0/16池中是否缺少配置?

问题

为什么我无法从Windows主机连接到上述docker compose创建的容器?


已编辑(14.8.18-21:37 Z):

根据评论中的要求。 Here是启动kibana容器之后的日志。它是由docker-compose up > kibana_logs.txt记录的。


答案(就我而言)

@lvthillo先生指出的正是-kibana.yml文件。在6.3部分下的official documentation(对于版本Docker default)中,我们可以找到:

  

在使用以下设置时,以下设置具有不同的默认值   Docker映像:(...) server.host:“ 0” (...)。这些设置是   在默认的kibana.yml中定义。可以用   自定义kibana.yml或通过环境变量。重要。 如果   用自定义版本替换kibana.yml,请确保复制上面的内容   如果要保留它们,则默认为自定义文件。如果没有,他们   将被新文件“屏蔽”。

kibana server properties中,我们可以找出server.host:到底是什么:

  

此设置指定后端服务器的IP地址。

这为我的情况提供了一点启示:

  1. 我的第一种方法(docker container run (...))有效是因为我 没有指定volume来挂载和使用docker容器 非永久性存储,并且-根据上述规范-已使用 默认 kibana.yml文件。
  2. 我的第二种方法(docker-compose)不起作用,因为我没有设置kibana.yml就指定/挂载了自己的server.host:文件。它覆盖了默认文件,并且因为我没有在其中指定默认设置(尤其是server.host:),所以我无法连接。

0 个答案:

没有答案