Docker basic commands


Conainer commands

Commands to run a container:

docker container ls -a
docker container rm 123 456 # you only need first 2-3 characters for identification
docker container run --publish 8080:80 --name ng nginx
docker run -d -p 3801:3306 --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD='yes' mysql:5.7

Check information related to a container:

docker container top nginx
docker container inspect nginx
docker container stats nginx

Run a bash shell in a container:

docker container exec -it mysql bash # interactive, tty
docker container run -it -p 8080:80 --name nginx nginx

Container Network

  • Network is an interface that connects internally to container, and externally to ethernet.
  • "Bridge" is the default driver for docker network.
  • One container can connect to multiple networks
  • One port in a network can only be occupied by one container
docker network create my
docker container run -d -p 8080:80 --network my --name nginx nginx
docker network connect my mysql
docker network inspect my --format "{{.Containers}}"
docker network disconnect my mysql
  • Don't use ip to talk between containers
  • Docker engine has built-in DNS resolution, so a connection to a container name will be resolved to connect to that container
docker container run -d --name nginx2 --network my nginx:alpine
docker container exec -it nginx2 ping nginx # should be successful

Noted that basic os image usually does not run any application, which results into exiting immediately when running an container, we need to run interactive mode to actually access the shell of the os.

Also, --rm flag will remove the container after it stops.

docker container run --rm -it --name centos centos:7 bash

--net-alias adds a DNS id to the network so whenever other containers try to connect to the name in that network, it randomly picks among all containers connect to that name. For example, use the following commands to run 2 elasticsearch containers using the same DNS:

docker container run -d --name e1 --network my elasticsearch:2
docker container run -d --name e2 --network my --net-alias e1 elasticsearch:2
docker container run -it --name centos --network my centos:7 bash 

In the centos container, do "curl -s e1:9200", which will return different results on different requests.

Image

A docker image is an application or binary, not a complete os like VM. All images are pushed to hub.docker.com by default.

We can use history command to view the history of an image.

docker image history nginx:latest

Docker image is composed of layers like git history, including Dockerfile change & file system change so that when pulling, if an image layer already exists, you don't download that layer again.

File changes in a container is only a "copy on write" that action on the top of the image, but not chaning the image itself.

We can use inspect command to check the info of an image.

docker image inspect nginx:latest # See useful info like Cmd, Env, and ExposedPorts

Image Tagging

Use the following commands to tag an existing image to your own, and push to docker hub.

docker image tag nginx adlerhsieh/nginx:default
docker image push adlerhsieh/nginx:default

Docker Hub

docker login will save a config at: ~/.docker/config.json

docker login
cat .docker/config.json

Volume

Volume is a file system lives outside a container. Bind mounts is to link a container path to a host path.

docker volume ls
docker volume prune # clean volumes

The following mounts a volume to a container:

# add a volume to a container. Format: name:path
docker container run -d --name mysql2 -p 3334:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true -v my:/var/lib/mysql mysql:5.7

The following use the current path as the volume path:

docker container run -d -p 8080:80 --name nginx -v $(pwd):/usr/share/nginx/html nginx
  • file created in the container will not show in the host, but
  • file created on the host will show in container
  • file deleted on both sides will be removed on the other side as well

Docker Compose

docker-compose up -d
docker-compose top
docker-compose ps
docker-compose down
docker-compose down --rmi all
docker-compose down -v
docker-compose up --build