Как насрать в контейнер (или образ) и не обосраться


Как жили до контейнеров?

  • Приложения требуют зависимости (конкретных версий) от хоста.
  • Версии зависимостей конфликтуют.
  • Приложения гадят в рандомные места хост-системы, о которых никто кроме него не знает.
  • Lifecycle на bash-скриптах и systemd.
  • Можно не взлететь другом дистрибутиве linux из за рандомных проблем.

Нафига контейнеры?

  • Clean environment
  • Reproducible on any OS
  • Portable builds (билдить можно тоже где угодно, не надо готовить хост, чтобы билдить)
  • Ready for production hosting
  • https://12factor.net

Чо за контейнеры?


Docker is Dead

Untitled

как какать:

  • Podman (level up. just better.)
  • Rancher (liberalized clone)

image


Concepts

  • Image VHD (os + app) with RUN command
  • Container Image after RUN command started
  • Registry repository of Images

 

digraph {
    rankdir=LR
    registry -> image [label=pull]
    image -> container [label=run]
}

Live Coding


# Recorded with the doitlive recorder
#doitlive shell: /bin/bash
#doitlive prompt: default

rm app.py Containerfile compose.yml ; podman system prune --all

podman run hello-world

podman run --interactive --tty debian

echo "# let's get something from host!"

echo 'print("fart")' > app.py

podman run --rm -itv "$PWD":/v:z debian

podman run --rm -itv "$PWD":/v:z --entrypoint sh python

echo "# let's build our own image!"

echo 'FROM python' > Containerfile
echo 'WORKDIR /app' >> Containerfile
echo 'COPY app.py .' >> Containerfile
echo 'ENTRYPOINT ["python", "-u", "app.py"]' >> Containerfile
cat Containerfile

podman build .

podman build --tag crap .

podman run crap

echo "# let's run a web service!"

echo 'import http.server' >> app.py

echo 'http.server.HTTPServer(("", 80), http.server.SimpleHTTPRequestHandler).serve_forever()' >> app.py

podman build -t crap .

podman run --name poo --publish 8000:80 crap

echo 'services:' > compose.yml
echo '  shit:' >> compose.yml
echo '    build: .' >> compose.yml
echo '    image: crap' >> compose.yml
echo '    container_name: poo' >> compose.yml
echo '    ports:' >> compose.yml
echo '      - "8000:80"' >> compose.yml
cat compose.yml

podman compose up --detach

podman ps

podman compose down


Не обосраться удалось

Но как же насрать?


А как какать?

digraph {
    rankdir=LR
    registry -> image [label=pull]
    image -> container [label=run]
}

Модифицировать окружение контейнера мимо образа!

(не надо так)


Годный реестр:

https://goharbor.io/


Select a repo