Как насрать в контейнер (или образ) и не обосраться
===
---
## Как жили до контейнеров?
- Приложения требуют зависимости (конкретных версий) от хоста.
- Версии зависимостей конфликтуют.
- Приложения гадят в рандомные места хост-системы, о которых никто кроме него не знает.
- Lifecycle на bash-скриптах и systemd.
- Можно не взлететь другом дистрибутиве linux из за рандомных проблем.
---
## Нафига контейнеры?
- Clean environment
- Reproducible on any OS
- Portable builds ==(билдить можно тоже где угодно, не надо готовить хост, чтобы билдить)==
- Ready for production hosting
- https://12factor.net
---
## Чо за контейнеры?
[![](https://www.redhat.com/rhdc/managed-files/virtualization-vs-containers.png)](https://www.redhat.com/en/topics/containers/containers-vs-vms)
---
## Docker is Dead
![Untitled](https://hackmd.io/_uploads/HywTI-U8a.png)
как какать:
- Podman (level up. just better.)
- Rancher (liberalized clone)
---
![image](https://hackmd.io/_uploads/r1a2wZ88T.png)
---
## Concepts
- **Image** -- VHD (os + app) with RUN command
- **Container** -- **Image** after RUN command started
- **Registry** -- repository of **Images**
```graphviz
digraph {
rankdir=LR
registry -> image [label=pull]
image -> container [label=run]
}
```
---
## Live Coding
```sh
# 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
```
---
## Не обосраться удалось
### Но как же насрать?
---
## А как какать?
```graphviz
digraph {
rankdir=LR
registry -> image [label=pull]
image -> container [label=run]
}
```
Модифицировать окружение контейнера мимо образа!
(не надо так)
---
Годный реестр:
https://goharbor.io/
---
{"title":"Как насрать в контейнер (или о","description":"Как насрать в контейнер (или образ) и не обосраться","contributors":"[{\"id\":\"5874e258-71fc-40da-8cad-f926475fd9c8\",\"add\":1350,\"del\":1425}]"}