===== Workflow =====
# First time setup:
docker-compose build # Builds your custom image from Dockerfile
docker-compose up -d # Starts containers using your custom image
# If you change the Dockerfile later:
docker-compose build # Rebuild the image
docker-compose up -d # Recreate containers with new image
# Or do both at once:
docker-compose up -d --build
===== File Operations =====
* copy files to docker container: ''docker cp foo.txt container_id:/foo.txt''
* copy files from docker container: ''docker cp container_id:/foot.txt foo.txt''
* prune unneeded files (save disk space): ''sudo docker system prune -a -f''
===== Docker Maintenance =====
* ''docker system df'': show overall space usage by category
* ''docker inspect $(docker ps -q) | grep -A 10 Mounts'': see what volume goes with what container
* ''docker inspect CONTAINER_NAME --format '{{range .Mounts}}{{.Name}} -> {{.Destination}}{{println}}{{end}}' '': list what volume is associated with the container
* ''docker ps'': list docker containers
*
===== Housekeeping =====
* When removing a service use ''docker compose down -v'' instead of ''docker compose down.''
* The ''-v'' removes the associated volumes at the same time.
* When updating images, after pulling and restarting, run ''docker image prune'' to remove the dangling images
* ''docker ps -a'': see all containers, even the ones that are stopped
*
==== Watchtower ====
* Watchtower is a container which auto updates Docker containers
* It will only update containers with updates that have the same tag
* to always get the latest version use the tag ''latest''
* you can check which images have which tags with ''docker images''
* some images might have ''latest'' but not be base images so they won't be updated
* check the logs: ''docker logs watchtower''
* if you want Watchtower to skip trying to update an image add to ''docker-compose.yml''
services:
db:
# label the image as each image gets its own label
image: mariadb:latest # an example
labels:
- "com.centurylinklabs.watchtower.enable=false" # ADD THIS LINE
* run watchtower immediately: ''docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once''
===== Basic Operations =====
* ''docker run'': run container
* use the ''-d'' flag for "detach" i.e. run in background
* use the ''-p'' flag to forward the port i.e. ''-p 9000:80'' maps port 80 in the container to 9000 on the host
* user the ''--name'' flag to name the container (otherwise it's auto generated)
* ''docker stop ''
* ''docker logs ''
* ''docker start '': restart a container
* ''docker build '': build the image
* ''-t'': add name and tag. Ex: ''docker build -t node-app:1.0 .''
===== Docker Registry =====
* Docker Hub is the default registry and it is the biggest public registry
* you can store a private or public registry on Docker Hub
* Each application gets its on repo in the registry
===== creating a Dockerfile =====
* All dockerfiles start with a parent image or "base image"
* define the base image with ''FROM''
* copy files into the container: ''COPY''
* example: ''COPY package.json /app/''
* set the working directory: ''WORKDIR''
* example: ''WORKDIR /app''
* next come the dependencies: ''RUN ''
* example: ''RUN npm install''
* for the last command in the docker file i.e. start the process: ''CMD''
* example: ''CMD ["node", "server.js"]''