In Docker, the
docker cp command is a powerful tool that provides a way to copy data in and out of a container. This makes it useful for performing tasks such as debugging and data backup.
In this blog post, we'll explore how to use the
docker cp command to copy files from a container to the local system and vice versa. Let’s get started!
To follow along with the examples in this post, you need a code editor. You also need to have Docker Desktop installed and running on your system. If you don’t have it already, you can download it from the link: Get Docker.
Try the Docker Basic Commands Lab for free:
Create a Docker Container
Before we can explore the
docker cp command, we need to have a container to copy files from or to. To create a container, open up a terminal window and run the following command:
docker container run -d --name=myapache httpd
This command creates a container named
myapache and runs an Apache HTTP server inside it. The
-d flag is short for
--detach and runs the container in the background. And
httpd is the name of the Docker image, which is an Apache server.
Running the command above will give you an output similar to this:
The long string you see printed in the terminal window is the container ID. Next, let’s verify that the container is up and running by listing the currently running Docker containers. Run the following command:
docker container ls
As you can see below, the
myapache container is up and running as expected.
Now that we have a container, we can proceed with copying files from and to the container using the
docker cp command.
Docker CP Syntax
The syntax of the
docker cp command is as follows:
docker cp <containerId/containerName>:/file/path/within/container /host/path/to/copy/file/to
The command above copies a file from a Docker container to the host.
docker cp /host/path/to/copy/file/from <containerId/containerName>:/file/path/within/container
The command above copies a file from the host to a Docker container.
Copy File From Container to Host
We have an Apache HTTP server running inside a container. Let’s copy the default
index.html page (inside the
/usr/local/apache2/htdocs directory) served by the Apache server to the desktop of our local system. Run the following command:
docker cp myapache:/usr/local/apache2/htdocs/index.html ~/desktop
Don’t forget to replace
myapache with the name of your container.
In the command above, we pass two arguments to the
docker cp command:
- myapache:/usr/local/apache2/htdocs/index.html: This is the source path inside the container.
myapacherefers to the container name.
/usr/local/apache2/htdocs/index.htmlspecifies the location of the
index.htmlfile within the Apache web server's document root directory.
- ~/desktop: This is the destination path on the host machine. The tilde symbol (~) is a shorthand notation that represents the home directory of the current user. So
~/desktopexpands to the full path of the desktop directory within the user's home directory.
In summary, the command copies the
index.html file from the container to the local system's desktop directory.
To confirm that the file has been copied, you’ll have to check the destination directory on your local machine. I see the
index.html file on my desktop, as shown below:
We have successfully copied the
index.html file from the container (running the Apache HTTP server) to our local system.
Copy Directory From Container to Host
docker cp command allows you to copy not only files but directories as well. In the previous section, we copied the
index.html file (inside the
htdocs directory) to the desktop. In this section, let’s copy the
htdocs directory itself to the desktop.
Run the following command:
docker cp myapache:/usr/local/apache2/htdocs ~/desktop
To confirm that the
htdocs directory has been copied successfully, check your destination directory. In my case, I see the
htdocs directory on my desktop, as shown below:
Copy File From Host to Container
docker cp command is not only used to copy files from a container to the local system but also from the local system to a container. In this section, we’ll make some modifications to the
index.html file that we previously copied to our desktop and then copy it back to the
To get started, open the
index.html file in your preferred code editor and make the desired modifications to the HTML markup. Below, I have changed the welcome message within
<h1> tags from
It works! to
It works great!. You can make any other changes you prefer.
After making the changes to the
index.html file, save it. Then, run the following command to copy the modified file from the desktop to the location we copied it from.
docker cp ~/desktop/index.html myapache:/usr/local/apache2/htdocs
Notice that we have changed the order of the source and destination paths in this command.
To verify whether the copy was successful or not, we can check the contents of the
index.html file inside the
myapache container. Let's follow the steps below.
First, run the following command to get a shell to the
docker exec -it myapache /bin/bash
This command will open a bash shell prompt, as shown below:
Note: To get an in-depth understanding of the
docker exec command, check out our blog post: Docker Exec: How to Enter Into a Docker Container's Shell
From the shell prompt, run the following command to print the contents of the
This will print the contents of the file in the shell. You should see the modified welcome message, as shown below:
This means that we have successfully copied the modified
index.html file from our local system to the container.
Copy Directory From Host to Container
In this section, we’ll copy a directory from the host to the container. To demonstrate this, I have created a blank directory on my desktop named
demo, as shown below. Feel free to choose any name for your directory.
To copy the
demo directory from the desktop to the
apache2 directory within the Apache server’s root directory, run the following command:
docker cp ~/desktop/demo myapache:/usr/local/apache2
To verify that the directory has been copied successfully, let’s first get a shell to the container by running the following command.
docker exec -it d71b85f33430 /bin/bash
Running the command above will start an interactive bash shell session, as shown below:
Next, let’s list the content inside the
apache2 directory by running the following command on the bash shell:
We see the
demo directory listed in the output, as shown below:
We have successfully copied a directory from the host to the container.
In this post, you learned how to use the
docker cp command to copy files and directories from a container to the local system and from the local system to a container. You can use this command to perform tasks such as debugging, data backup, and more.
Interested in learning more about Docker? Check out the following courses from KodeKloud:
- Docker for the Absolute Beginner: This course will help you understand Docker using lectures and demos. You’ll get a hands-on learning experience and coding exercises that will validate your Docker skills. Additionally, assignments will challenge you to apply your skills in real-life scenarios.
Docker Certified Associate Exam Course: This course covers all the required topics from the Docker Certified Associate Exam curriculum. The course offers several opportunities for practice and self-assessment. There are hundreds of research questions in multiple-choice format, practice tests at the end of each section, and multiple mock exams that closely resemble the actual exam pattern.