Vagrant SSH到Docker容器

我在Vagrant box boot2docker(在Windows 8.1)上运行Drupal作为Docker容器:

Vagrantfile (我的Docker容器)

# -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure(2) do |config| config.vm.provider "docker" do |docker| docker.vagrant_vagrantfile = "host/Vagrantfile" docker.image = "drupal" docker.ports = ['80:80'] docker.name = 'drupal-container' end config.vm.synced_folder ".", "/vagrant", type: "smb", disabled: true end 

主机/ Vagrantfile (主机)

 # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure(2) do |config| config.vm.hostname = "docker-host" config.vm.box = "hashicorp/boot2docker" config.vm.network "forwarded_port", guest: 80, host: 8080 end 

我只是在我的Docker容器的目录中调用vagrant up来运行它(和主机):

 $ vagrant up Bringing machine 'default' up with 'docker' provider... ==> default: Docker host is required. One will be created if necessary... default: Vagrant will now create or start a local VM to act as the Docker default: host. You'll see the output of the `vagrant up` for this VM below. default: default: Importing base box 'hashicorp/boot2docker'... default: Matching MAC address for NAT networking... default: Checking if box 'hashicorp/boot2docker' is up to date... default: Setting the name of the VM: boot2docker_default_1463064065066_29287 default: Clearing any previously set network interfaces... default: Preparing network interfaces based on configuration... default: Adapter 1: nat default: Forwarding ports... default: 2375 (guest) => 2375 (host) (adapter 1) default: 80 (guest) => 8080 (host) (adapter 1) default: 22 (guest) => 2222 (host) (adapter 1) default: Running 'pre-boot' VM customizations... default: Booting VM... default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: docker default: SSH auth method: password default: Warning: Remote connection disconnect. Retrying... default: Warning: Remote connection disconnect. Retrying... default: Machine booted and ready! GuestAdditions versions on your host (5.0.20) and guest (4.3.28 r100309) do not match. The guest's platform ("tinycore") is currently not supported, will try generic Linux method... Copy iso file C:\Program Files/Oracle/VirtualBox/VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso Installing Virtualbox Guest Additions 5.0.20 - guest version is 4.3.28 r100309 mkdir: can't create directory '/tmp/selfgz98932600': No such file or directory Cannot create target directory /tmp/selfgz98932600 You should try option --target OtherDirectory An error occurred during installation of VirtualBox Guest Additions 5.0.20. Some functionality may not work as intended. In most cases it is OK that the "Window System drivers" installation failed. default: Setting hostname... ==> default: Warning: When using a remote Docker host, forwarded ports will NOT be ==> default: immediately available on your machine. They will still be forwarded on ==> default: the remote machine, however, so if you have a way to access the remote ==> default: machine, then you should be able to access those ports there. This is ==> default: not an error, it is only an informational message. ==> default: Creating the container... default: Name: drupal-container default: Image: drupal default: Port: 80:80 default: default: Container created: d12499a52f3d3f27 ==> default: Starting container... ==> default: Provisioners will not be run since container doesn't support SSH. 

现在我想连接到来自同一目录的容器:

 $ vagrant ssh ==> default: SSH will be proxied through the Docker virtual machine since we're ==> default: not running Docker natively. This is just a notice, and not an error. ==> default: The machine you're attempting to SSH into is configured to use ==> default: password-based authentication. Vagrant can't script entering the ==> default: password for you. If you're prompted for a password, please enter ==> default: the same password you have configured in the Vagrantfile. docker@127.0.0.1's password: tcuser ssh: connect to host 172.17.0.1 port 22: Connection refused Connection to 127.0.0.1 closed. 

为什么连接被拒绝? 密码错误?

我也试过使用环境的散列。 我确定了哈希

 $ vagrant global-status id name provider state directory ---------------------------------------------------------------------------------------------- e4da5ae default virtualbox running c:/my-project-path/host/boot2docker 98ef037 default docker running c:/my-project-path The above shows information about all known Vagrant environments on this machine. This data is cached and may not be completely up-to-date. To interact with any of the machines, you can go to that directory and run Vagrant, or you can use the ID directly with Vagrant commands from any directory. For example: "vagrant destroy 1a2b3c4d" 

并试图连接(同样的错误):

 $ vagrant ssh 98ef037 ==> default: SSH will be proxied through the Docker virtual machine since we're ==> default: not running Docker natively. This is just a notice, and not an error. ==> default: The machine you're attempting to SSH into is configured to use ==> default: password-based authentication. Vagrant can't script entering the ==> default: password for you. If you're prompted for a password, please enter ==> default: the same password you have configured in the Vagrantfile. docker@127.0.0.1's password: tcuser ssh: connect to host 172.17.0.3 port 22: Connection refused Connection to 127.0.0.1 closed. 

如果我添加docker.has_ssh = true Vagrantfile (我很困惑,我是否需要它,因为我可以打电话vagrant ssh没有它):

 # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure(2) do |config| config.vm.provider "docker" do |docker| docker.vagrant_vagrantfile = "host/Vagrantfile" docker.image = "drupal" docker.ports = ['80:80'] docker.name = 'drupal-container' docker.has_ssh = true end config.vm.synced_folder ".", "/vagrant", type: "smb", disabled: true end 

那么我不能运行/重新加载我的容器,因为它无限期地等待机器启动:

 $ vagrant reload ==> default: Stopping container... ==> default: Starting container... ==> default: Waiting for machine to boot. This may take a few minutes... Timed out while waiting for the machine to boot. This means that Vagrant was unable to communicate with the guest machine within the configured ("config.vm.boot_timeout" value) time period. If you look above, you should be able to see the error(s) that Vagrant had when attempting to connect to the machine. These errors are usually good hints as to what may be wrong. If you're using a custom box, make sure that networking is properly working and you're able to connect to the machine. It is a common problem that networking isn't setup properly in these boxes. Verify that authentication configurations are also setup properly, as well. If the box appears to be booting properly, you may want to increase the timeout ("config.vm.boot_timeout") value. 

那么如何使用vagrant ssh连接到我的Docker容器呢?

注意:我可以先连接到主机,然后调用docker

 $ cd host $ vagrant ssh ==> default: The machine you're attempting to SSH into is configured to use ==> default: password-based authentication. Vagrant can't script entering the ==> default: password for you. If you're prompted for a password, please enter ==> default: the same password you have configured in the Vagrantfile. docker@127.0.0.1's password: tcuser ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| Boot2Docker version 1.7.0, build master : 7960f90 - Thu Jun 18 18:31:45 UTC 2015 Docker version 1.7.0, build 0baf609 docker@docker-host:~$ sudo docker exec -t -i drupal-container /bin/bash root@d12499a52f3d:/var/www/html# 

但这是一个不切实际的解决方法。 我只是想在容器的目录中调用vagrant ssh来连接容器(常见的Vagrant工作stream程)。

你运行一个docker容器而不是一个虚拟机作为你的提供者,所以stream浪者的工作stream程被打破,因为你不能sshdocker容器。

当你使用docker服务提供者时,你可以使用vagrant docker-run运行你的命令; 看文档

如果你直接运行docker,你将无法直接SSH,有一些黑客来解决这个问题,但作为一个抽象的提供者无法作为一个简单的ssh命令,而不是官方的支持。