Инструменты пользователя

Инструменты сайта


linux:containers

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
linux:containers [2024/12/15 05:03]
admin
linux:containers [2025/04/16 06:53] (текущий)
admin [Volumes]
Строка 258: Строка 258:
 <details> <details>
 <summary>:!: sha256 Образа </summary> <summary>:!: sha256 Образа </summary>
 +Появляется похоже только после загрузки в registry
 <code bash> <code bash>
 # Почему то не во всех версиях работает # Почему то не во всех версиях работает
Строка 433: Строка 433:
  
 При повторном создании образа (через Dockerfile), образ пересоздается, типа следующая версия (latest), старый остается.\\ При повторном создании образа (через Dockerfile), образ пересоздается, типа следующая версия (latest), старый остается.\\
 +
 +
 +==== Volumes ====
 +Инструкция "VOLUME" в Dockerfile при сборке, похоже просто создает новый волюм во время сборки, плюс обязывает созданный контейнер постоянно монтировать его при запуске\\
 +
 +<code bash>
 +podman volume create <vol_name>
 +podman volume ls / inspect <vol_name> / rm <vol_name>
 +
 +# Создание контейнера с примонтированным волюмом (можно не запускать)
 +podman container create --name <container_name> -v <vol_name>:/inside_folder <image_name>
 +
 +# Копируем из хоста файлы в волюм, через контейнер
 +podman cp <host_dir>/ <container_name>:/<inside_folder>
 +
 +# Теперь в волюме есть нужные данные, персистентно и им можно пользоваться в других контейнерах
 +podman run -it -v <vol_name>:/inside_folder <image_name>
 +</code>
 +
 +
 +Монтирование папки с хоста в контейнер\\
 +Только права на нее назначаются рутовые\\
 +<code bash>
 +podman run -d -v /path/host_dir:/container_dir <image_name>
 +podman run -d --mount src=/path/host_dir,target=/container_dir,type=bind <image_name>
 +
 +# В Compose
 +services:
 +  my_app:
 +    image: my_app
 +    container_name: my_app
 +    volumes:
 +      - type: bind
 +        source: /path/host_dir
 +        target: /container_dir
 +
 +</code>
 +
 +
  
  
