service:docker
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| service:docker [30.07.2024 19:21] – внешнее изменение 127.0.0.1 | service:docker [23.08.2025 19:29] (текущий) – [Podman] viacheslav | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== Docker ====== | ||
| + | <WRAP right box 25%> | ||
| + | — What is the first clue to build the container? | ||
| + | — It must be bound in thews of invincible iron.\\ | ||
| + | — What is the second clue to build the container? | ||
| + | — Bejewel the chest with the hallowed heart of glittering stone.\\ | ||
| + | — What is the third clue to build the container? | ||
| + | — Gift it with the essence of dragon amber, born of earth and root.\\ | ||
| + | — What is the fourth clue to build the container? | ||
| + | — A sacrifice of clay. The power to bind its parts.\\ | ||
| + | — What is the fifth clue to build the container? | ||
| + | — Craft it from wood no mortal blade can carve. Find the wicked tree.\\ | ||
| + | — What is the sixth clue to build the container? | ||
| + | — The strength of love denied. The soul of a dead hero shall empower it.\\ | ||
| + | — What is the seventh clue to build the container? | ||
| + | — Temper it in the tears of the weeping moon.\\ | ||
| + | — What is the eighth clue to build the container? | ||
| + | — Forged by the legendary Black Gnarl, beneath his binding song.\\ | ||
| + | — Each of the hearts have I given.\\ | ||
| + | — And each of the riddles have I returned. I am free! Stay at your task, my fool. No greater curse might I impart! | ||
| + | |||
| + | //Anvil of Dawn// | ||
| + | </ | ||
| + | |||
| + | ===== Обновление ===== | ||
| + | <code bash> | ||
| + | # pull latest images | ||
| + | docker-compose pull | ||
| + | # restart containers | ||
| + | docker-compose up -d --remove-orphans | ||
| + | # remove obsolete images | ||
| + | docker image prune | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | ==== Buildx / Buildkit ==== | ||
| + | Новый сборщик образов, | ||
| + | |||
| + | Установка | ||
| + | <code bash> | ||
| + | sudo apt install docker-buildx | ||
| + | </ | ||
| + | |||
| + | Сделать Buildkit сборщиком по умолчанию | ||
| + | <file json / | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | sudo systemctl restart docker.service | ||
| + | </ | ||
| + | |||
| + | Если Buildkit не установлен по умолчанию, | ||
| + | <code bash> | ||
| + | DOCKER_BUILDKIT=1 docker build -t my_image . | ||
| + | </ | ||
| + | https:// | ||
| + | ===== Чистка ===== | ||
| + | <file bash / | ||
| + | ### Docker cleaning | ||
| + | 0 3 * * 2,4,6 | ||
| + | 0 3 * * 7 | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | ===== Тома для постоянного хранения ===== | ||
| + | |||
| + | ==== sshfs ==== | ||
| + | [[https:// | ||
| + | <code bash> | ||
| + | ### На сервере хранения: | ||
| + | # Создать каталог для тома (он должен быть, автоматически не создаётся): | ||
| + | mkdir -p / | ||
| + | # Создать файл dump (иначе volume не подмонтируется, | ||
| + | touch / | ||
| + | |||
| + | ### На сервере докера: | ||
| + | # Установка дополнения sshfs | ||
| + | docker plugin install --grant-all-permissions vieux/sshfs | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | Пример с паролем, | ||
| + | <code yaml> | ||
| + | version: ' | ||
| + | |||
| + | services: | ||
| + | bepasty: | ||
| + | build: . | ||
| + | container_name: | ||
| + | restart: unless-stopped | ||
| + | volumes: | ||
| + | - bepasty:/ | ||
| + | ports: | ||
| + | - 80:5000 | ||
| + | |||
| + | volumes: | ||
| + | bepasty: | ||
| + | name: " | ||
| + | driver: " | ||
| + | driver_opts: | ||
| + | sshcmd: " | ||
| + | password: " | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | ==== Резервное копирование тома ==== | ||
| + | С помощью другого контейнера, | ||
| + | <code bash> | ||
| + | # Запуск | ||
| + | docker run -d -v /dbdata --name dbstore alpine sleep infinity | ||
| + | # Создание файла | ||
| + | docker exec -it dbstore sh -c "echo ' | ||
| + | # Проверка | ||
| + | docker exec -it dbstore sh -c "cat / | ||
| + | |||
| + | # Бэкап | ||
| + | docker run --rm --volumes-from dbstore -v $(pwd):/ | ||
| + | |||
| + | # Запуск второго контейнера | ||
| + | docker run -d -v /dbdata --name dbstore2 alpine sleep infinity | ||
| + | # Восстановление из архива | ||
| + | docker run --rm --volumes-from dbstore2 -v $(pwd):/ | ||
| + | # Проверка | ||
| + | docker exec -it dbstore2 sh -c "cat / | ||
| + | </ | ||
| + | https:// | ||
| + | ===== Мониторинг ===== | ||
| + | ==== Healthcheck ==== | ||
| + | Можно делать в Dockerfile, можно в docker-compose.yml | ||
| + | |||
| + | Варианты строки проверки | ||
| + | <code bash> | ||
| + | curl --fail http:// | ||
| + | # иногда curl-а нет в образе, | ||
| + | wget --no-verbose --tries=1 --spider http:// | ||
| + | </ | ||
| + | https:// | ||
| + | https:// | ||
| + | https:// | ||
| + | ==== Prometheus ==== | ||
| + | / | ||
| + | <code yaml> | ||
| + | # my global config | ||
| + | global: | ||
| + | scrape_interval: | ||
| + | evaluation_interval: | ||
| + | # scrape_timeout is set to the global default (10s). | ||
| + | |||
| + | # Alertmanager configuration | ||
| + | alerting: | ||
| + | alertmanagers: | ||
| + | - static_configs: | ||
| + | - targets: | ||
| + | # - alertmanager: | ||
| + | |||
| + | # Load rules once and periodically evaluate them according to the global ' | ||
| + | rule_files: | ||
| + | # - " | ||
| + | # - " | ||
| + | |||
| + | # A scrape configuration containing exactly one endpoint to scrape: | ||
| + | # Here it's Prometheus itself. | ||
| + | scrape_configs: | ||
| + | # The job name is added as a label `job=< | ||
| + | - job_name: ' | ||
| + | # metrics_path defaults to '/ | ||
| + | # scheme defaults to ' | ||
| + | static_configs: | ||
| + | - targets: [' | ||
| + | |||
| + | - job_name: ' | ||
| + | static_configs: | ||
| + | - targets: [' | ||
| + | |||
| + | - job_name: ' | ||
| + | static_configs: | ||
| + | - targets: [' | ||
| + | </ | ||
| + | **172.17.0.1 = host.docker.internal**\\ | ||
| + | If you're running with '' | ||
| + | If you're using default networking, use the static IP '' | ||
| + | https:// | ||
| + | |||
| + | ==== Dozzle ==== | ||
| + | <code bash> | ||
| + | # На удалённом хосте запустить докер-прокси, | ||
| + | docker container run --rm --name dockerproxy -e CONTAINERS=1 -v / | ||
| + | # Запустить Dozzle (будет мониториться как локальный сервер через сокет, так и удалённый через прокси) | ||
| + | docker run --rm --name dozzle -p 9999:8080 -v / | ||
| + | </ | ||
| + | https:// | ||
| + | https:// | ||
| + | https:// | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP half column> | ||
| + | Докер-прокси: | ||
| + | <file yaml docker-compose.yml> | ||
| + | version: ' | ||
| + | |||
| + | services: | ||
| + | docker-proxy: | ||
| + | image: tecnativa/ | ||
| + | container_name: | ||
| + | restart: unless-stopped | ||
| + | volumes: | ||
| + | - / | ||
| + | environment: | ||
| + | CONTAINERS: " | ||
| + | ports: | ||
| + | - 2375:2375 | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP half column> | ||
| + | Dozzle (на другом сервере, | ||
| + | <file yaml docker-compose.yml> | ||
| + | version: ' | ||
| + | |||
| + | services: | ||
| + | dozzle: | ||
| + | image: amir20/ | ||
| + | container_name: | ||
| + | restart: unless-stopped | ||
| + | environment: | ||
| + | DOZZLE_BASE: | ||
| + | DOZZLE_REMOTE_HOST: | ||
| + | ports: | ||
| + | - 8080:8080 | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Деплой ===== | ||
| + | ==== Blue-green ==== | ||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | replicas=2 | ||
| + | |||
| + | function deploybg { | ||
| + | docker-compose rm -sf $2 | ||
| + | docker-compose pull $2 | ||
| + | docker-compose up -d --scale $2=$replicas --force-recreate $2 | ||
| + | until [[ ${# | ||
| + | count=( $(docker ps -qf name=$2 -f health=healthy) ) | ||
| + | sleep 10 | ||
| + | done | ||
| + | docker-compose rm -sf $1 | ||
| + | } | ||
| + | |||
| + | if [[ $(docker ps -qf name=backend-blue) ]] | ||
| + | then | ||
| + | deploybg backend-blue backend-green | ||
| + | else | ||
| + | deploybg backend-green backend-blue | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | В Gitlab (1 реплика и удалённый контекст, | ||
| + | <code bash> | ||
| + | script: | ||
| + | - docker context create remote --docker " | ||
| + | - docker context use remote | ||
| + | - | | ||
| + | function deploybg { | ||
| + | docker-compose --context remote rm -sf $2 | ||
| + | docker-compose --context remote pull $2 | ||
| + | docker-compose --context remote up -d --force-recreate $2 | ||
| + | until [[ $(docker ps -qf name=$2 -f health=healthy) ]] | ||
| + | do | ||
| + | sleep 10 | ||
| + | done | ||
| + | docker-compose --context remote rm -sf $1 | ||
| + | } | ||
| + | if [[ $(docker ps -qf name=backend-blue) ]] | ||
| + | then | ||
| + | deploybg backend-blue backend-green | ||
| + | else | ||
| + | deploybg backend-green backend-blue | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | ===== Хранение данных ===== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ===== Решение проблем ===== | ||
| + | ==== Cannot start service < | ||
| + | < | ||
| + | Starting bepasty ... error | ||
| + | ERROR: for bepasty | ||
| + | ERROR: for bepasty | ||
| + | ERROR: Encountered errors while bringing up the project. | ||
| + | </ | ||
| + | Решение: | ||
| + | <code bash> | ||
| + | docker container prune | ||
| + | docker-compose up -d | ||
| + | </ | ||
| + | |||
| + | ==== cannot stop container: permission denied ==== | ||
| + | Невозможно остановить/ | ||
| + | < | ||
| + | Error response from daemon: cannot stop container: c2a63f33d8b5: | ||
| + | Error response from daemon: Cannot kill container: c2a63f33d8b5: | ||
| + | </ | ||
| + | Перезапуск ОС/ | ||
| + | |||
| + | Решение: | ||
| + | It turned out that AppArmor service was messing up with Docker. AppArmor (or “Application Armor”) is a Linux kernel security module that allows the system administrator to restrict programs’ capabilities with per-program profiles. For this problem with containers, it helped me to remove the unknown from AppArmor using the following command: | ||
| + | <code bash> | ||
| + | sudo aa-remove-unknown | ||
| + | </ | ||
| + | After that, I was able to stop and kill my containers. | ||
| + | |||
| + | https:// | ||
| + | |||
| + | ==== Запустить команду с конвейером (pipe) в контейнере с хоста ==== | ||
| + | <code bash> | ||
| + | # Use " | ||
| + | docker exec ops_ubuntu_ntp2 echo " | ||
| + | # Fail to user chpasswd to change password of user cobra_demo in container. | ||
| + | # This is because the Pipe (|). | ||
| + | # The command chpasswd is executed in host not in container. | ||
| + | # However, host accept the output from docker container as it parameter. | ||
| + | |||
| + | docker exec ops_ubuntu_ntp2 echo " | ||
| + | #try another way, use " | ||
| + | echo " | ||
| + | |||
| + | # I tried many solution and found the following command works | ||
| + | # The -i parameter is must. | ||
| + | echo "echo cobra_demo: | ||
| + | |||
| + | # Paramater -i for docker exec. I don't know why, but it works. | ||
| + | echo "echo cobra_demo: | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | ==== Блокировка dockerhub.io в России ==== | ||
| + | С 30 мая 2024 г. | ||
| + | |||
| + | 1. Конфиг докера (как зеркало docker.io) | ||
| + | ^операционная система ^путь к файлу конфигурации ^ | ||
| + | |Linux, regular setup |''/ | ||
| + | |Linux, rootless mode |'' | ||
| + | |Windows |'' | ||
| + | |||
| + | <code bash> | ||
| + | cat << EOF |sudo tee -a / | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | } | ||
| + | EOF | ||
| + | </ | ||
| + | Теперь, | ||
| + | |||
| + | 2. Явное указание адреса | ||
| + | <code bash> | ||
| + | docker pull mirror.gcr.io/ | ||
| + | </ | ||
| + | |||
| + | https:// | ||
| + | https:// | ||
| + | |||
| + | ==== docker.errors.DockerException: | ||
| + | На новых системах после установки docker-compose и попыткой им воспользоваться выходит ошибка\\ | ||
| + | <color # | ||
| + | |||
| + | Решение: | ||
| + | <code bash> | ||
| + | sudo apt remove docker-compose -y | ||
| + | sudo apt install docker-compose-v2 -y | ||
| + | </ | ||
| + | После этого команды выглядят так: | ||
| + | <code bash> | ||
| + | # без дефиса | ||
| + | docker compose up -d | ||
| + | docker compose ps | ||
| + | # и т. д. | ||
| + | </ | ||
| + | ===== Полезное ===== | ||
| + | ==== Запуск процесса в контейнере не от root ==== | ||
| + | - [[https:// | ||
| + | - Use [[https:// | ||
| + | - You can use Supervisor to manage processes in Docker containers and step down from root. But unless you have [[https:// | ||
| + | |||
| + | su-exec is a new-ish alternative to gosu. Both provide similar functionality, | ||
| + | |||
| + | This shows how to: | ||
| + | |||
| + | - Install php7-fpm and su-exec on an Alpine 3.11 Docker image; | ||
| + | - Step down from user root into user nobody using su-exec, and; | ||
| + | - Execute php-fpm using su-exec: | ||
| + | < | ||
| + | FROM alpine:3.11 | ||
| + | RUN apk add --no-cache php7-fpm su-exec | ||
| + | ENTRYPOINT [" | ||
| + | </ | ||
| + | |||
| + | ==== Docker Swarm - запуск команды в контейнере сервиса ==== | ||
| + | Чтобы не искать имя контейнера в сервисе. Надо выбирать имя, которое однозначно указывает на сервис, | ||
| + | <code bash> | ||
| + | docker exec $(docker ps -q -f name=' | ||
| + | </ | ||
| + | |||
| + | ==== Права ==== | ||
| + | В контейнере PHP и Nginx есть юзер www-data (ID 33), которого можно использовать вместо рута при совместной работе. | ||
| + | |||
| + | <file bash Dockerfile> | ||
| + | FROM composer AS vendor | ||
| + | WORKDIR /app | ||
| + | |||
| + | COPY composer.json . | ||
| + | RUN composer install --ignore-platform-reqs --no-dev --no-scripts | ||
| + | |||
| + | |||
| + | FROM php:8.0-fpm | ||
| + | COPY --chown=33: | ||
| + | |||
| + | RUN \ | ||
| + | apt update && apt install -y --no-install-recommends \ | ||
| + | libzip-dev \ | ||
| + | libpng-dev \ | ||
| + | libxml2-dev && \ | ||
| + | docker-php-ext-install \ | ||
| + | pdo_mysql \ | ||
| + | exif \ | ||
| + | pcntl \ | ||
| + | bcmath \ | ||
| + | gd \ | ||
| + | soap \ | ||
| + | zip \ | ||
| + | sockets | ||
| + | |||
| + | USER 33 | ||
| + | </ | ||
| + | |||
| + | То же самое, только размер в 5 раз меньше | ||
| + | <code bash Dockerfile> | ||
| + | FROM composer AS vendor | ||
| + | WORKDIR /app | ||
| + | |||
| + | COPY composer.json . | ||
| + | RUN composer install --ignore-platform-reqs --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader | ||
| + | |||
| + | FROM alpine:3.16 | ||
| + | WORKDIR / | ||
| + | |||
| + | RUN apk add --no-cache \ | ||
| + | php8 \ | ||
| + | php8-fpm \ | ||
| + | php8-mbstring \ | ||
| + | php8-pdo_mysql \ | ||
| + | php8-exif \ | ||
| + | php8-pcntl \ | ||
| + | php8-bcmath \ | ||
| + | php8-gd \ | ||
| + | php8-soap \ | ||
| + | php8-zip \ | ||
| + | php8-sockets \ | ||
| + | php8-session \ | ||
| + | php8-fileinfo && \ | ||
| + | addgroup -g 82 -S www-data || true && \ | ||
| + | adduser -u 82 -D -S -G www-data www-data || true && \ | ||
| + | sed -i '/ | ||
| + | chown -R 82: / | ||
| + | #sed -i '/user =/c user = www-data' | ||
| + | #sed -i '/ | ||
| + | #sed -i '/ | ||
| + | #sed -i '/ | ||
| + | #sed -i ' | ||
| + | #sed -i ' | ||
| + | |||
| + | COPY --chown=82: | ||
| + | COPY --chown=82: | ||
| + | |||
| + | EXPOSE 9000 | ||
| + | #websockets | ||
| + | #EXPOSE 6001 | ||
| + | |||
| + | USER 82 | ||
| + | |||
| + | #RUN php artisan key: | ||
| + | |||
| + | CMD [" | ||
| + | </ | ||
| + | |||
| + | https:// | ||
| + | https:// | ||
| + | http:// | ||
| + | https:// | ||
| + | https:// | ||
| + | https:// | ||
| + | |||
| + | В стандартных томах владелец меняется на папке _data, т. е. | ||
| + | <code bash> | ||
| + | docker run --rm -it -v alpinetest:/ | ||
| + | chown -R 82: /alpinetest | ||
| + | # На хосте: | ||
| + | ls -l / | ||
| + | drwx-----x 3 root root 4.0K Jun 13 11:07 alpinetest | ||
| + | ls -l / | ||
| + | drwxr-xr-x 2 82 82 4.0K Jun 13 11:09 _data | ||
| + | </ | ||
| + | ==== nginx ==== | ||
| + | Шаблон конфигурации - берёт переменные окружения и поставляет их в шаблон, | ||
| + | Стандартный путь к шаблонам: | ||
| + | Стандартный путь к конфигурациям: | ||
| + | <file bash default.conf.template> | ||
| + | server { | ||
| + | listen 80; | ||
| + | index index.php index.html; | ||
| + | root ${NGINX_ROOT}; | ||
| + | location ~ \.php$ { | ||
| + | try_files $uri =404; | ||
| + | fastcgi_split_path_info ^(.+\.php)(/ | ||
| + | fastcgi_pass ${NGINX_FASTCGI_PASS}: | ||
| + | fastcgi_index index.php; | ||
| + | include fastcgi_params; | ||
| + | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | ||
| + | fastcgi_param PATH_INFO $fastcgi_path_info; | ||
| + | } | ||
| + | location / { | ||
| + | try_files $uri $uri/ / | ||
| + | gzip_static on; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <file bash Dockerfile> | ||
| + | FROM nginx: | ||
| + | |||
| + | COPY default.conf.template / | ||
| + | </ | ||
| + | |||
| + | <file yaml docker-compose.yml> | ||
| + | version: " | ||
| + | service: | ||
| + | nginx: | ||
| + | build: ./nginx | ||
| + | container_name: | ||
| + | environment: | ||
| + | NGINX_ROOT: / | ||
| + | NGINX_FASTCGI_PASS: | ||
| + | volumes_from: | ||
| + | - app | ||
| + | ports: | ||
| + | - 80:80 | ||
| + | </ | ||
| + | https:// | ||
| + | ==== PHP ==== | ||
| + | В alpine:3.18 - версии 8.1 и 8.2\\ | ||
| + | В alpine:3.17 - версия 8.1\\ | ||
| + | В alpine:3.16 - версии 8 и 8.1 (по умолчанию '' | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | [[https:// | ||
| + | ==== Laravel ==== | ||
| + | |||
| + | Пример проекта на Laravel - Pixelfed: https:// | ||
| + | |||
| + | [[https:// | ||
| + | [[https:// | ||
| + | [[https:// | ||
| + | [[https:// | ||
| + | |||
| + | ==== nodejs ==== | ||
| + | Сборка в каталоге, | ||
| + | <code bash> | ||
| + | docker run --rm -w /home/node -v ./ | ||
| + | </ | ||
| + | |||
| + | Сложный и неэффективный вариант (пока не понял, что можно проще).\\ | ||
| + | Интересный приём - heredoc для '' | ||
| + | <code bash> | ||
| + | workdir=/ | ||
| + | imagename=front: | ||
| + | |||
| + | docker build -t $imagename -f - . << EOF | ||
| + | FROM node:16 | ||
| + | WORKDIR $workdir | ||
| + | COPY --chown=node: | ||
| + | USER node | ||
| + | # npm rebuild нужен для решения проблемы с правами cross-env: Permission denied | ||
| + | RUN npm rebuild && npm run build | ||
| + | EOF | ||
| + | |||
| + | # Вытащить каталоги client и admin из образа с архивацией gzip | ||
| + | id=$(docker create $imagename) | ||
| + | for i in client admin | ||
| + | do | ||
| + | docker cp $id: | ||
| + | done | ||
| + | docker rm $id | ||
| + | </ | ||
| + | ==== Скачивание и пересылка образа в закрытый контур ==== | ||
| + | В закрытом контуре интернета нет, поэтому на какой-то внешней машине: | ||
| + | <code bash> | ||
| + | docker pull tomcat: | ||
| + | docker save tomcat: | ||
| + | # Куски по 24 МБ, цифровые индексы, | ||
| + | split -b 24M -d --additional-suffix=.tar.gz tomcat_jre11.tar.gz tomcat_jre11_ | ||
| + | ll -h | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | </ | ||
| + | Дальше вытаскивать архивы наружу и слать по почте вложением или ещё как-нибудь.\\ | ||
| + | Выгрузка образов: | ||
| + | |||
| + | На целевом сервере: | ||
| + | <code bash> | ||
| + | cat tomcat_jre11_* > tomcat_jre11.tar.gz | ||
| + | zcat tomcat_jre11.tar.gz |docker load | ||
| + | </ | ||
| + | |||
| + | ==== Сохранение всех образов в архивы ==== | ||
| + | <code bash> | ||
| + | backupdir=/ | ||
| + | |||
| + | mkdir $backupdir | ||
| + | # Кроме образов с тэгами, | ||
| + | images=($(docker image ls | awk ' | ||
| + | # Замена / на _ в именах архивов | ||
| + | for i in " | ||
| + | </ | ||
| + | <code bash> | ||
| + | user@k3: | ||
| + | total 3.6G | ||
| + | drwxrwxr-x | ||
| + | drwxr-x--- 23 user user 4.0K May 31 14:26 ../ | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | -rw-rw-r-- | ||
| + | </ | ||
| + | |||
| + | ==== Загрузка всех образов из архивов ==== | ||
| + | <code bash> | ||
| + | for i in $(ls *.tar.gz); do zcat $i |docker load; done | ||
| + | </ | ||
| + | |||
| + | ==== Убрать повторяющиеся куски кода из docker-compose.yml ==== | ||
| + | Называется " | ||
| + | '' | ||
| + | |||
| + | <code yaml> | ||
| + | version: ' | ||
| + | |||
| + | x-fluentd: & | ||
| + | driver: fluentd | ||
| + | options: & | ||
| + | fluentd-async-connect: | ||
| + | |||
| + | services: | ||
| + | nodeinfo: | ||
| + | image: nodeinfo | ||
| + | logging: | ||
| + | <<: *fluentd | ||
| + | options: | ||
| + | <<: *fluentdopts | ||
| + | tag: " | ||
| + | </ | ||
| + | |||
| + | https:// | ||
| + | https:// | ||
| + | |||
| + | ==== Сделать сеть с другим именем, | ||
| + | Все сервисы стандартно ссылаются на сеть default, а тут ей задано другое имя. В результате будет сеть elastic, но прописывать её в сервисы не надо. | ||
| + | <code yaml> | ||
| + | networks: | ||
| + | default: | ||
| + | name: elastic | ||
| + | external: false | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | ==== Настроить контейнер с часовым поясом и временем, | ||
| + | <code yaml> | ||
| + | volumes: | ||
| + | - / | ||
| + | - / | ||
| + | </ | ||
| + | https:// | ||
| + | |||
| + | ====== Podman ====== | ||
| + | [[https:// | ||
| + | ===== Установка ===== | ||
| + | |||
| + | <code bash> | ||
| + | # Установить | ||
| + | sudo apt install podman | ||
| + | # Прописать псевдоним | ||
| + | echo "alias docker=podman" | ||
| + | </ | ||
| + | |||
| + | ===== Решение проблем ===== | ||
| + | ==== short-name did not resolve to an alias and no unqualified-search registries are defined ==== | ||
| + | <code bash> | ||
| + | podman run --rm -d -p 7080:80 --name nginx nginx: | ||
| + | Error: short-name " | ||
| + | </ | ||
| + | Решение: | ||
| + | <code bash> | ||
| + | mkdir -p ~/ | ||
| + | echo ' | ||
| + | # Системный конфиг: | ||
| + | </ | ||
| + | |||
| + | ===== Литература ===== | ||
| + | [[https:// | ||
| + | [[https:// | ||
