Docker - 无法从Mac主机访问容器

5

我似乎无法访问在我本地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个回答

9
你需要将端口从虚拟机转发到主机。来自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"

等等。如果你在 Mac 上测试东西时也使用 8080 端口,那么你可能需要选择其他端口。


啊!我不知道之前怎么会错过那个!目前我的情况使用了8080的例子,但将来我肯定想要改变它。谢谢! - David Welch

7
对于那些运行Docker 1.8或更新版本的用户,Andy和Muneeb评论中的语法不再适用(理论相同),因为boot2docker已被弃用并替换为docker-machine,docker VM的名称也发生了变化 [1]。
将Mac-> VM->容器中的单个端口转发。如果您只想使用默认网络选项将容器内的端口80转发到Mac上的端口8080,请执行以下操作:a) 在Dockerfile中使用“EXPOSE 80”或在“docker run”中使用“--expose = 80”来公开端口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。
获取您的docker VM的IP地址。新语法为docker-machine ip default(default是docker VM的名称)。
[1]https://docs.docker.com/installation/mac/

4
您正在尝试在本地主机(127.0.0.1)上查看它,这是您的Mac OS X。Docker正在Virtualbox虚拟机中运行。请尝试:boot2docker ip。 这将为您提供VM的IP地址,然后您可以使用ip_address:port连接到docker,例如192.168.59.103:8080(如果192.168.59.103是分配给Virtualbox VM的IP)。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接