Extra Commands

Here is a list of useful commands when working with Docker containers.

Docker Process Status

The first command to learn is: docker ps. This displays the running containers on the device. Add --all to see all containers on the device, even if they are not running.

docker ps

Example Output:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
244a84742697        shellhttpd:1.0       "/usr/local/bin/http…"   6 minutes ago       Up 6 minutes        0.0.0.0:8080->8080/tcp   shellhttpd

Docker Logs

Often, it is useful to watch Docker container logs. Use docker logs <container name> to see the container’s logs. If you want the command to keep following the log, use the --follow parameter:

The log might be empty unless you tested the shellhttpd application with curl or the browser:

docker logs --follow shellhttpd

Example Output:

GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,\*/\*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,pt-BR;q=0.8,pt;q=0.7

= Thu Mar 18 01:03:14 UTC 2021 =============================
GET /favicon.ico HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
DNT: 1
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/\*,\*/\*;q=0.8
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: image
Referer: http://127.0.0.1:8080/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,pt-BR;q=0.8,pt;q=0.7

= Thu Mar 18 01:03:14 UTC 2021 =============================

Docker Execute

The docker exec command runs a new command in a running container.

To verify the files in the root file system of the container, use the following command:

docker exec shellhttpd ls /usr/local/bin/

Example Output:

httpd.sh

To check what processes are running:

docker exec shellhttpd ps

Example Output:

PID   USER     TIME  COMMAND
1 root      0:00 {httpd.sh} /bin/sh -e /usr/local/bin/httpd.sh
13 root      0:00 nc -l -p 8080
36 root      0:00 ps

Finally, you can start a shell inside the container with:

docker exec -it shellhttpd sh

Example Output:

ls
in    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
exit
Where:
  • -i - keep STDIN open even if not attached.
  • -t - allocate a pseudo-TTY.
  • shellhttpd - container name.
  • sh - shell command.

Docker Remove

To stop and then remove the container, run the commands:

docker stop shellhttpd
docker rm shellhttpd

During development, it is common to make and test changes to the Docker image. Let us give this a try. In the file httpd.sh, we specify the MSG variable with ${MSG-OK}. This means if MSG is not otherwise specified, it is set with the default value “OK”.

Using the text editor of your choice, change OK to FoundriesFactory, then rebuild and run:

vi httpd.sh

httpd.sh:

#!/bin/sh -e

PORT="${PORT-8080}"
MSG="${MSG-FoundriesFactory}"

RESPONSE="HTTP/1.1 200 OK\r\n\r\n${MSG}\r\n"

while true; do
        echo -en "$RESPONSE" | nc -l -p "${PORT}" || true
        echo "= $(date) ============================="
done

Build and run the container again:

docker build --tag shellhttpd:1.0 .
docker run --name shellhttpd -d -p 8080:8080 shellhttpd:1.0

Test the new change with curl:

curl 127.0.0.1:8080

Example Output:

FoundriesFactory

The docker run command can accept many other parameters. For example, the --env parameter which specifies an environment variable to the container. Remove the previous image and launch it again with: --env MSG=MyFirstContainer

Test the new change with curl:

docker stop shellhttpd
docker rm shellhttpd
docker run --env MSG=MyFirstContainer --name shellhttpd -d -p 8080:8080 shellhttpd:1.0
curl 127.0.0.1:8080

Example Output:

MyFirstContainer

Use docker exec to echo the MSG variable inside the container:

docker exec -it shellhttpd sh

Inside the Container:

echo $MSG
MyFirstContainer
exit

Remove the container:

docker stop shellhttpd
docker rm shellhttpd

All these commands are important in understanding how Docker containers work. Next is going into how docker-compose works.