docs
  • Overview
  • 🐍 PYTHON
    • Type Hints
    • PEP8 Style Guide for Python Code
    • 🏡Pipenv
    • Pathlib
  • 🕸Django
    • 🗄models
      • 🎯Best Practices
      • 🚦Django Signals
    • ⚙️ settings
    • DRF
      • Serializer
      • Authentication
      • Permissions
      • Viewsets
    • Testing
      • Faker and Factory Boy
    • 🧪Test Coverage
    • 💦Python-Decouple
    • Django Tips:
    • 💾Django ORM Queryset
    • Custom Exceptions
    • Celery
    • Resources
  • Deploy
    • 🚀Django Deployment
    • 🔒Setup SSL Certificate
  • 💾Database
    • MongoDB
  • 🛠️DevOps
    • 🖥Scripting
      • A First Script
      • Loops
      • Test
      • Variables
      • External programs
      • Functions
    • Command Line Shortcuts
    • Basic Linux Commands
    • 🎛Microservices
    • 🐳Docker
      • Docker Commands
      • Docker Compose
      • Django project
    • Kubernates
  • 📝Software IDE
    • EditorConfig
    • Linters
    • VsCode
Powered by GitBook
On this page
  • WORKING WITH CONTAINERS
  • IMAGE COMMANDS:
  • CONTAINER INFO
  • ACCESSING CONTAINERS
  • NETWORKING
  • VOLUMES:
  • BIND MOUNTS
  • DOCKER COMPOSE
  • IMAGE TAGGING & PUSHING TO DOCKERHUB
  • Tags are labels that point to an image ID
  • EXTENDING DOCKERFILE
  • Useful commands:
  • Remove all unused containers image:
  • Remove all images
  • Stop and remove all container
  • Start a shell in the container

Was this helpful?

  1. DevOps
  2. Docker

Docker Commands

Docker Commands, Help & Tips

Show commands & management commands:

$ docker

Docker version info:

$ docker version

Show info like the number of containers:

$ docker info

WORKING WITH CONTAINERS

Create an run a container in the foreground:

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

Create an run a container in the background:

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

Shorthand:

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

Naming Containers:

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

TIP: WHAT RUN DID

  • Looked for an image called Nginx in the image cache

  • If not found in the 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

OR

$ 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 the container

$ docker container top [NAME]

TIP: ABOUT CONTAINERS

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 you'll need to connect directly to that. On Linux however, you can run "ps aux" and see the processes directly

IMAGE COMMANDS:

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)

TIP: ABOUT IMAGES

  • Images are app binaries and dependencies with metadata about the image data and how to run the image

  • Images are no complete OS. No kernel, kernel modules (drivers)

  • The host provides the kernel, big difference between VM

Some sample container creation

NGINX:

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

APACHE:

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

MONGODB:

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

MYSQL:

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

CONTAINER INFO

View info on container

$ docker container inspect [NAME]

Specific property (--format)

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

Performance stats (CPU, Memory, Network, Disk, etc)

$ docker container stats [NAME]

ACCESSING CONTAINERS

Create a 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)

NETWORKING

"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 a network

$ docker network create [NETWORK_NAME]

Create a container on network

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

Connect existing container to the network

$ docker network connect [NETWORK_NAME] [CONTAINER_NAME]

Disconnect container from the network

$ docker network disconnect [NETWORK_NAME] [CONTAINER_NAME]

Detach network from container

$ docker network disconnect

VOLUMES:

Volume - Makes a 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 the container

$ docker container inspect mysql

TIP: Mounts

  • You will also see the volume under mounts

  • The Container gets its own unique 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 the new named volume

docker volume inspect mysql-db

BIND MOUNTS

  • Can not use in Dockerfile, specified at run time (uses -v as well)

  • ... run -v /Users/brad/stuff:/path/container (mac/linux)

  • ... run -v //c/Users/brad/stuff:/path/container (windows)

TIP: Instead of typing out the 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 COMPOSE

  • 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 (From Bret Fishers course)

version: '2'

# same as
# docker run -p 80:4000 -v $(pwd):/site bretfisher/jekyll-serve

services:
  jekyll:
    image: bretfisher/jekyll-serve
    volumes:
      - .:/site
    ports:
      - '80:4000'

To run

docker-compose up

You can run in the background with

docker-compose up -d

To cleanup

docker-compose dow

IMAGE TAGGING & PUSHING TO DOCKERHUB

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 docker hub

$ docker image push bradtraversy/nginx

If denied, do

$ docker login

Add a tag to the new image

$ docker image tag bradtraversy/nginx bradtraversy/nginx:testing

DOCKERFILE PARTS

  • 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 an image

  • WORKDIR - Sets working directory (also could use 'RUN cd /some/path')

  • COPY # Copies files from host to the container

Build an image from the dockerfile (repo name can be whatever)

From the same directory as Dockerfile

$ docker image build -t [REPONAME] .

TIP: CACHE & ORDER

  • If you re-run the build, it will be quick because everything 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

EXTENDING 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 an 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 btraversy/nginx-website:latest
$ docker image push bradtraversy/nginx-website

Useful commands:

Remove all unused containers image:

Docker provides a single command that will clean up any resources — images, containers, volumes, and networks — that are dangling (not associated with a container):

WARNING! This will remove:

  • all stopped containers

  • all networks not used by at least one container

  • all dangling images

  • all dangling build cache

$ docker system prune

Remove all images

docker rmi -f $(docker image ls -a -q)

Stop and remove all container

$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)

Start a shell in the container

$ docker exec -it <container_name> sh
PreviousDockerNextDocker Compose

Last updated 4 years ago

Was this helpful?

🛠️
🐳