Docker - 无法从Mac Host访问容器

时间:2014-04-08 19:26:53

标签: php mysql lamp docker

我似乎无法访问在我的Mac上本地运行的简单Docker容器。我可以从容器中运行curl localhost并看到默认的Apache页面已经提供,但是我无法从我的机器浏览器中点击它。

我想知道我是否有VirtualBox配置问题。有没有帮助诊断问题?

Dockerfile

# Build the image of ubuntu 12.04 LTS
from ubuntu:precise

# Run apt-get update
run apt-get -y update

# Install LAMP
run DEBIAN_FRONTEND=noninteractive apt-get -y install lamp-server^
run apt-get -y install vim-tiny curl wget

# Put custom scripts in the container and give proper permissions to them
add ./startup.sh /usr/local/bin/startup.sh
run chmod 755 /usr/local/bin/startup.sh

add site.vhost /etc/apache2/sites-available/site
run a2ensite site

# Expose port 80 to the host machine
expose 80

site.vhost

<VirtualHost *:80>

    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        #Order allow,deny allow from all
    </Directory>

    # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg.
    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

startup.sh

#!/bin/bash

a2dissite default
apache2ctl graceful
/usr/bin/mysqld_safe &

开始...

我将使用docker build -t test1 .构建图像 - 这似乎运行正常。

在初始设置时,我运行docker run -d -v $(pwd)/mysql:/tmp/mysql test1 /bin/bash -c "cp -rp /var/lib/mysql/* /tmp/mysql"来设置MySQL。

然后我运行docker run -i -t -v $(pwd)/mysql:/var/lib/mysql -v $(pwd)/www:/var/www -p 8080:80 test1 /bin/bash来启动实际的实例。

到达终端后,我运行service apache2 start,一切似乎运行良好。如果我运行curl localhost,我就可以获得默认页面了。

一切看起来都很棒,它只是从没有工作的主机上击中它。我应该能够导航到http://127.0.0.1:8080并将其转发到端口80上的容器,对吗?

4 个答案:

答案 0 :(得分:9)

您需要将端口从VM转发到主机。 docker的默认“随机”范围的示例是: (来自http://docs.docker.io/en/latest/installation/mac/#forwarding-vm-port-range-to-host

# vm must be powered off
for i in {49000..49900}; do
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i";
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i";
done

但如果你想特意转发8080:

VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port8080,tcp,,8080,,8080"

等。如果您还使用8080在Mac上测试内容,则可能需要选择其他端口。

答案 1 :(得分:7)

对于那些正在运行Docker 1.8或更新版本的线程的人来说,Andy和Muneeb的注释语法不再起作用(理论是一样的),因为boot2docker已被弃用并被docker-machine和docker VM取代名称已更改[1]。

转发单个端口Mac - &gt; VM - &gt;容器

如果您只想使用Mac上端口8080的默认网络选项将端口80转发到容器内,请执行以下操作:

a)使用Dockerfile中的EXPOSE 80--expose=80中的docker run公开端口80。为UDP端口添加/udp

b)将端口从容器映射到-p 8080:80 docker run的VM。为UDP端口添加/udp

c)告诉docker VM(现在称为“default”)在VM上的端口8080和Mac上的端口8080之间添加NAT映射:     VBoxManage controlvm default natpf1 'port8080,tcp,,8080,,8080'。第一个端口在你的Mac上;第二个端口在VM上。 要删除规则,请使用VBoxManage controlvm default natpf1 delete port8080。注意:VBoxManage controlvm更改正在运行的VM,modifyvm更改已停止的VM。

获取泊坞窗虚拟机的IP地址

新语法为docker-machine ip default(默认为docker VM的名称)。

[1] https://docs.docker.com/installation/mac/

答案 2 :(得分:4)

您正试图在localhost(127.0.0.1)上查看它,这是您的Mac OS X.泊坞窗在Virtualbox VM中运行。试试:

  

boot2docker ip

这将为您提供VM的IP地址,然后您可以使用ip_address:端口连接到docker,例如,192.168.59.103:8080(如果192.168.59.103是分配给Virtualbox VM的IP)

答案 3 :(得分:0)

我刚刚编写了一个教程,介绍如何使用仅限主机的网络和TCP路由来实现这一目标。这样您就不必映射每个特定端口。

http://ispyker.blogspot.com/2014/04/accessing-docker-container-private.html