докер-машина (виртуальный ящик vm) экспорт порта контейнера на хост-машину сбой

Я использую панель инструментов Docker для настройки:

  1. virtualbox vm по умолчанию в Windows 10
  2. контейнер, работающий внутри виртуального бокса vm

Проблема в том, что я не могу получить доступ к веб-службе в контейнере.

вот какая команда, которую я использую:

# start up the web service
docker run -p 8000:8000 -p 9000:9000 -t -i xxx/myweb /bin/bash -l -c '/root/myweb/demos/web/start-servers.sh'

# terminal print after above cmd
Starting the HTTP TLS server on port 8000
and the Secure WebSocket server on port 9000.

Access the demo through the HTTP server in your browser.
If you're running on the same computer outside of Docker, use https://localhost:8000
If you're running on the same computer with Docker, find the IP
address of the Docker container and use https://<docker-ip>:8000.
If you're running on a remote computer, find the IP address
and use https://<remote-ip>:8000.

WARNING: Chromium will warn on self-signed certificates. Please accept the certificate
and reload the app.

WebSocket Server: Logging to '/tmp/openface.websocket.log'

2017-05-27 15:10:13+0000 [-] Log opened.
2017-05-27 15:10:13+0000 [-] WebSocketServerFactory (TLS) starting on 9000
2017-05-27 15:10:13+0000 [-] Starting factory <autobahn.twisted.websocket.WebSocketServerFactory object at 0x7f00ef9f5c90>

Теперь я попытался получить доступ по следующему адресу, но все не смогли загрузить веб-страницу:

  1. локальный: 8000
  2. 192.168.99.100:8000 (ip виртуального бокса vm)
  3. 172.17.0.2:8000 (ip контейнера)

Вот некоторые команды, которые я использовал, и их результаты:

$ docker-machine config
--tlsverify
--tlscacert="C:\\Users\\AIT\\.docker\\machine\\machines\\default\\ca.pem"
--tlscert="C:\\Users\\AIT\\.docker\\machine\\machines\\default\\cert.pem"
--tlskey="C:\\Users\\AIT\\.docker\\machine\\machines\\default\\key.pem"
-H=tcp://192.168.99.100:2376

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                          NAMES
5896815b991d        xxx/myweb  "/bin/bash -l -c /..."   12 minutes ago      Up 12 minutes       192.168.99.100:8000->8000/tcp, 192.168.99.100:9000->9000/tcp   thirsty_wiles

