# Docker
## Core Concepts
Docker provides virtualization/isolation at the process level:
* vs Virtual machine at the OS level: whole the OS, Docker is much more lightweight, resource efficiency
* allow users to pack application and all dependencies into a single package (image), distribute, run consistenly accross host systems (Linux, Windows, ect.) and environments (local, dev, prod, etc.)

[https://docs.docker.com/get-started/images/docker-architecture.webp](https://)
## Commands
* Pull an image:
```
docker pull postgres:15
docker pull quay.io/wildfly/wildfly
```
* Build an image:
`docker build -t my-app:latest -f Dockerfile .`
* Write a Dockerfile
```
FROM apache/airflow:2.9.3
USER root
RUN apt-get update && apt-get install -y git
USER airflow
RUN pip install dbt-core==1.7.1 dbt-redshift==1.7.0
```
* Run a container, stop, start:
```
docker run -d --name my-app ...
docker stop my-app
docker start my-app
```
* Mount a volume (e.g. shared data folder), map ports from host to container:
```
docker run -d --name my-app -p 8081:8080 -v /home/ubuntu/appdata/:/opt/myapp/data/ ...
```
* Pass env vars to containers:
```
docker run -d --name my-app -e MYVAR=myvalue \
--env-file=/home/ubuntu/myapp.env my-app
```
* Restart policy (e.g. auto start containers on host restarts)
```
docker run -d --name my-app --restart unless-stopped my-app ...
```
* Run with a specific user (usually set in the Dockerfile):
```
docker run -d --name my-app --user=airflow
```
* Limit resources for a container (e.g. for performance test):
```
docker run --cpus=0.5 --memory=1g my-app ...
```
* Exec into a running container(e.g. for debug):
```
docker exec -it my-app /bin/bash`
```
* List images, containers on host:
```
docker container list --all
docker image list --all
```
* Create a network and assign containers to it:
```
docker network create my_network
Containers on the same network can see each other by name:
docker run -d --name my-app --network my-network
docker run -d --name postgres_db --network my-network
```
* Monitoring processes, resources:
```
Show running containers: docker ps
Show resouces usage (mem, cpu) by containers: docker stats
Show running processes inside a container: docker top my-app
```
# Distribute images
* Save and load images from files (especially when internet access is blocked)
```
docker save -o my-app.tar my-app:latest
copy my-app.tar to host, then load
docker load < my-app.tar
docker image list => images should be available on host
```
* Push/pull from public Docker-Hub:
```
docker login ...
docker push ...
docker pull ...
More on:
https://docs.docker.com/get-started/introduction/build-and-push-first-image/
```
* Push/pull from a private Docker registry:
https://earthly.dev/blog/private-docker-registry/
# Docker-compose
Allow users to define and bring-up multi-container app/services:
`docker compose -f my-services-compose.yaml up -d`
More on:
https://docs.docker.com/compose/
# Deployment
K8s
DockerSwarm
# Other topics
https://images.chainguard.dev/directory/image/go/versions
https://medium.com/@faruk13/alpine-slim-bullseye-bookworm-noble-differences-in-docker-images-explained-d9aa6efa23ec