GMashtalyar

Начало

Контейнеры vs образы

docker login
docker logout

docker run -d -p 80:80 docker/getting-started

docker info
docker images = > все образы
docker ps = > все контейнеры

docker stop df9bdf039014 
docker start df9bdf039014
docker pause df9bdf039014
docker unpause df9bdf039014
docker restart df9bdf039014
(container id)

docker pull opendjk = > скачивание образа
docker pull openjdk:11 = > определенный образ
Образ без контейнера создать нельзя = > он создается сам. Работает контейнер, а не образ. Каждый раз создается новый контейнер.

docker run -it --name MyJava openjdk  = > ( -it = > interactive mode)
ctrl+d = > leave interactive mode
docker start MyJava = > запуск контейнера
docker stop MyJava = > stop
docker kill MyJava = > kill

Dockerfile

.

FROM python:3
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install -r requirements.txt

docker-compose.yml

.

version: '3'

services:
  django:
    build: .
    container_name: django
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/usr/src/app
    ports:
    - "8000:8000"
    depends_on:
      - pgdb

  pgdb:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    container_name: pgdb
    volumes:
      - pgdbdata:/var/lib/postgresql/data

volumes:
  pgdbdata: null

docker-compose

.

FROM openjdk
COPY . /java
WORKDIR /java
RUN javac Main.java
CMD ["java", "Main"]

docker build .

docker rm myapp = > delete container
docker image rm e46e2acfed5d = > delete image


docker build -t my-php-app .
docker run -p 8001:80 -d  my-php-app


docker-compose build
docker-compose up
docker-compose down
docker-compose run
docker-compose run django django-admin startproject tutorial .


docker build -t gmashtalyar/myphp ./php
docker push gmashtalyar/myphp:latest
docker image rm gmashtalyar/myphp
docker pull gmashtalyar/myphp
docker run  -p 3001:80 --name myapp gmashtalyar/myphp

More commands

.

docker logs container_id

docker compose up —build
docker compose up —build -d
docker compose down
docker compose down —remove-orphans = > deletes containers as well (сиротсике контейнеры)

docker system prune -a = > delete all containers and images

docker-compose --profile dev up = > запуск профилей

docker exec container_id pytest api/tests.py



При docker compose down - удаляются контейнеры, в тч база данных. Чтобы это не происходило есть volumes. В тч global.
volumes:
	- pg_data:/var/lib/postgresql/data


Docker-compose scale celery-beat=2 = > масштабирование контейнеров

Запуск контейнеров
* docker inspect - запускает все сервисы и контейнеры на основе вашего docker-compose.yml файла
* docker-compose up -d - запускает все контейнеры в фоновом режиме (не блокирует консоль)
* docker-compose up postgres> - запускает определенный сервис (вместо postgres подставьте нужный)
* docker-compose --profile dev up - запускает только те контейнеры, которые относятся к профилю dev
* docker-compose start - запускает остановленные контейнеры
* docker-compose build - собирает образы
* docker-compose up --build - запускает и одновременно пересобирает образы, если они были изменены с момента последнего запуска или если они еще не были созданы
* docker-compose restart - перезапустить контейнеры

Остановка контейнеров
* docker-compose down - останавливает и удаляет все контейнеры и сети, созданные с помощью docker-compose up
* docker-compose down --remove-orphans - если какие-либо контейнеры остаются после остановки всех сервисов, которые изначально их создали, то эти оставшиеся контейнеры также будут удалены
* docker-compose down --volumes - останавливает контейнеры и удаляет связанные с ними volumes
* docker-compose stop - останавливает контейнеры, созданные с помощью docker-compose up, без их удаления

Состояние контейнеров
* docker-compose logs - просмотреть логи
* docker logs <container_name> - посмотреть логи конкретного контейнера
* docker-compose ps - просмотреть статус запущенных контейнеров
* docker-compose top - отображает информцию о процессах внутри контейнеров
* docker inspect <container_id> - показывает json с настройками контейнера и его состоянием

Масштабирование
* docker-compose up -d --scale <service_name>=<num_instances> - масштабирует количество запущенных контейнеров для указанного сервиса

Выполнение команд внутри контейнера
* docker-compose exec <container_id> <command> - позволяет выполнять команды внутри контейнера, например docker exec 7cbde5a06bbb pytest api/tests.py
* docker exec -it <container_id> /bin/sh - открыть консоль контейнера

docker-compose.yml

.

version: '3.8'
x-environment-defaults: &environment-defaults
  DEBUG: "False"
  DB_NAME: "some secret value"
  DB_USER: "some secret value"
  DB_PASSWORD: "some secret value"
  DB_HOST: "some secret value"
  DB_PORT: 5432
  CELERY_BROKER_URL: "redis://redis:6379/0"
  CELERY_RESULT_BACKEND: "redis://redis:6379/0"
  SECRET_KEY: "some secret value"


services:
  postgres:
    image: postgres:latest
    container_name: postgres
    environment:
      POSTGRES_USER: some secret value
      POSTGRES_PASSWORD: some secret value
      POSTGRES_DB: some secret value
    ports:
      - "5432:5432"
    volumes:
      - pg_data:/var/lib/postgresql/data
    networks:
      - prediction-network
#    profiles:
#      - dev
#      - all

  prediction:
    build:
      context: ./prediction
    ports:
      - "8000:8000"
    networks:
      - prediction-network
    depends_on:
      - postgres
    environment:
      <<: *environment-defaults
    volumes:
      - static_volume:/app/static
    restart: on-failure:5
    healthcheck:
      test: curl -f http://localhost:8000/api/health || exit 1
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 10s

  nginx:
    image: nginx:latest
    volumes:
      - ./conf/nginx.conf:/etc/nginx/nginx.conf
      - static_volume:/static
    ports:
      - "80:80"
    networks:
      - prediction-network
    depends_on:
      - prediction-app
      - prediction

  prediction-app:
    build:
      context: ./prediction-app
    ports:
      - "3000:3000"
    networks:
      - prediction-network

  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    networks:
      - prediction-network
#    profiles:
#      - dev
#      - all

  celery:
    build:
      context: ./prediction
    command: celery -A prediction worker --loglevel=info
    depends_on:
      - redis
      - postgres
    networks:
      - prediction-network
    environment:
      <<: *environment-defaults

  celery-beat:
    build:
      context: ./prediction
    command: celery -A prediction beat --loglevel=info
    depends_on:
      - redis
      - postgres
      - celery
    networks:
      - prediction-network
    environment:
      <<: *environment-defaults


volumes:
  pg_data:
  static_volume:

networks:
  prediction-network:
    driver: bridge

Dockerfile

.

FROM python:3.11-slim

WORKDIR /app
RUN apt-get update && apt-get install -y curl && apt-get clean
COPY . /app/

RUN pip3 install -r requirements.txt

CMD python3 manage.py migrate \
    && python3 manage.py shell -c "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.filter(username='admin').exists() or User.objects.create_superuser('admin', '', 'admin')" \
    && python3 manage.py loaddata data.json \
    && python3 manage.py collectstatic --no-input \
    && gunicorn gm_app.wsgi:application --bind 0.0.0.0:8000

Memory

.

docker ps --size

docker system df