Подтвердить что ты не робот

Форвардные порты от boot2docker с использованием поставщика Vagrant Docker

Я пытаюсь использовать Vogrant 1.6 Docker, и я, похоже, столкнулся с проблемой. Я могу успешно открыть контейнер Docker и гостевую ОС, но тогда я не могу получить доступ к сервису, который я привез в контейнер из главной операционной системы. Здесь мой Vagrantfile:

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.network :forwarded_port, guest: 8000, host: 8000

  config.vm.define "icecast" do |v|
    v.vm.provider "docker" do |d|
      d.image = "moul/icecast"
      d.ports = ["8000:8000"]

      d.env = {
        # SOURCE_PASSWORD: 'password',
        ADMIN_PASSWORD: 'password',
        # PASSWORD: 'password',
        # RELAY_PASSWORD: 'password'
      }
    end
  end
end

Я понимаю, что запуск vagrant up --provider=docker на OS X запустит VM, на котором запущен boot2docker, который затем запустит мой контейнер. Выполнение vagrant docker-logs похоже, подтверждает, что мой контейнер создан, и служба запустилась, но теперь я не могу на всю жизнь выяснить, как получить доступ к службе с моего хоста OS X. Если бы я использовал стандартный поставщик VirtualBox, я бы ожидал, что директива config.vm.network :forwarded_port будет обрабатывать пересылку, но добавление, похоже, не имеет никакого значения.

Что мне нужно сделать, чтобы иметь доступ к этой службе с моего хоста OS X?

Обновить. Для справки вот изображение Dockerfile: https://github.com/moul/docker-icecast/blob/master/Dockerfile

4b9b3361

Ответ 1

Хорошо, поэтому я, наконец, понял это, и выясняется, что решение заключается в том, чтобы вообще не использовать boot2docker. Основываясь на некоторых погружениях, которые я делал через источник Vagrant, читал вопросы и пересматривал видеоролики, предлагающие вход в Docker, выясняется, что вам нужно использовать прокси-VM для размещения ваших контейнеров вместо boot2docker.

Чтобы установить это, я изменил свой Vagrantfile, чтобы включить параметр конфигурации для vagrant_vagrantfile:

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "icecast" do |v|
    v.vm.provider "docker" do |d|
      d.image = "moul/icecast"
      d.ports = ["8000:8000"]

      d.env = {
        # SOURCE_PASSWORD: 'password',
        ADMIN_PASSWORD: 'password',
        # PASSWORD: 'password',
        # RELAY_PASSWORD: 'password'
      }

      d.vagrant_vagrantfile = "./Vagrantfile.proxy"
    end
  end
end

Затем я добавил дополнительный файл (Vagrantfile.proxy), который Vagrant будет использовать для разворота прокси-виртуальной машины:

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.provision "docker"
  config.vm.provision "shell", inline:
    "ps aux | grep 'sshd:' | awk '{print $2}' | xargs kill"

  config.vm.network :forwarded_port, guest: 8000, host: 8000
end

Использование модуля Docker будет автоматически устанавливать Docker на прокси-виртуальную машину для вас. Встроенная оболочка script заставляет Vagrant записываться обратно в поле, чтобы он мог использовать Docker после его установки. Наконец, я пересылаю порт, который мне нужен в этом Vagrantfile, в отличие от оригинала (при использовании опции ports config в оригинале).

Как и при использовании стратегии boot2docker по умолчанию, Vagrant будет достаточно умным, чтобы повторно использовать существующие экземпляры прокси-VM для любого изображения, которое его использует.

Надеюсь, это будет полезно для кого-то в будущем.

Ответ 2

Для пересылки портов из boot2docker (в отличие от переадресации портов из пользовательской прокси-виртуальной машины, не использующей boot2docker), вам нужно добавить порт вперед вручную через VirtualBox или запустить следующий script после запуска vagrant up:

export PORT=3306
export REASON=mysql
export HOST_VM=`VBoxManage list runningvms | grep docker-host | awk '{ print $1 }' | sed 's/"//g'`
VBoxManage controlvm $HOST_VM natpf1 "docker-$REASON-$PORT-port-forward,tcp,127.0.0.1,$PORT,,$PORT"