I can't seem to access a simple Docker container running locally on my mac. I can run curl localhost
from the container and see that the default Apache page is served up, but I can't hit it from my machine's browser.
I'm wondering if I have a VirtualBox config issue or something. Any help diagnosing the problem?
# 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
<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>
#!/bin/bash
a2dissite default
apache2ctl graceful
/usr/bin/mysqld_safe &
I'll build the image with docker build -t test1 .
- which seems to run fine.
On initial setup, I run docker run -d -v $(pwd)/mysql:/tmp/mysql test1 /bin/bash -c "cp -rp /var/lib/mysql/* /tmp/mysql"
to setup MySQL.
Then I run docker run -i -t -v $(pwd)/mysql:/var/lib/mysql -v $(pwd)/www:/var/www -p 8080:80 test1 /bin/bash
to start the actual instance.
Once at the terminal, I run service apache2 start
and everything seems to be running great. If I run curl localhost
I get the default page just fine.
Everything seems great, it's just hitting it from the Host that doesn't work. I should be able to navigate to http://127.0.0.1:8080
and have that forward to the container on port 80, right?
You'll need to forward the port from the VM to the host. An example for the default "random" range from docker is: (from 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
But if you want to forward specifically 8080:
VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port8080,tcp,,8080,,8080"
etc. You might want to pick a different port if you also use 8080 for testing things on your Mac itself.
For those looking at this thread who are running Docker 1.8 or newer, the syntax from Andy's and Muneeb's comments no longer work (the theory is the same), since boot2docker has been deprecated and replaced with docker-machine and the docker VM name changed [1].
Forwarding a single port Mac -> VM -> container
If you just want to forward port 80 inside a container using the default network options to port 8080 on your Mac, do this:
a) Expose port 80 either with an EXPOSE 80
in the Dockerfile or --expose=80
in docker run
. Add /udp
for UDP ports.
b) Map the ports from the container to the VM with -p 8080:80
in docker run
. Add /udp
for UDP ports.
c) Tell the docker VM (now called "default") to add a NAT mapping between port 8080 on the VM and port 8080 on your Mac:
VBoxManage controlvm default natpf1 'port8080,tcp,,8080,,8080'
. The first port is on your Mac; the second port is on the VM.
To delete the rule use VBoxManage controlvm default natpf1 delete port8080
. Note: VBoxManage controlvm
changes a running VM, modifyvm
changes a VM that is stopped.
Getting the IP address of your docker VM
New syntax is docker-machine ip default
(default is the name of docker VM).
[1] https://docs.docker.com/installation/mac/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With