10 Useful Docker Commands - Tips and Tricks
Set HTTP proxy in your Dockerfile
Your Dockerfile usually starts most probably like this:
FROM tifayuki/java:8
MAINTAINER ...
RUN apt-get update \
wget download.java.net/glassfish/4.0/release/glassfish-4.0.zip \
...
At first, you are apt-getting some missing applications and preparing your environment. Sometimes some applications need to be downloaded from the internet. You may encounter a problem when you are behind a proxy. Fortunately, you can use an [ENV](https://docs.docker.com/reference/builder/)
command to set a HTTP/HTTPS proxy address, which will be in the environment of all “descendent” Dockerfile commands. So the updated Dockerfile example:
FROM tifayuki/java:8
MAINTAINER ...
ENV http_proxy http://server:port
ENV https_proxy http://server:port
#... some other online commands
Mount one folder into multiple locations
The Docker architecture is based on union mount, namely UnionFS, which gives you an ability to mount volumes (folders) to any location in your image, let’s see the following example (using this image tutum/glassfish):
docker run -d -p 4848:4848 -p 8080:8080 -p 8181:8181 -v /data/output/gf-logs:/opt/glassfish4/glassfish/domains/domain1/logs -v /data/output/gf-logs:/var/log tutum/glassfish
See both of -v
params, they are mounting the same folder (/data/output/gf-logs) into exactly two existing locations (Glassfish server log and /var/log/).
Finally, you have only one folder with all logs from your Glassfish.
Long-running worker process
If you are new to the docker environment, you may be surprised, that Docker containers only run as long as the command you specify is active. E.g. this ubuntu instance immediately exits after echoing “Hello World”:
docker run ubuntu /bin/echo 'Hello world'
If you want to create a container that runs as a daemon (like most of the applications), you need to specify a long-running command, e.g. the command that echoes “hello world” forever:
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
Lists of all existing containers (not only running)
$ docker ps -a
Stop all running containers
docker stop $(docker ps -a -q)
Delete all existing containers
docker rm $(docker ps -a -q)
If some containers are still running as a daemon, use -f
(force) param immediately after rm command.
Delete all existing images
docker rmi $(docker images -q -a)
Attach to a running container
Docker Command Line API has a special command to attach to a running container. This command is not applicable in all cases, especially if a docker container has been already started using /bin/bash
command, e.g. already known long running process:
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
Trying to use attach
command does not start a new instance of a shell, instead of that, you will see an ongoing output of the first command, i.e.“hello world”. Since Docker version 1.3 you are able to create a new instance of a shell using exec command:
sudo docker exec -i -t 878978547 bash
Using Docker logs command
In a case of running a Docker container as a daemon (docker run -d
…) it may be useful to know what appears on the console output of the running container.
The docker logs
retrieves logs present at the time of execution. You need to run this command repeatedly to see the actual output. This is not good enough.
Fortunately, it exists a helpful param -f, --follow,
which follows log output and continues streaming the new output from the container’s STDOUT
and STDERR
.:
docker logs -f 878978547
NOTE: this command is available only for containers with json-file
logging driver.
Replace CMD command in a Dockerfile
You should know, that it exists two similar commands in a Dockerfile, i.e. CMD
and RUN
.
RUN
actually runs a command and commits the result at build time.
The CMD
instruction should be used in a Dockerfile only once to run the software contained by your image at runtime. (mostly the last command in a Dockerfile).
The main purpose of a CMD is to provide defaults for an executing container. (source)
You are able to replace a default CMD command from a Dockerfile, e.g. you need to customize this command:
docker run myImage "{CMD} -extraParam"
Again, CMD instruction in a Dockerfile is overwritten with your command from the command line.