Docker Commands

Show commands & management commands

$ docker

Docker version info

$ docker version

Show info like number of containers, etc

$ docker info


Create an run a container in foreground

$ docker container run -it -p 80:80 nginx

Create an run a container in background

$ docker container run -d -p 80:80 nginx


$ docker container run -d -p 80:80 nginx

Naming Containers

$ docker container run -d -p 80:80 --name nginx-server nginx


  • Looked for image called nginx in image cache
  • If not found in cache, it looks to the default image repo on Dockerhub
  • Pulled it down (latest version), stored in the image cache
  • Started it in a new container
  • We specified to take port 80- on the host and forward to port 80 on the container
  • We could do “$ docker container run –publish 8000:80 –detach nginx” to use port 8000
  • We can specify versions like “nginx:1.09”

List running containers

$ docker container ls


$ docker ps

List all containers (Even if not running)

$ docker container ls -a

Stop container

$ docker container stop [ID]

Stop all running containers

$ docker stop $(docker ps -aq)

Remove container (Can not remove running containers, must stop first)

$ docker container rm [ID]

To remove a running container use force(-f)

$ docker container rm -f [ID]

Remove multiple containers

$ docker container rm [ID] [ID] [ID]

Remove all containers

$ docker rm $(docker ps -aq)

Get logs (Use name or ID)

$ docker container logs [NAME]

List processes running in container

$ docker container top [NAME]


Docker containers are often compared to virtual machines but they are actually just processes running on your host os. In Windows/Mac, Docker runs in a mini-VM so to see the processes youll need to connect directly to that. On Linux however you can run “ps aux” and see the processes directly


List the images we have pulled

$ docker image ls

We can also just pull down images

$ docker pull [IMAGE]

Remove image

$ docker image rm [IMAGE]

Remove all images

$ docker rmi $(docker images -a -q)


  • Images are app bianaries and dependencies with meta data about the image data and how to run the image
  • Images are no a complete OS. No kernel, kernel modules (drivers)
  • Host provides the kernel, big difference between VM

Some sample container creation


$ docker container run -d -p 80:80 --name nginx nginx (-p 80:80 is optional as it runs on 80 by default)


$ docker container run -d -p 8080:80 --name apache httpd


$ docker container run -d -p 27017:27017 --name mongo mongo


$ docker container run -d -p 3306:3306 --name mysql --env MYSQL_ROOT_PASSWORD=123456 mysql


View info on container

$ docker container inspect [NAME]

Specific property (–format)

$ docker container inspect --format '{{ .NetworkSettings.IPAddress }}' [NAME]

Performance stats (cpu, mem, network, disk, etc)

$ docker container stats [NAME]


Create new nginx container and bash into

$ docker container run -it --name [NAME] nginx bash
  • i = interactive Keep STDIN open if not attached
  • t = tty – Open prompt

For Git Bash, use “winpty”

$ winpty docker container run -it --name [NAME] nginx bash

Run/Create Ubuntu container

$ docker container run -it --name ubuntu ubuntu

(no bash because ubuntu uses bash by default)

You can also make it so when you exit the container does not stay by using the -rm flag
$ docker container run --rm -it --name [NAME] ubuntu

Access an already created container, start with -ai

$ docker container start -ai ubuntu

Use exec to edit config, etc

$ docker container exec -it mysql bash

Alpine is a very small Linux distro good for docker

$ docker container run -it alpine sh

(use sh because it does not include bash)
(alpine uses apk for its package manager – can install bash if you want)


“bridge” or “docker0” is the default network

Get port
$ docker container port [NAME]

List networks

$ docker network ls

Inspect network

$ docker network inspect [NETWORK_NAME]
("bridge" is default)

Create network

$ docker network create [NETWORK_NAME]


$ docker network create --driver bridge [NETWORK_NAME]

Link to container, add to network

$ docker run -d --net=[NETWORK_NAME] --name mongodb mongo

Create container on network

$ docker container run -d --name [NAME] --network [NETWORK_NAME] nginx

Connect existing container to network

$ docker network connect [NETWORK_NAME] [CONTAINER_NAME]

Disconnect container from network

$ docker network disconnect [NETWORK_NAME] [CONTAINER_NAME]

Detach network from container

$ docker network disconnect

Delete/Remove network

