我似乎无法访问我的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 80site.vhost
startup.shServerAdmin webmaster@localhost DocumentRoot /var/www Options Indexes FollowSymLinks MultiViews AllowOverride None #Order allow,deny allow from all # 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
#!/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端口的容器,对吧?
您需要将端口从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上测试内容,则可能需要选择其他端口.
对于那些正在运行Docker 1.8或更新版本的线程的人来说,Andy和Muneeb的注释中的语法不再起作用(理论是一样的),因为boot2docker已被弃用并被docker-machine取代并且docker VM名称已更改[ 1].
转发单个端口Mac - > VM - >容器
如果您只想使用Mac上端口8080的默认网络选项将端口80转发到容器内,请执行以下操作:
a)使用EXPOSE 80
Dockerfile中的a或者--expose=80
在端口80中显示端口80 docker run
.添加/udp
UDP端口.
b)使用-p 8080:80
in 将端口从容器映射到VM docker run
.添加/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
(默认为docker VM的名称).
[1] https://docs.docker.com/installation/mac/