service:docker
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версия | |||
service:docker [05.02.2025 12:44] – [Buildx / Buildkit] viacheslav | service:docker [23.05.2025 12:55] (текущий) – [Сделать сеть с другим именем, не прописывая её явно для всех сервисов] 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:// |
service/docker.txt · Последнее изменение: — viacheslav