Tutorial

How To Share Data Between the Docker Container and the Host

Updated on September 30, 2021
How To Share Data Between the Docker Container and the Host

Introduction

In general, Docker containers are ephemeral, running just as long as it takes for the command issued in the container to complete. By default, any data created inside the container is only available from within the container and only while the container is running.

Docker volumes can be used to share files between a host system and the Docker container. For example, let’s say you wanted to use the official Docker Nginx image and keep a permanent copy of Nginx’s log files to analyze later. By default, the nginx Docker image will log to the /var/log/nginx directory inside the Docker Nginx container. Normally it’s not reachable from the host filesystem.

In this tutorial, we’ll explore how to make data from inside the container accessible on the host machine.

Prerequisites

To follow this article, you will need an Ubuntu 18.04 server with the following:

If you’re new to Docker, The Docker Ecosystem series provides a detailed overview of key concepts.

Note: Even though the Prerequisites give instructions for installing Docker on Ubuntu 18.04, the docker commands for Docker data volumes in this article should work on other operating systems as long as Docker is installed.

Step 1 — Bindmounting a Volume

The following command will create a directory called nginxlogs in your current user’s home directory and bindmount it to /var/log/nginx in the container:

  1. docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx

Let’s take a moment to examine this command in detail:

  • --name=nginx names the container so we can refer to it more easily.
  • -d detaches the process and runs it in the background. Otherwise, we would just be watching an empty Nginx prompt and wouldn’t be able to use this terminal until we killed Nginx.
  • -v ~/nginxlogs:/var/log/nginx sets up a bindmount volume that links the /var/log/nginx directory from inside the Nginx container to the ~/nginxlogs directory on the host machine. Docker uses a : to split the host’s path from the container path, and the host path always comes first.
  • -p 5000:80 sets up a port forward. The Nginx container is listening on port 80 by default. This flag maps the container’s port 80 to port 5000 on the host system.
  • nginx specifies that the container should be built from the Nginx image, which issues the command nginx -g "daemon off" to start Nginx.

Note: The -v flag is very flexible. It can bindmount or name a volume with just a slight adjustment in syntax. If the first argument begins with a / or ~/, you’re creating a bindmount. Remove that, and you’re naming the volume.

  • -v /path:/path/in/container mounts the host directory, /path at the /path/in/container
  • -v path:/path/in/container creates a volume named path with no relationship to the host.

For more on named volumes, see How to Share Data Between Docker Containers

Step 2 — Accessing Data on the Host

We now have a copy of Nginx running inside a Docker container on our machine, and our host machine’s port 5000 maps directly to that copy of Nginx’s port 80.

Load the address in a web browser, using the IP address or hostname of your server and the port number: http://your_server_ip:5000. You should see:

Nginx Start Page

More interestingly, if we look in the ~/nginxlogs directory on the host, we’ll see the access.log created by the container’s nginx which will show our request:

  1. cat ~/nginxlogs/access.log

This should display something like:

Output
203.0.113.0 - - [11/Jul/2018:00:59:11 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" "-"

If you make any changes to the ~/nginxlogs folder, you’ll be able to see them from inside the Docker container in real time as well.

Conclusion

In this tutorial we demonstrated how to create a Docker data volume to share information between a container and the host file system. This is helpful in development environments, where it is necessary to have access to logs for debugging. To learn more about sharing persistent data between containers, take a look at How To Share Data between Docker Containers.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
6 Comments


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Excellent posts on Docker, Melissa. The way you break each command down in detail and explain the flags you use makes it easy to understand and learn.

Excellent Post. Good post if we have any doubt about how docker is running internally. Keep it up.

Regards Vipul

If I ran the container without -v do I need to recreate the container after if I want to add the share?

Quick question tutorials. Do you have videos as well. sometimes, its faster to understand. I love digital ocean tutorials. Very well written with nice fonts, great content.

This comment has been deleted

    It doesn’t work if the host is on the digitalocean and the local directory is on my laptop.

    Try DigitalOcean for free

    Click below to sign up and get $200 of credit to try our products over 60 days!

    Sign up

    Join the Tech Talk
    Success! Thank you! Please check your email for further details.

    Please complete your information!

    Become a contributor for community

    Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

    DigitalOcean Documentation

    Full documentation for every DigitalOcean product.

    Resources for startups and SMBs

    The Wave has everything you need to know about building a business, from raising funding to marketing your product.

    Get our newsletter

    Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

    New accounts only. By submitting your email you agree to our Privacy Policy

    The developer cloud

    Scale up as you grow — whether you're running one virtual machine or ten thousand.

    Get started for free

    Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

    *This promotional offer applies to new accounts only.