A few useful commands when using Docker
1. Pull a Docker image from the Docker Hub repository
docker pull ubuntu:18.04
2. Run a Docker image in interactive mode
docker run -it ubuntu:18.04
3. Stop a running Docker container
docker stop <container-id>
4. Restart a Docker container (assuming it exists) in interactive mode
docker restart <container-id>
docker exec -it <container-id> bash
5. Remove a Docker image
docker rmi ubuntu:18.04
6. Remove a Docker container
docker rm <container-id>
7. Remove all Docker stopped containers
docker container prune
8. List all Docker images
docker images
9. List all Docker containers
docker ps -a
10. How to build a Docker image from a Docker container
# Modify a new container docker run --name hw_container ubuntu:latest touch /HelloWorld # Commit the changes you made in that container # to a new image docker commit hw_container hw_image # Remove the changed container docker rm -vf hw_container # Test the new image docker run --rm hw_image # ls -l /HelloWorld # Outputs: # -rw-r--r-- 1 root root 0 Apr 15 22:06 # /HelloWorld
11. How to persist data inside a Docker container or share the data with the host?
Basically, there are three ways to do this, i.e., bind mount, volume and tmpfs mount.
Bind mount will mount a directory on the host into the container, such that the data is easily accessible on the host.
Consider a case where you have a directory source
and that when you build the source code, the artifacts are saved into another directory, source/target/
. You want the artifacts to be available to the container at /app/
, and you want the container to get access to a new build each time you build the source on your development host. Use the following command to bind-mount the target/
directory into your container at /app/
. Run the command from within the source
directory. The $(pwd)
sub-command expands to the current working directory on Linux or macOS hosts.
$ docker run -d \
-it \
--name devtest \
-v "$(pwd)"/target:/app \
nginx:latest
Use docker inspect devtest
to verify that the bind mount was created correctly. Look for the Mounts
section:
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/source/target",
"Destination": "/app",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
This shows that the mount is a bind
mount, it shows the correct source and destination, it shows that the mount is read-write, and that the propagation is set to rprivate
.
Stop the container:
$ docker container stop devtest
$ docker container rm devtest
Volume is just another way to persist data. It will create a volume managed by Docker inside /var/lib/docker/volumes.