docker run -d --name my-nginx -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx:stable-alpine docker exec -it my-nginx sh docker network ls
docker inspect my-nginx | grep -n "Network" | head docker volume ls
docker volume inspect pgdata .git
.venv
__pycache__
node_modules
dist
*.log # 1. Base Image. Используем slim-версии (меньше мусора). Проверяйте актуальную версию на hub.docker.com
FROM python:3.12-slim
# 2. Переменные окружения для Python
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
# 3. Рабочая директория
WORKDIR /app
# 4. Сначала копируем зависимости (Layer Caching!)
COPY requirements.txt .
# 5. Ставим пакеты
RUN pip install --no-cache-dir -r requirements.txt
# 6. Только теперь копируем остальной код
COPY . .
# 7. Указываем пользователя (Security - не запускать от root)
RUN useradd -m appuser
USER appuser
# 8. Точка входа
CMD ["python", "app.py"] docker build -t my-app:v1 . docker images | head
docker history my-app:v1 # Stage 1: Build
FROM golang:1.23-alpine AS builder
WORKDIR /src
COPY . .
# Собираем статический бинарник
RUN go build -o myapp main.go
# Stage 2: Runtime
FROM alpine:latest
WORKDIR /root/
# Копируем ТОЛЬКО бинарник из первого стейджа
COPY --from=builder /src/myapp .
CMD ["./myapp"] services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d app"]
interval: 5s
timeout: 3s
retries: 10
app:
image: nginx:stable-alpine
ports:
- "8080:80"
depends_on:
db:
condition: service_healthy
volumes:
pgdata: docker compose up -d
docker compose ps
docker compose logs -f --tail=100
docker compose down docker buildx imagetools inspect nginx:stable-alpine | head -n 40 nginx:stable-alpine@sha256:<digest> docker exec -it my-nginx id docker system df docker system prune
# если понимаете последствия:
docker system prune -a docker run -d --name db -e POSTGRES_PASSWORD=secret -v pgdata:/var/lib/postgresql/data postgres docker exec -it db psql -U postgres
# CREATE TABLE test (id int); INSERT INTO test VALUES (1); cat > app.py <<'PY'
from http.server import BaseHTTPRequestHandler, HTTPServer
class H(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write(b"ok\n")
HTTPServer(("0.0.0.0", 8000), H).serve_forever()
PY docker compose up -d --build
curl -v http://127.0.0.1:8000
docker compose logs -f --tail=50