To remove the network by name or id, multiple can be deleted:

$ docker network rm [NETWORK_NAME] [NETWORK_NAME]


tags are labels that point to an image ID
$ docker image ls

Youll see that each image has a tag

Retag existing image

$ docker image tag nginx btraversy/nginx

Upload to dockerhub

$ docker image push dockerhub_repo_name/nginx

If denied, do

$ docker login

Add tag to new image

$ docker image tag dockerhub_repo_name/nginx d/nginx dockerhub_repo_name:testing
  • FROM – The os used. Common is alpine, debian, ubuntu
  • ENV – Environment variables
  • RUN – Run commands/shell scripts, etc
  • EXPOSE – Ports to expose
  • CMD – Final command run when you launch a new container from image
  • WORKDIR – Sets working directory (also could use ‘RUN cd /some/path’)
  • COPY # Copies files from host to container

Build image from dockerfile (repo name can be anything)

From the same directory as Dockerfile
$ docker image build -t [REPONAME] .

Benchmarking builds

$ DOCKER_BUILDKIT=1 docker image build -t [REPONAME] .


  • If you re-run the build, it will be quick because everythging is cached.
  • If you change one line and re-run, that line and everything after will not be cached
  • Keep things that change the most toward the bottom of the Dockerfile


Custom Dockerfile for html page with nginx

FROM nginx:latest # Extends nginx so everything included in that image is included here
WORKDIR /usr/share/nginx/html
COPY index.html index.html

Build image from Dockerfile

$ docker image build -t nginx-website

Running it

$ docker container run -p 80:80 --rm nginx-website

Tag and push to Dockerhub

$ docker image tag nginx-website:latest dockerhub_repo_name/nginx-website:latest
$ docker image push dockerhub_repo_name/nginx-website


Volume – Makes special location outside of container UFS.

Used for databases
Bind Mount -Link container path to host path

Check volumes

$ docker volume ls

Cleanup unused volumes

$ docker volume prune

Pull down mysql image to test

$ docker pull mysql

Inspect and see volume

$ docker image inspect mysql

Run container

$ docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=True mysql

Inspect and see volume in container

$ docker container inspect mysql

TIP: Mounts

  • You will also see the volume under mounts
  • Container gets its own uniqe location on the host to store that data
  • Source: xxx is where it lives on the host

Check volumes

$ docker volume ls

There is no way to tell volumes apart for instance with 2 mysql containers, so we used named volumes

Named volumes (Add -v command)(the name here is mysql-db which could be anything)

$ docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=True -v mysql-db:/var/lib/mysql mysql

Inspect new named volume

docker volume inspect mysql-db


  • Can not use in Dockerfile, specified at run time (uses -v as well)
  • … run -v /Users/name/stuff:/path/container (mac/linux)
  • … run -v //c/Users/name/stuff:/path/container (windows)

TIP: Instead of typing out local path, for working directory use $(pwd):/path/container – On windows may not work unless you are in your users folder

Run and be able to edit index.html file (local dir should have the Dockerfile and the index.html)
$ docker container run  -p 80:80 -v $(pwd):/usr/share/nginx/html nginx

Go into the container and check

$ docker container exec -it nginx bash
$ cd /usr/share/nginx/html
$ ls -al

You could create a file in the container and it will exist on the host as well

$ touch test.txt


$ docker run -d --name my-postgres postgres

now Link it with dot net

$ docker run -d -p 5000:5000 --link my-postgres:postgres btree/dotnet


  • Configure relationships between containers
  • Save our docker container run settings in easy to read file
  • 2 Parts: YAML File (docker.compose.yml) + CLI tool (docker-compose)

1. docker.compose.yml – Describes solutions for

  • containers
  • networks
  • volumes

2. docker-compose CLI – used for local dev/test automation with YAML files

Sample compose file

# same as
# docker run -p 80:4000 -v $(pwd):/site test/test-app
version: '2'
    image: test/test-app
      - .:/site
      - '80:4000'

Example 2

version: '3'
    container_name: docker-node-mongo
    restart: always
    build: .
      - '80:3000'
      - mongo
    container_name: mongo
    image: mongo
      - '27017:27017'

To run

docker-compose up

You can run in background with

docker-compose up -d

To cleanup

docker-compose down