Строка 438: Строка 477:
  
 ===== Docker-compose ===== ===== Docker-compose =====
 +Указание версии в файле либо впринципе устарело либо приобрело новый формат - [[https://docs.docker.com/reference/compose-file/]]\\
 +[[https://docs.docker.com/reference/compose-file|Docs]]\\
 +
 Оркестрация несколькими контейнерами\\ Оркестрация несколькими контейнерами\\
 <code bash> <code bash>
Строка 459: Строка 501:
 <details> <details>
 <summary> :!: Пример приложения и БД postgres</summary> <summary> :!: Пример приложения и БД postgres</summary>
- 
 Приложение загружается с собственного registry, перед этим нужно выполнить "docker login"\\ Приложение загружается с собственного registry, перед этим нужно выполнить "docker login"\\
 Контейнеры объединяются в общую сеть\\ Контейнеры объединяются в общую сеть\\
Строка 560: Строка 601:
   * KAFKA_ADVERTISED_LISTENERS - адреса для клиентов, в т.ч. для межброкерного взаимодействия   * KAFKA_ADVERTISED_LISTENERS - адреса для клиентов, в т.ч. для межброкерного взаимодействия
   * режим для межброкерного взаимодействия задается в "KAFKA_INTER_BROKER_LISTENER_NAME", но для этого в вышестоящем пар-ре должен быть прописан этот режим (internal/external)   * режим для межброкерного взаимодействия задается в "KAFKA_INTER_BROKER_LISTENER_NAME", но для этого в вышестоящем пар-ре должен быть прописан этот режим (internal/external)
- 
 </details> </details>
  
Строка 657: Строка 697:
  
  
 +==== Порядок запуска ====
 +В итоге хз, порядок запуска есть, но только запуск контейнера, сделать ожидание инициализации так и не удалось\\
  
 +<details>
 +<summary>:!: depends_on</summary>
 +**condition: service_started**\\
 +Такой порядок запуска работает но учитывается только старт контейнера а не сервиса внутри него\\
 +Порядок 321
 +<code yaml>
 +version: '3.7'
 +services:
 +  srv1:
 +    image: "openjdk-17:1"
 +    command: "echo 'this first'"
 +    depends_on:
 +      srv2:
 +        condition: service_started
 +
 +  srv2:
 +    image: "openjdk-17:1"
 +    command: "echo 'this second'"
 +    depends_on:
 +      srv3:
 +        condition: service_started
 +
 +  srv3:
 +    image: "openjdk-17:1"
 +    command: "echo 'this three'"
 +</code>
 +
 +
 +**condition: service_completed_successfully**\\
 +Похоже не совсем завершение контейнера\\
 +Кейс: три контейнера запустились сразу, подряд, прошло 30 сек, в таком же порядке завершились все три\\
 +На порядок все же влияет, без условия запустится в прямом порядке, а так было в обратном (321 321)\\
 +
 +аа, это короче от обратного:
 +указывается какой сервис должен быть запущен до этого\\
 +или хз, можно юзать так же как и предыдущий ? тут тоже 321 порядок\\
 +
 +Но завершения контейнера точно не ждет\\
 +<code yaml>
 +version: '3.7'
 +services:
 +  srv1:
 +    image: "openjdk-17:1.15-1.1682053058"
 +    command: "/deployments/entry.sh first"
 +    depends_on:
 +      srv2:
 +        condition: service_completed_successfully
 +    volumes:
 +      - "./script/:/deployments/"
 +
 +  srv2:
 +    image: "openjdk-17:1.15-1.1682053058"
 +    command: "/deployments/entry.sh second"
 +    depends_on:
 +      srv3:
 +        condition: service_completed_successfully
 +    volumes:
 +      - "./script/:/deployments/"
 +
 +  srv3:
 +    image: "openjdk-17:1.15-1.1682053058"
 +    command: "/deployments/entry.sh three"
 +    volumes:
 +      - "./script/:/deployments/"
 +</code>
 +
 +
 +Еще вариации:\\
 +Второй контейнер завершается с err-code и проверка проходит с err-code\\
 +Но первый сервис все равно стартанул, не взирая на правило, правда стартанул последним\\
 +Да, на порядок влияет и влияет хелс-чек, ну и с-но параметр **service_healthy**, хотя и та и та сработали по отдельности\\
 +Да, если зависимость убрать то в обычном порядке стартует, тобишь флаги работают но работают они что то одинаково, просто порядок запуска, без ожидания\\
 +
 +<code yaml>
 +version: '3.7'
 +services:
 +  srv1:
 +    image: "openjdk-17:1.15-1.1682053058"
 +    command: "/deployments/entry.sh first"
 +    healthcheck:
 +      test: ["CMD-SHELL", "/deployments/health.sh 0"]
 +      interval: 15s
 +      timeout: 10s
 +      retries: 10
 +    depends_on:
 +      srv2:
 +        condition: 
 +          - service_healthy
 +          - service_completed_successfully
 +    volumes:
 +      - "./script/:/deployments/"
 +
 +  srv2:
 +    image: "openjdk-17:1.15-1.1682053058"
 +    command: "/deployments/entry.sh second"
 +    healthcheck:
 +      test: ["CMD-SHELL", "/deployments/health.sh 1"]
 +      interval: 15s
 +      timeout: 10s
 +      retries: 10
 +    volumes:
 +      - "./script/:/deployments/"
 +
 +  srv3:
 +    image: "openjdk-17:1.15-1.1682053058"
 +    command: "/deployments/entry.sh three"
 +    healthcheck:
 +      test: ["CMD-SHELL", "/deployments/health.sh 0"]
 +      interval: 15s
 +      timeout: 10s
 +      retries: 10
 +    volumes:
 +      - "./script/:/deployments/"
 +</code>
 +</details>
 +
 +
 +
 +==== PostgreSQL ====
 +:!: Примонтировав папку со скриптами в **"/docker-entrypoint-initdb.d"** внутри контейнера, можно выполнять любой функционал с БД внутри контейнера, после инициализации сервера\\
 +
 +
 +<details>
 +<summary>:!: Общий пример</summary>
 +Капец, каждую версию управляющие переменные окружения меняются\\
 +В 15ой обязательная переменная **POSTGRES_PASSWORD**, для создания БД - **POSTGRES_DB**\\
 +В 17ой все другое\\
 +<code bash>
 +services:
 +  post-db:
 +    image: "postgres:15-alpine3.20"
 +#    env_file: .env
 +    environment:
 +      POSTGRES_DB: 'my_db'
 +      POSTGRES_PASSWORD: 'postgres1'
 +    ports:
 +      - "5432:5432"
 +</code>
 +</details>
 +
 +
 +
 +<details>
 +<summary>:!: МультиБД</summary>
 +[[https://github.com/mrts/docker-postgresql-multiple-databases|Src]]\\
 +Монтируем скрипт в директорию **/docker-entrypoint-initdb.d** внутри контейнера, он создает несколько БД\\
 +
 +<code bash>
 +services:
 +  sarm-db:
 +    image: "postgres:15-alpine3.20"
 +#    env_file: .env
 +    environment:
 +#      POSTGRES_DB: "my_db"
 +      POSTGRES_PASSWORD: "ppp"
 +      POSTGRES_MULTIPLE_DATABASES: my_db1,my_db2
 +    volumes:
 + - ./extended_scripts:/docker-entrypoint-initdb.d
 +    ports:
 +      - "5432:5432"
 +</code>
 +</details>
 +
 +
 +
 +<details>
 +<summary>:!:  </summary>
 +
 +<code bash>
 +</code>
 +</details>
 +
 +
 +
 +
 +
 +==== Разное ====
 +
 +<details>
 +<summary>:!: Command</summary>
 +Похоже не переопределяет команду запуска контейнера или какие то нюансы есть\\
 +Команду нужно писать либо одну либо **bash -c 'first && second'**
 +
 +<code bash>
 +</code>
 +</details>
  
  
linux/containers.1734239035.txt.gz · Последнее изменение: 2024/12/15 05:03 — admin