Ejercicios prácticos (Docker avanzado)
Contenido perteneciente al curso Docker avanzado.
1. Check that docker is correctly running and that you have permission to use the engine
docker info
2. (pull) Pull an image from the official registry, eg: debian:latest (you can browse https://store.docker.com if you want to find other images).
docker pull debian:latest
debian is the repository name, and :latest is a tag that identifies an image in the repository (for the case of the debian repository it is the latest stable release).
You could also write :jessie or :stretch to use a specific version of the distribution.
You can check that your image is present in the docker engine:
docker images
3. (run) Run a container from this image.
docker run debian:latest
(you may also write docker run debian which is equivalent: :latest is the defaut tag if none are provided)
Nothing happens? actually the container has already terminated, you can display it with docker ps, but add -a/--all because non-running container are not displayed by default.
docker ps -a
The default command of the debian image is /bin/bash and by default docker containers are run without stdin (it is redirected from /dev/null ). Thus bash exits immediately.
4. (run a command) You may override the default command by providing extra arguments after the image name. Then this command will be executed (instead of bash).
docker run debian ls /bin docker run debian cat /etc/motd
5. (stdin) Let's go back to bash, this time we want interact with the shell. To keep stdin open, we launch the container with -i/--interactive.
docker run -i debian
The container runs, but displays nothing. Actually bash is running in batch mode. You can try to execute commands (eg: ls, id, hostname …) and you will see the result.
Bash is in batch mode because it is not running on a terminal (its stdout is a pipe, not a tty).
6. (tty) To have a real interactive shell inside our container, we need to allocate a tty with -t/--tty:
docker run -t -i debian
7. (start) You can exit your container and display the list of all containers:
docker ps -a
It is possible to start them again with docker start . Like the run command, you may use -i to have stdin open. Note that start expects you to tell which container you want to start. Containers may be identified either by their id (first column of docker ps) or by their name (last column). You may provide only the first digits of the id (as long as there is no ambiguity). Examples:
docker start -i 85bcdca6c38f docker start -i 85bcd docker start -i 85 docker start -i 85bcdca6c38f07e3f8140cbf8b4ad37fd80d731b87c6945012479439a450a443 docker start -i pensive_hodgkin
8. (commit) You can modify files inside a container. If you restart the same container you can note that these changes are still present. However they will not be present in the other container (even if they are running the same image) because docker uses a copy-on-write filesystem.
Use the command docker diff to show the difference of a container from its image.
Remember that all changes inside a container are thrown away when the container is removed. If we want save a container filesytem for later use, we have to commit the conainer (i.e take a snapshot).
docker commit CONTAINER
This operation creates a new image (visible in docker images ). This image in turn can be used to start a new container.
Note: docker commit does not affect the state of the container. If it is running, then it just keeps running. You may take as many snapshots as you like.
9. (rm) You now have too many dead containers in your engine. You should use docker rm to remove them. Alternatively you can run docker container prune which removes all dead container.
10. (extras) If you still have extra time, you can experiment o the other docker run options we introduced so far:
--rmto remove the container automatically when it terminates-d/--detachto run a container in the background-u/--userto run the container as a different user-w/--workdirto start the container in a different directory-e/--envto set an environment variable-h/--hostnameto set a different hostname (the host name inside the container)--nameto set a different name (the name of the container in the docker engine)- also you may type
docker run --helpto display all configuration keys
Other docker commands (note: some of these commands require the container to be running, just launch docker run -d -t -i debian to have one that keeps running in the background):
docker inspectto display the metadata of a container (json format)docker cpto transfer files from/into the containerdocker execto have launch a separate command (very useful for providing a debugging shell →docker exec -t -i CONTAINER bash)docker topto display the processes running inside the containerdocker statsto display usage statisticsdocker logsto display the container outputdocker attachto reattach to the console of a detached container
