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
Last updated
Was this helpful?