воскресенье, 7 мая 2023 г.

Памятка по Docker и Kuber

  • Docker
  • Kuber
  • Docker

    Docker - команды

    Установка
    sudo apt install docker.io
    sudo chmod 666 /var/run/docker.sock
    

    список образов (классов):
    docker images
    

    список активных контейнеров (объектов)
    docker ps -a
    
    -a - историй запусков

    запуск образа:
    docker run py_app:v0.1
    
    Ключи
    -d (--detach) - запускает в фоновом режиме контейнер и выводит в консоль ID-контейнера
    -p (--publish) - открывает порт(-ы) для докер-контейнера на хосте
    -p 8080:8080 - диапазон портов для которых открывают работать приложение на хосте по тегу, что создавали ранее
    -rm - выполнить образ и удалить (удобно для скачиваемых)
    -it - интерактивный запуск (перенаправление stdin/out из контейнера в родительскую ОС)
    docker run --rm --name stepik-task -it ubuntu:14.04
    

    подключение командной строкой к уже работающему приложению
    docker exec -it container-name bash
    

    удаление:
    rmi - удалить образ (класс)
    rm - удалить контейнер (объект)

    Задание тэга для образа:
    docker tag go:v0.2 pihel/lesson1:v0.2
    
    * загрузка в докехаб:
    docker push pihel/lesson1:v0.2
    

    Создание образа (класса) из контейнера (объекта)
    docker commit название_старое новое
    
    (сохранятся команды изменения, но не точка входа)

    слои образа (изменения которые вносились)
    docker history
    
    идеалогия copy on write - изменения создают новый слой, оригинальные данные остаются в предыдущем слое (страдает производительность при чтении)

    примонтировать папку из родительского хоста:
    --mount type=bind,source=/tmp,target=/usr
    -v /tmp:/tmp
    

    хранение данных докера в файле на хосте (место определяем докер)
    docker volume create my-vol
    
    монтирование -v tratata:/tratata

    проброс портов:

    -p <port_on_host_machine>:<port_inside_container>
    docker run -rm -p 80:80 parseq/stepik-ports-docker
    

    взаимодействие контейнеров через сеть bridge
    все контейнеры попадают в 1 сеть bridge и могут взаимодействовать через ип адреса в этой сети

    Создание Dockerfile

    собираем образ автоматически:
    docker build . -t py_app:v0.1
    
    в образ попадают все файлы рядом с Dockerfile

    Делаем dockerfile вручную:
    vim Dockerfile
    
    FROM python:3.6-alpine3.8                     # Скачиваем легковесный образ python-alpine
    COPY 1.py /app/                               # Копируем 1.py с компьютера в дирректорию /app образа (делается 1 раз при сборка)
    WORKDIR /app                                  # Делаем /app рабочей дирректорией для след. команды
    ENTRYPOINT ["python3", "/app/1.py"]           # Говорим "Питон3, запусти приложение /app/1.py"
    

    операции RUN, COPY, ADD - создает новый слой
    по этому несколько однотипных комманд объединяем через &&
    изменение слоя вначале приводит к пересборке всех нижних, по этому самое редко используемое должно быть вначале

    Копирование образа builder в собираемый:
    COPY --from=builder ./app .              # Копируем собранное приложение из образа biulder
    

    Kuber

    Установка minikube

    minikube - для тестовых локальных запусков
    minikube start --vm-driver=none
    sudo apt-get install -y conntrack
    sudo apt-get install -y go
    
    Дополнительная инструкция по установке minukube

    Создание pod из файла

    pod - минимальная абстракция для управления кубером

    минимальное описание пода:
    apiVersion: v1
    kind: Pod
    metadata:
      name: static-web
      namespace: lesson14
      labels:
        app: goweb #помечает под для перенаправления трафика на него (у нескольких подов может быть 1 label)
    spec:
      containers:
        - name: web #имя контейнера в поде
          image: pihel/lesson1:v0.2 #образ для контейнера
          ports:
            - name: web
              containerPort: 8080
              protocol: TCP
    

    Команды

    Запуск:
    minikube start --vm-driver=docker
    minikube status
    

    список куберов
    kubectl config get-contexts  
    

    текущий кубер
    kubectl config current-context
    
    namespae - разделение подов на папки
    kubectl get ns
    

    запуск пода:
    kubectl apply -f pod.yaml
    

    проброс порта
    kubectl port-forward  -n lesson14 static-web 8080:8080 --address='51.250.85.224'
    

    проброс портов между подами:
    apiVersion: v1
    kind: Service
    metadata:
      namespace: lesson14
      name: my-service
    spec:
      selector:
        app: goweb #проброс портов для пода goweb
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    

    задание статичного IP для приложения:
    apiVersion: v1
    kind: Service
    metadata:
      name: my-balancer
      namespace: lesson14
    spec:
      ports:
      - port: 80
        name: webport
        targetPort: 8080
      selector:
        app: goweb
      type: LoadBalancer
      loadBalancerIP: 10.10.130.145
    

    получить информацию на какой ноде находится под:
    kubectl get pod -n lesson14 -o wide
    

    подробное описание пода
    kubectl describe pod -n lesson14
    

    логи пода:
    kubectl logs -f -n kube-system etcd-minikube
    

    заход в командную строку пода:
    kubectl exec -it -n lesson14 pod/static-web -c web sh
    

    информацию о загрузке подов:
    kubectl top pods -n lesson14
    

    Передача переменных в pod

    передача секретов через переменные окружения:
    env:
      - name: SECRETENV
        valueFrom:
          secretKeyRef:
            name: first-secret
            key: password
    

    передача обычных переменных через data
    data:
        colorgood: purple
        colorbad: yellow
    

    Helm

    - шаблонизация kuber манифестов
    env:
      - name: {{ .Values.secret.name }}
        valueFrom:
          secretKeyRef:
            name: {{ .Values.secret.name }}
            key: password
    
    Задание значени в values.yaml
    secret:
      name: load-secret
      password: loadqwerty
    
    Применение значений
    helm install my-helm-release  test-chart -n tst-namespace -f test-chart/values.yaml
    

    Скалирование от нагрузки

    горизонтальное скалирование от загрузки цпу:
    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: php-apache
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: php-apache
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 80
    

    Комментариев нет:

    Отправить комментарий