$ docker inspect thirsty_wiles
[
    {
        "Id": "5896815b991d394753b5eabdd4fe7967e2e4bd65791ffe7fa1d3e82486c9f050",
        "Created": "2017-05-27T15:10:12.172475859Z",
        "Path": "/bin/bash",
        "Args": [
            "-l",
            "-c",
            "/root/myweb/demos/web/start-servers.sh"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,                "Pid": 2753,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2017-05-27T15:10:12.294120929Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:3c9f00308ef150eef9d50576245df69234437a4360684f9b262a284f50dc15d7",
        "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/5896815b991d394753b5eabdd4fe7967e2e4bd65791ffe7fa1d3e82486c9f050/resolv.conf",
        "HostnamePath": "/mnt/sda1/var/lib/docker/containers/5896815b991d394753b5eabdd4fe7967e2e4bd65791ffe7fa1d3e82486c9f050/hostname",
        "HostsPath": "/mnt/sda1/var/lib/docker/containers/5896815b991d394753b5eabdd4fe7967e2e4bd65791ffe7fa1d3e82486c9f050/hosts",
        "LogPath": "/mnt/sda1/var/lib/docker/containers/5896815b991d394753b5eabdd4fe7967e2e4bd65791ffe7fa1d3e82486c9f050/5896815b991d394753b5eabdd4fe7967e2e4bd65791ffe7fa1d3e82486c9f050-json.log",
        "Name": "/thirsty_wiles",
        "RestartCount": 0,
        "Driver": "aufs",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "8000/tcp": [
                    {
                        "HostIp": "192.168.99.100",
                        "HostPort": "8000"
                    }
                ],
                "9000/tcp": [
                    {
                        "HostIp": "192.168.99.100",
                        "HostPort": "9000"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                30,
                120
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": -1,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Data": null,
            "Name": "aufs"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "5896815b991d",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "ExposedPorts": {
                "8000/tcp": {},
                "9000/tcp": {}
            },
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash",
                "-l",
                "-c",
                "/root/myweb/demos/web/start-servers.sh"
            ],
            "Image": "xxx/myweb",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "97f5c2894d9a6977723e3a54db77f7ff81150d8447722147a0d561a193d4caeb",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "8000/tcp": [
                    {
                        "HostIp": "192.168.99.100",
                        "HostPort": "8000"
                    }
                ],
                "9000/tcp": [
                    {
                        "HostIp": "192.168.99.100",
                        "HostPort": "9000"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/97f5c2894d9a",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "2f62e7e113d8ec9f0c6760f618f53f43821c469b3c461b7447011737ee768c65",
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,

            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "188e40f0cb38ff9be5f053cffdf5e97c22bfed8f7ee93c685178d0c9748a032c",
                    "EndpointID": "2f62e7e113d8ec9f0c6760f618f53f43821c469b3c461b7447011737ee768c65",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02"
                }
            }
        }
    }
]

Панель инструментов docker также имеет конфигурацию по умолчанию для сетевых настроек виртуальной машины по умолчанию:

1: NAT

2: Адаптер только для хоста (Ethernet-адаптер Virtualbox для хоста №2).

Я новичок в панели инструментов Docker, что мне делать, чтобы получить доступ к веб-странице в контейнере? Не могли бы вы помочь мне диагностировать мою проблему?


person user2262504    schedule 27.05.2017    source источник
comment
Какая у вас ошибка? Проверьте, есть ли брандмауэр, блокирующий порт. Кроме того, попробуйте получить доступ к чему-либо через IP-адрес виртуальной машины. Что-то, что работает вне контейнера, например Python SimpleHTTPServer.   -  person vempo    schedule 27.05.2017
comment
@vempo, когда я использую ip: port для доступа к веб-странице, я не нашел ответа. а также никакое соединение не распечатывается в командном терминале контейнера. как мне проверить брандмауэр? (чей брандмауэр). Под IP-адресом ВМ вы имеете в виду 192.168.99.100 выше? Здесь я использую SimpleHTTPServer. не могли бы вы помочь мне в диагностике проблемы?   -  person user2262504    schedule 28.05.2017
comment
Итак, если вы запустите SimpleHTTPServer на виртуальной машине вне контейнера, сможете ли вы получить к нему доступ с хост-машины? Например, 192.168.99.100:8080 (порт, который вы настроили). Сначала нужно выяснить, где проблема - хост / ВМ или ВМ / контейнер.   -  person vempo    schedule 28.05.2017


Ответы (2)


Если виртуальная машина (хост Docker) работает под управлением Linux, попробуйте iptables -F & iptables -t nat -F и повторите попытку из сети Host-Only или Bridge Mode из Windows, например, если IP-адрес интерфейса Host Only - 192.168.56.101 для виртуальной машины, попробуйте этот IP: 8080 из Windows Физический хост.

person Subodh Pachghare    schedule 27.05.2017
comment
Я проверяю, что панель инструментов docker запускает образы boot2docker на виртуальной машине. По умолчанию панель инструментов docker создала виртуальную машину с именем default, а сеть настроена так, чтобы иметь как адаптер 1: NAT, так и адаптер 2: адаптер только для хоста (адаптер Ethernet № 2 только для хоста Virtualbox). Не могли бы вы помочь в диагностике проблемы, я понятия не имею, что делать дальше. - person user2262504; 28.05.2017
comment
Сначала проверьте, доступен ли шлюз Host Only # 2 с виртуальной машины. - person Subodh Pachghare; 28.05.2017

Я предполагаю, что вы спрашиваете о доступе к веб-службе с хост-машины, на которой работает Virtualbox.

Как вы уже знаете, вы можете получить доступ к веб-сервису с Linux-машины boot2docker, используя localhost: или:.

Чтобы получить доступ к веб-службе с вашего хост-компьютера, вы можете использовать функцию переадресации портов, предоставляемую Virtualbox. Вы можете перейти в настройки-> Сеть-> Переадресация портов под адаптером NAT машины boot2docker и добавить переадресацию портов между портом хоста boot2docker и портом машины Windows. В вашем примере вы можете сказать (hostip = 127.0.0.1, host port = 8000, guest port = 8000). После этого вы можете получить доступ к веб-серверу, используя localhost: 8000 или 127.0.0.1.8000 с вашего хост-компьютера.

Надеюсь это поможет.

С уважением, Шринивас

person Sreeni    schedule 28.05.2017
comment
Привет ! Было бы лучше, если бы вы ознакомились с Как создать минимальный, полный и проверяемый пример для будущих попыток при переполнении стека. -Спасибо - person Momin; 28.05.2017