Check docker "hidden" wsl (Win only) wsl --list --verbose =================================================== Working with docker command: - Run docker tutorial command (in docker) docker run -dp 80:80 docker/getting-started docker run --name getting-started -dp 80:80 docker/getting-started This demonstrates port mapping docker ps docker ps -a =================================================== Very basic Workflows ------------------------ docker images ------------------------ Dockerfile docker build -t todo-list-manager . ------------------------ docker containers ------------------------ docker run -dp 3000:3000 todo-list-manager docker run --name todo-list-manager -dp 80:80 docker/getting-started docker stop docker rm docker rm -f - Run Alpine container with bash docker run -it alpine docker run -it alpine echo AAA =================================================== Docker volumes - Named volumes ------------------------- docker volume create todo-db docker run -dp 3000:3000 -v todo-db:/etc/todos todo-list-manager docker volume inspect todo-db docker volume ls =================================================== Docker volumes - Bind Mounts ------------------------- docker run -dp 3000:3000 \ -w /app -v "$(pwd):/app" \ node:22-alpine \ sh -c "yarn install && yarn run dev" docker logs -f =================================================== Docker networking ------------------------- docker network create todo-app docker run -d \ --network todo-app --network-alias mysql \ -v todo-mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=todos \ mysql:8.0 Test (inside mysql container): ------------------------ mysqL -p show databases; Check --network-alias to IP mapping ----------------------------------- docker run -it --network todo-app nicolaka/netshoot dig mysql docker run -dp 3000:3000 \ -w /app -v "$(pwd):/app" \ --network todo-app \ -e MYSQL_HOST=mysql \ -e MYSQL_USER=root \ -e MYSQL_PASSWORD=secret \ -e MYSQL_DB=todos \ node:22-alpine \ sh -c "yarn install && yarn run dev" Test (inside MySQL container): ------------------------ use todos; select * from todo_items; docker logs docker exec -it mysql -p todos =================================================== Docker Compose ------------------------- docker-compose.yml docker-compose up -d docker-compose logs docker-compose down (--volumes) =================================================== Layers and good practices How layers work, Layer caching Good practices writing Dockerfile docker image history todo-list-manager docker image history --no-trunc todo-list-manager docker scout cves todo-list-manager -- requires Docker login .dockerignore =================================================== Docker registry docker tag todo-list-manager YOUR-USER-NAME/todo-list-manager docker push YOUR-USER-NAME/todo-list-manager docker run -dp 3000:3000 YOUR-USER-NAME/todo-list-manager =================================================== EXTRA: Image vs. architecture docker pull alpine docker pull --platform=linux/arm64 alpine docker run alpine docker run --platform linux/arm64 alpine docker buildx create --name mybuilder --driver docker-container --use docker buildx inspect --bootstrap docker buildx build --platform linux/amd64,linux/arm64 -t YOUR-USER-NAME/todo-list-manager --push .