---
# System prepended metadata

title: 'Episode 001: Docker'

---

# Episode 001: Docker

- Hosted by @shashanktomar
- Recording date: TODO

## Video Checkpoints

TODO

## Agenda

- [ ] Introduction, Inspiration, Format and Audience
  - about me, about Fabric and who is this for?
  - [tgik](tgik.io)
  - the structure of the session
  - who is this for?
  - about potential stream issues
- [ ] Why do you need docker and what it is?

  - [Docker vs VM](./images/containers-vs-lxc-vs-vm.jpg)
  - build once and run anywhere (★)
  - bring actual runtime closer to developers (★★)
  - abstraction creates innovation (★★★)

- [ ] Image vs container
- [ ] Let's get started
  - `docker version`
  - `docker info`
  - `docker help`
- [ ] Start a container and play around with it
  - run few containers
  - cleanup and `--rm`
  - detach mode `-d`
  - `attach`
  - expose port `-p` and `-P`
  - interactive `-it`
  - environment variable `-e`
  - `exec`
  - other Commands
    - working dir `-w` or `WORKDIR`
    - user `-u` or `USER`
    - `cp`
    - walk through `docker run --help`
    - walk through `docker --help`
- [ ] Health Checks
  - ```
      docker run --name=hc -d --rm \
      --health-cmd='stat /etc/passwd || exit 1' \
      --health-interval=2s \
      busybox sleep 1d
    ```
  - `watch -t "docker inspect hc | jq '.[0].State.Health.Status'"`
  - `docker exec hc rm /etc/passwd`
  - `docker exec hc touch /etc/passwd`
- [ ] Image Basics

  - let's build few images
    - noose
    - goose
  - image commands
    - walkthrough
    - `ADD` vs `COPY`
    - `ENTRYPOINT` vs `CMD`
  - buildkit
  - best practices
    - create ephemeral containers
    - understand build context
    - .dockerignore
    - multistage builds
    - keep your images thin
    - decouple applications
    - minimize the number of layers: Only the instructions RUN, COPY, ADD create layers
    - leverage build cache

### If time permits

- [ ] Storage
  - bind mounts vs volumes vs tmpfs
- [ ] Advance Topics

  - commit

    - `docker commit --change "ENV DEBUG true" <container-id> busybox/testimage:v1`
    - `docker commit --change='CMD ["sleep", "10"]' <container-id> busybox/testimage:v2`

  - checkpoints

## Show Notes

### Comments

### Feedback

## Reference Links

- [tgik](tgik.io)
- [Docker reference](https://docs.docker.com/reference/)
- [Dockerfile best practices](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)
- [Docker Cheatsheet](./docker-cheatsheet.md)
- [Fabric Group](https://fabricgroup.com.au/)
