Удалить образ docker: Docker: Удалить Образ — Удалить Все Образы — Удалить Неиспользуемые

Содержание

Полное руководство по удалению образов Docker

Если вы продолжите создавать образы докеров, у вас скоро начнется заканчиваться свободное место. Удаление старых и неиспользуемых образов Docker освободит для вас много места на диске.

В этой статье мы расскажем о различных сценариях удаления образов Docker из вашей системы.

 

Способы удаления образов Docker

Сначала проверьте образы Docker, присутствующие в вашей системе, с помощью этой команды:

docker images

 

На выходе будут показаны все изображения Docker и их идентификаторы. Вам нужно имя изображения (в столбце репозитория) или идентификатор изображения, чтобы удалить образ докера из вашей системы.

[email protected]:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian              latest              67e34c1c9477        2 weeks ago         114MB
ubuntu              latest              775349758637        6 weeks ago         64.2MB

 

С помощью идентификатора изображения вы можете удалить образ Docker следующим образом:

docker rmi image_name_or_id

 

Вы также можете использовать следующую команду, так как они одинаковы:

docker image rm image_id

 

Вот как может выглядеть вывод:

andrey[email protected]:~$ docker rmi 67e34c1c9477
Untagged: debian:latest
Untagged: [email protected]:79f0b1682af1a6a29ff63182c8103027f4de98b22d8fb50040e9c4bb13e3de78
Deleted: sha256:67e34c1c9477023c0ce84c20ae5af961a6509f9952c2ebbf834c5ea0a286f2b8
Deleted: sha256:f2b4f0674ba3e6119088fe8a98c7921ed850c48d4d76e8caecd7f3d57721b4cb

 

Если вы используете идентификатор изображения, он удалит все изображения, связанные с этим идентификатором.

 

Удалить образ Docker, связанный с контейнером

Жизнь была бы намного проще, если бы вы могли просто удалить образы Docker. Но случается это не часто.

Если у вас есть контейнеры, связанные с образом Docker, вы столкнетесь с некоторыми ошибками при попытке удалить изображение.

[email protected]:~$ docker rmi 775349758637
Error response from daemon: conflict: unable to delete 775349758637 (cannot be forced) - image is being used by running container 13dc0f4226dc

 

Сначала вы должны остановить контейнер:

[email protected]:~$ docker stop 13dc0f4226dc
13dc0f4226dc

 

Проблема в том, что даже если вы остановите контейнер, он все равно будет выдавать ошибку, если вы попытаетесь удалить изображение:

[email protected]:~$ docker rmi 67e34c1c9477
Error response from daemon: conflict: unable to delete 67e34c1c9477 (must be forced) - image is being used by stopped container 5ced86b1fcee

 

У вас есть два варианта здесь:

  • Принудительно удалить образ докера (связанный контейнер останется в системе)
  • Удалите связанный контейнер, а затем удалите образ Docker

Чтобы принудительно удалить образ Docker, вы можете использовать опцию -f:

docker rmi -f image_id

 

Чтобы удалить контейнер, а затем удалить изображение, вы можете использовать что-то вроде этого:

docker rm container_id
docker rmi image_id

 

Удалить образ Docker, связанный с несколькими контейнерами

Жизнь все равно была бы немного проще, если бы изображение Docker было связано только с одним контейнером. Но с изображением может быть связано несколько контейнеров, и удаление такого рода изображения Docker становится проблемой.

Вы увидите ошибку, подобную этой:

[email protected]:~$ docker rmi 775349758637
Error response from daemon: conflict: unable to delete 775349758637 (must be forced) - image is referenced in multiple repositories

 

Во-первых, вам нужно найти все контейнеры, связанные с именем изображения (не ID).

docker ps -a -q --filter ancestor=docker_image_name
  • Опция  -a отображает все запущенные и остановленные контейнеры.
  • Опция -q отображает только идентификатор контейнера.

И тогда вам нужно остановить их всех. Вы можете использовать идентификаторы контейнеров один за другим, но это займет слишком много времени. Вы можете использовать магию pipe и xargs, чтобы остановить все контейнеры, связанные с изображением:

docker ps -a -q --filter ancestor=ubuntu | xargs docker stop

 

И тогда вы можете либо удалить остановленные контейнеры, либо принудительно удалить изображение (как вы видели в предыдущем разделе).

Если вы хотите удалить все контейнеры, связанные с изображением, просто запустите эту команду:

docker ps -a -q --filter ancestor=ubuntu | xargs docker rm

 

И теперь вы можете удалить образ Docker с помощью команды, показанной ранее в этой статье.

 

Удаление нескольких образов Docker одновременно

Вы также можете удалить несколько образов Docker в одной команде. Это так же, как предыдущая команда. Вам просто нужно указать идентификаторы изображений или имена изображений.

docker rmi image_id_1 image_id_2 image_id_3

 

Конечно, вам придется остановить все запущенные контейнеры, связанные с изображениями.

 

Удалите все неиспользуемые и висячие образы Docker сразу

Прежде чем вы увидите это, позвольте нам объяснить, что такое неиспользуемые и висящие изображения:

Любой образ Docker, с которым связаны любые типы контейнеров (остановлен или запущен), является используемым образом. Если с изображением Docker не связаны контейнеры, он становится неиспользуемым изображением Docker.

Висящий образ Docker означает, что вы создали новую сборку образа, но ему не дали новое имя. Таким образом, старые образы, которые у вас есть, становятся висящими. Эти старые изображения являются непомеченными и отображают <none> в своем имени, когда вы запускаете команду ‘docker images’.

Если вы хотите удалить висячие образы, вы можете использовать опцию prune:

docker image prune

 

Если вы хотите удалить неиспользуемые и висящие изображения одновременно, вы можете использовать prune с параметром -a:

docker image prune -a

 

Вы должны увидеть пространство, которое он освобождает в конце вывода:

[email protected]:~$ docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: ubuntu:latest
untagged: [email protected]:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d
untagged: debian:latest
untagged: [email protected]:79f0b1682af1a6a29ff63182c8103027f4de98b22d8fb50040e9c4bb13e3de78
deleted: sha256:67e34c1c9477023c0ce84c20ae5af961a6509f9952c2ebbf834c5ea0a286f2b8
deleted: sha256:f2b4f0674ba3e6119088fe8a98c7921ed850c48d4d76e8caecd7f3d57721b4cb
untagged: fedora:latest
untagged: [email protected]:d4f7df6b691d61af6cee7328f82f1d8afdef63bc38f58516858ae3045083924a
deleted: sha256:f0858ad3febdf45bb2e5501cb459affffacef081f79eaa436085c3b6d9bd46ca
deleted: sha256:2ae3cee18c8ef9e0d448649747dab81c4f1ca2714a8c4550eff49574cab262c9

Total reclaimed space: 308.3MB

 

Вы можете быть немного умнее с командой prune и удалять только старые неиспользуемые и висящие изображения. Так что если вы хотите удалить те, которые старше 24 часов, используйте это так:

docker image prune -a --filter "until=24h"

 

Удалите все образы докеров из вашей системы

Возможно, вы находитесь в среде тестирования и хотите начать заново, удалив все образы Docker.

Чтобы удалить все образы Docker, вам необходимо сначала остановить все работающие контейнеры.

docker ps -a -q | xargs docker rm

 

Теперь вы можете удалить все изображения следующим образом:

docker images -a -q | xargs docker rmi -f

 

Вот и все. Мы думаем, что достаточно справочного материала для удаления образов Docker, и вы должны лучше понять эту тему.

Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте комментарий ниже.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Как удалить все контейнеры Docker, образы, тома и сети

Docker позволяет быстро создавать, тестировать и развертывать приложения как портативные самостоятельные контейнеры, которые могут работать практически в любой системе.

Docker не удаляет неиспользуемые объекты, такие как контейнеры, образы, тома и сети, если вы явно не скажете ему об этом. При работе с Docker можно легко накопить большое количество мусорных объектов, которые занимают много места на диске и размешивают данные, создаваемые командами Docker.

Это руководство служит «шпаргалкой», чтобы помочь пользователям Docker сохранить свою систему организованной и освободить место на диске, удалив все неиспользуемые контейнеры Docker, образы, тома и сети.

Удаляем все неиспользуемые объекты

Команда docker system prune удалит остановленные контейнеры, все висячие образы и все неиспользуемые сети:

docker system prune

Вы можете использовать флаг -f или —force, чтобы пропустить дополнительный запрос на подтверждение операции.

Вывод:
WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N]

Удаление контейнеров Docker

Контейнеры Docker не удаляются автоматически при их остановке, если вы специально не указали флаг —rm при его запуске.

Удаляем один или несколько контейнеров

Чтобы удалить один или несколько образов Docker используйте команду docker container rm, после которой следует указать идентификатор контейнера, который необходимо удалить. Список всех активных и неактивных контейнеров можно получить, передав флаг -a команде docker container ls:

docker container ls -a

В качестве результата выполнения этой команды вы должны увидеть такую таблицу:

CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS               NAMES
cc3f2ff51cab        centos                  "/bin/bash"              2 months ago        Created                                         competent_nightingale
cd20b396a061        solita/ubuntu-systemd   "/bin/bash -c 'exec …"   2 months ago        Exited (137) 2 months ago                       systemd
fb62432cf3c1        ubuntu                  "/bin/bash"              3 months ago        Exited (130) 3 months ago                       jolly_mirzakhani

Как только вы нашли необходимый идентификатор контейнера, который хотите удалить, передайте его имя команде docker container rm. Например, чтобы удалить первые два контейнера, перечисленных выше выполните команду:

docker container rm cc3f2ff51cab cd20b396a061

Если вы получаете сообщение об ошибке, подобное приведенному ниже, это означает, что контейнер все еще работает. Перед удалением контейнера, его необходимо остановить.

Error response from daemon: You cannot remove a running container fc983ebf4771d42a8bd0029df061cb74dc12cb174530b2036987575b83442b47. Stop the container before attempting removal or force remove.

Удалить все остановленные контейнеры

Перед выполнением команды можно получить список всех неиспользуемых (остановленных) контейнеров, с помощью следующей команды:

docker container ls -a --filter status=exited --filter status=created

Чтобы удалить все остановленные контейнеры, используйте команду docker container prune:

docker container prune

Вам будет предложено продолжить, используйте флаг-for —force, чтобы пропустить этот вопрос.

Вывод:
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

Удаляем контейнер используя фильтр

Команда docker container prune позволяет удалить контейнеры в зависимости от их состояния, используя флаг фильтрации —filter. На момент написания этой статьи дополнительно поддерживаются фильтры until и label. Вы можете использовать более одного фильтра, передавая несколько флагов —filter.

Например, чтобы удалить все образы, созданные более 12 часов назад, запустите:

docker container prune --filter "until=12h"

Остановить и удалить все контейнеры

Вы можете получить список всех контейнеров Docker в вашей системе с помощью команды docker container ls -aq. Чтобы остановить все запущенные контейнеры, используйте команду docker container stop, после которой укажите список всех идентификаторов.

docker container stop $(docker container ls -aq)

После остановки всех контейнеров их можно удалить. Используя команду docker container stop, за которой следует список идентификаторов контейнеров попробуем сделать это:

docker container rm $(docker container ls -aq)

Как удалить образы Docker

Для удаления одного или нескольких образов Docker используйте команду docker images ls, чтобы найти идентификатор(ID) образа, который нужно удалить.

docker image ls

Вывод должен выглядеть примерно так:

REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
centos                  latest              75835a67d134        7 days ago          200MB
ubuntu                  latest              2a4cca5ac898        2 months ago        111MB
linuxize/fedora         latest              a45d6dca3361        3 months ago        311MB
java                    8-jre               e44d62cf8862        3 months ago        311MB

Как только вы найдете образы, которые хотите удалить, передайте их идентификаторы команде docker image rm. Например, чтобы удалить первые два образа, перечисленные в выходных данных выше выполните:

docker image rm 75835a67d134 2a4cca5ac898

Если вы получите ошибку, подобную следующей, это означает, что образ используется контейнером. Чтобы удалить образ, нужно сначала удалить контейнер.

Error response from daemon: conflict: unable to remove repository reference «centos» (must force) — container cd20b396a061 is using its referenced image 75835a67d134

Удаляем висящие и неиспользуемые образы

Docker имеет команду docker image prune, которая может использоваться для удаления висячих и неиспользуемых образов. Висячий образ — это такой образ, который не отмечен и не используется ни одним контейнером. Для удаления висячих изображений введите:

docker image prune

Вам будет предложено продолжить, используйте флаг -f или —force, чтобы пропустить этот вопрос.

Чтобы удалить все образы, на которые не ссылается ни один существующий контейнер, используйте флаг -a:

docker image prune -a

Удаляем образы используя фильтры

С помощью команды docker image prune можно удалить образы используя определенные условия с помощью флага фильтрации —filter.

На момент написания этой статьи в настоящее время поддерживаются фильтры until и label. Вы можете использовать более одного фильтра, передавая несколько флагов —filter.

Например, чтобы удалить все изображения, созданные более 6 минут назад, запустите:

docker image prune -a --filter "until=6m"

Удаление Docker томов

Удалить один или несколько томов

Для начала, используйте команду docker volume ls для поиска идентификатора томов. Это необходимо чтобы удалить один или несколько томов Docker.

docker volume ls

Результат выполнения команды должен выглядеть примерно так:

DRIVER              VOLUME NAME
local               4e12af8913af888ba67243dec78419bf18adddc3c7a4b2345754b6db64293163
local               terano

Теперь выберите имя или несколько имен томов, которые вы хотите удалить и передайте их в команду docker volume rm. Например, чтобы удалить первый том, указанный в выводе выше выполните:

docker volume rm 4e12af8913af888ba67243dec78419bf18adddc3c7a4b2345754b6db64293163

Если вы получаете ошибку, подобную следующей, это означает, что выбранный том используется существующим контейнером. Чтобы удалить том, придется сначала удалить контейнер.

Error response from daemon: remove 4e12af8913af888ba67243dec78419bf18adddc3c7a4b2345754b6db64293163: volume is in use — [c7188935a38a6c3f9f11297f8c98ce9996ef5ddad6e6187be62bad3001a66c8e]

Удалить неиспользуемые тома

Для удаления всех неиспользуемых томов существует команда docker volume prune:

docker volume prune

Удаление сети Docker

Одна или несколько сетей

Перед удалением одной или нескольких сетей Docker используйте команду docker network ls, чтобы найти идентификатор сетей, которые хотите удалить.

docker network ls

Результат должен быть примерно таким:

NETWORK ID          NAME                DRIVER              SCOPE
107b8ac977e3        bridge              bridge              local
ab998267377d        host                host                local
c520032c3d31        my-abuzov-network   bridge              local
9bc81b63f740        none                null                local

После обнаружения названия сетей, передайте их идентификатор сети команде docker network rm. Например, чтобы удалить сеть с именем my-abuzov-network выполните:

docker network rm c520032c3d31

Если вы получаете ошибку, подобную следующей, это означает, что сеть используется существующим контейнером. Чтобы удалить сеть, вам придется сначала удалить контейнер.

Error response from daemon: network my-abuzov-network id 6f5293268bb91ad2498b38b0bca970083af87237784017be24ea208d2233c5aa has active endpoints

Удалить неиспользуемую сеть

Используйте команду docker network prune для удаления всех неиспользуемых сетей.

docker network prune

Эту команду можно выполнить принудительно, используя специальный флаг -f или —force.

Удалить сети с помощью фильтров

С помощью команды docker network prune можно удалить сети по условиям, используя флаг фильтрации —filter.

На момент написания этой статьи в настоящее время поддерживаются фильтры until и label. Вы можете использовать более одного фильтра, передавая несколько флагов —filter.

Например, чтобы удалить все сети, созданные более 5 часов назад, запустите:

docker network prune -a --filter "until=5h"

В этом руководстве мы показали вам некоторые общие команды для удаления контейнеров Docker, образов, томов и сетей.

Рекомендуем дополнительно проверить официальную документацию Docker. Если у вас возникли вопросы, пожалуйста, оставьте комментарий ниже.

Руководство по образам Docker: удаление образов, остановка контейнеров и удаление разделов

Перевод статьи «Docker Image Guide: How to Remove and Delete Docker Images, Stop Containers and Remove all Volumes».

Docker очень широко применяется в разработке программ. Это отличный инструмент для развертывания приложения в облаке (или в какой-нибудь еще Docker-ready инфраструктуре). Он также пригождается и в локальной разработке. С его помощью вы можете быстро запускать сложные приложения и разрабатывать их изолированно, причем с очень хорошей производительностью.

В этой статье я собрал список самых важных команд для эффективного использования Docker.

Вывод списка всех образов Docker

docker images

У меня есть три образа:

  • MySQL в версии 8.0.19 и MySQL в последней версии (с тегом latest),
  • а также Cassandra в последней версии.

(Прим. ред: терминологию можно посмотреть во вступительной статье по Docker).

Чтобы получить больше информации об образе, можно воспользоваться следующей командой:

docker inspect mysql:latest

В выводе команды мы получаем список сведений. Альтернативный вариант получения информации — при помощи ID образа:

docker inspect 3a5e53f63281

В выводе команды вы получите очень много всего, поэтому лучше сразу отфильтровать нужную информацию:

docker inspect --format='{{.RepoTags}}  {{.Config.Image}}' 3a5e53f63281

Удаление образов Docker

Удалить отдельный образ можно при помощи команды docker rm. Допустим, я хочу удалить образ MySQL:

docker rm mysql:latest

В моем случае еще остается образ с тегом mysql:8.0.19. Таким образом, для полного удаления мне нужно также удалить тег другой версии:

docker rm mysql:8.0.19

Если мы хотим удалить образ напрямую, проще это сделать по id:

docker image rm 3a5e53f63281 -f

Опция -f обеспечивает принудительное выполнение. Если ваш образ имеет больше одного тега, без этой опции вы получите ошибку.

Запуск образа Docker

Чтобы запустить образ, можно воспользоваться следующей командой:

docker run cassandra

Если такого образа у вас нет, он будет загружен. Остановить выполнение команды можно, нажав CTRL+C. Также можно запускать образ в фоне, для этого к команде нужно добавить опцию -d:

docker run -d mysql

Если контейнер запущен в фоне, вы получаете его ID.

По умолчанию контейнер запускается изолированно. То есть, вы не сможете никак коммуницировать с ним или сохранять какие-то файлы в своей текущей директории.

Проброс портов контейнера

При помощи опции -p можно перенаправить порты, например, на страницу, которая открывается из вашего контейнера:

docker run -p 8080:80 nginx

Контейнер NGINX предоставляет веб-сервер через порт 80. При помощи -p 8080:80 локальный порт 8080 перенаправляется на 80-й порт контейнера.

Как залогиниться в контейнере

Иногда возникает необходимость залогиниться в контейнере. Это возможно только в том случае, если в контейнере установлена оболочка. В противном случае вы получите ошибку.

Для начала, запустите отдельный контейнер и дайте ему имя:

docker run -d --name my_container nginx

Команда вернет ID контейнера. Теперь вы можете выполнить оболочку в контейнере и приложить к ней свои входные и выходные данные, используя опции -i и -t:

docker exec -it my_container bash

Вместо имени контейнера для всех дальнейших операций можно также использовать возвращенный ранее идентификатор.

Иногда bash бывает недоступен. Поэтому можно попробовать запустить базовую оболочку:

docker exec -it my_container sh

Вывод списка запущенных контейнеров

После запуска контейнера вы можете найти его в списке всех запущенных контейнеров, для этого воспользуйтесь следующей командой:

docker ps

Если добавить опцию -а, в списке появятся также контейнеры, завершившие исполнение:

docker ps -a

Расшаривание локальной папки, чтобы контейнер мог иметь к ней доступ

Иногда бывает полезным синхронизировать файлы между контейнером и локальной файловой системой. Это можно сделать, воспользовавшись при запуске контейнера опцией -v.

На Linux и macOS можно расшарить локальную временную папку следующим образом:

docker run --name=my_container -d -v $(pwd)/tmp:/var/log/nginx -p 8080:80 nginx

На Windows можно запустить:

docker run --name=my_container -d -v %cd%/tmp:/var/log/nginx -p 8080:80 nginx

Остановка запущенных контейнеров

Запущенный контейнер можно остановить при помощи следующей команды:

docker stop my_container

Остановка контейнера останавливает все процессы, но сохраняет изменения внутри файловой системы.

Запуск остановленного контейнера

Остановленный контейнер можно запустить следующим образом:

docker start my_container

Удаление контейнера

Чтобы удалить остановленный контейнер, выполните:

docker rm my_container

Чтобы остановить и удалить контейнер одной командой, можно добавить опцию -f.

docker rm -f my_container

Создание тома и расшаривание его между несколькими контейнерами

Создаем независимый том (volume) с именем SharedData:

docker volume create --name SharedData
docker run --name=my_container -d -v SharedData:/var/log/nginx -p 8080:80 nginx
docker run --name=my_container_2 -d -v SharedData:/var/log/nginx -p 8080:80 nginx

Теперь у обоих контейнеров будет общая папка, файлы в которой будут синхронизироваться с обоими контейнерами.

Удаление тома

Чтобы удалить том, нужно сначала удалить все контейнеры, использующие его.

docker rm -f my_container
docker rm -f my_container_2
docker volume rm SharedData

Удаление остановленных контейнеров и неиспользуемых образов

Безопасная команда очистки:

docker system prune -a

Удаление всех томов, которые не используются

Все отсоединенные тома можно удалить при помощи следующей команды:

docker system prune

Заключение

Создание контейнеров, вход в них, проброс портов и расшаривание папок это самые важные задачи, осуществляемые при помощи интерфейса командной строки Docker. Выполняемые при этом команды составляют основу таких систем как Kubernetes и позволяют нам создавать и запускать приложения изолированно.

Как удалить неиспользуемые образы и контейнеры Docker? — Хабр Q&A

Осваиваю по чуть-чуть докер как замену Vagrant. Использую под Windows 10 x64.

Если ввести команду docker image ls -a то я получу вот такой вот огромнейший список образов:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
compressor          latest              e7bce9666889        10 days ago         749MB
<none>              <none>              1f1f1aa4ae2f        10 days ago         749MB
<none>              <none>              3bb11dab29e3        10 days ago         749MB
<none>              <none>              9ba4f9c83e1d        10 days ago         739MB
<none>              <none>              c5e434998a55        10 days ago         733MB
<none>              <none>              63ed6e76dd99        10 days ago         737MB
<none>              <none>              ee99372c449f        10 days ago         765MB
<none>              <none>              383a61e13c20        10 days ago         737MB
<none>              <none>              e9190eaef8e6        10 days ago         733MB
<none>              <none>              0cbc5aa5ef4d        10 days ago         749MB
<none>              <none>              787250f91fef        10 days ago         749MB
<none>              <none>              8a6e760211f9        10 days ago         749MB
<none>              <none>              148153f129c5        10 days ago         739MB
<none>              <none>              2de315c41c64        10 days ago         737MB
<none>              <none>              1717e3c3bcc1        10 days ago         749MB
<none>              <none>              d56ede6c805e        10 days ago         749MB
<none>              <none>              8cbc67298b2d        10 days ago         749MB
<none>              <none>              bff8e8f683c4        10 days ago         739MB
<none>              <none>              623fb0ff2dcb        10 days ago         737MB
<none>              <none>              6571e073391f        10 days ago         733MB
<none>              <none>              f5b87e8e05e1        10 days ago         758MB
<none>              <none>              6ae3c4d8424d        10 days ago         758MB
<none>              <none>              dca137070f2a        10 days ago         749MB
<none>              <none>              07674f826bc4        10 days ago         737MB
<none>              <none>              300507774fcb        10 days ago         733MB
<none>              <none>              4578d80529d1        10 days ago         737MB
<none>              <none>              4fde50fc0a2e        10 days ago         733MB
<none>              <none>              d313e0599cff        10 days ago         273MB
<none>              <none>              0839508746fb        10 days ago         269MB
<none>              <none>              af2b258db005        10 days ago         273MB
<none>              <none>              82fc987fc158        10 days ago         269MB
<none>              <none>              1442906cd12f        11 days ago         269MB
mariadb             latest              7fcf8c1a96d2        4 weeks ago         397MB
<none>              <none>              1a34fad76b34        4 weeks ago         733MB
d4w/nsenter         latest              9e4f13a0901e        14 months ago       83.8kB

Также есть целая куча контейнеров:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                    NAMES
cf61b9666ef6        ee99372c449f        "/bin/sh -c 'go-wr..."   10 days ago         Exited (2) 10 days ago                              stoic_turing
b808be02b803        8a6e760211f9        "/bin/sh -c compre..."   10 days ago         Exited (137) 10 days ago                            musing_yonath
0bc12515d24a        d56ede6c805e        "-name compressor"       10 days ago         Created                    0.0.0.0:8080->8080/tcp   keen_kalam
b1e823f64cd6        d56ede6c805e        "-name compressor"       10 days ago         Created                    0.0.0.0:8080->8080/tcp   kind_leakey
f358c4ff64f8        d56ede6c805e        "compressor"             10 days ago         Exited (2) 10 days ago                              unruffled_yonath
9c608db2fd75        d56ede6c805e        "compressor"             10 days ago         Exited (2) 10 days ago                              heuristic_babbage
2868050bbff0        d56ede6c805e        "compressor"             10 days ago         Created                                             stoic_haibt
eae11f3a306f        d56ede6c805e        "compressor"             10 days ago         Exited (2) 10 days ago                              mystifying_snyder
6a5bac45ae30        f5b87e8e05e1        "bash"                   10 days ago         Exited (130) 10 days ago                            mystifying_sammet
7158ed3fb444        f5b87e8e05e1        "bash"                   10 days ago         Exited (0) 10 days ago                              wonderful_ritchie
8fc1484a144b        f5b87e8e05e1        "bash"                   10 days ago         Exited (0) 10 days ago                              tender_goodall
1cfa3d889681        f5b87e8e05e1        "bash"                   10 days ago         Exited (0) 10 days ago                              peaceful_jang
41b51ef4dbd7        d313e0599cff        "/bin/sh -c 'go ge..."   10 days ago         Exited (1) 10 days ago                              elastic_brattain
8ce92252a980        1a34fad76b34        "bash"                   10 days ago         Exited (0) 10 days ago                              sad_heisenberg
c491683d1d18        1a34fad76b34        "bash"                   10 days ago         Exited (0) 10 days ago                              trusting_mestorf
ed4225d47dd5        1a34fad76b34        "bash"                   10 days ago         Exited (0) 10 days ago                              angry_boyd
9f813dcb7cfe        c844795fa93c        "/bin/sh -c 'go ge..."   10 days ago         Exited (2) 10 days ago                              stupefied_brown
04b16547b6fc        mariadb:latest      "docker-entrypoint..."   3 weeks ago         Exited (0) 16 hours ago                             db

Из всего этого, я использую только контейнер с именем db, собранный из образа mariadb:latest. Все остальное, мои пробы создать контейнер с Golang приложением.

Вопросы следующего характера:
1. Как удалить все ненужные образы?
2. Сумма размером всех образов — это занятое место на диске под образы? Или если образ A (размером 6мб) использует образ Б (размером 500 мб), то образ А в списке будет с размером 506 мб, но фактически займет только 6 мб?
3. Если я собрал контейнер из образа, могу ли я удалить образ с диска?

Руководство по образам Docker: удаление образов, остановка контейнеров и удаление разделов

Перевод статьи «Docker Image Guide: How to Remove and Delete Docker Images, Stop Containers and Remove all Volumes».

Docker очень широко применяется в разработке программ. Это отличный инструмент для развертывания приложения в облаке (или в какой-нибудь еще Docker-ready инфраструктуре). Он также пригождается и в локальной разработке. С его помощью вы можете быстро запускать сложные приложения и разрабатывать их изолированно, причем с очень хорошей производительностью.

В этой статье я собрал список самых важных команд для эффективного использования Docker.

Вывод списка всех образов Docker

docker images

У меня есть три образа:

  • MySQL в версии 8.0.19 и MySQL в последней версии (с тегом latest),
  • а также Cassandra в последней версии.

(Прим. ред: терминологию можно посмотреть во вступительной статье по Docker).

Чтобы получить больше информации об образе, можно воспользоваться следующей командой:

docker inspect mysql:latest

В выводе команды мы получаем список сведений. Альтернативный вариант получения информации — при помощи ID образа:

docker inspect 3a5e53f63281

В выводе команды вы получите очень много всего, поэтому лучше сразу отфильтровать нужную информацию:

docker inspect --format='{{.RepoTags}}  {{.Config.Image}}' 3a5e53f63281

Удаление образов Docker

Удалить отдельный образ можно при помощи команды docker rm. Допустим, я хочу удалить образ MySQL:

docker rm mysql:latest

В моем случае еще остается образ с тегом mysql:8.0.19. Таким образом, для полного удаления мне нужно также удалить тег другой версии:

docker rm mysql:8.0.19

Если мы хотим удалить образ напрямую, проще это сделать по id:

docker image rm 3a5e53f63281 -f

Опция -f обеспечивает принудительное выполнение. Если ваш образ имеет больше одного тега, без этой опции вы получите ошибку.

Запуск образа Docker

Чтобы запустить образ, можно воспользоваться следующей командой:

docker run cassandra

Если такого образа у вас нет, он будет загружен. Остановить выполнение команды можно, нажав CTRL+C. Также можно запускать образ в фоне, для этого к команде нужно добавить опцию -d:

docker run -d mysql

Если контейнер запущен в фоне, вы получаете его ID.

По умолчанию контейнер запускается изолированно. То есть, вы не сможете никак коммуницировать с ним или сохранять какие-то файлы в своей текущей директории.

Проброс портов контейнера

При помощи опции -p можно перенаправить порты, например, на страницу, которая открывается из вашего контейнера:

docker run -p 8080:80 nginx

Контейнер NGINX предоставляет веб-сервер через порт 80. При помощи -p 8080:80 локальный порт 8080 перенаправляется на 80-й порт контейнера.

Как залогиниться в контейнере

Иногда возникает необходимость залогиниться в контейнере. Это возможно только в том случае, если в контейнере установлена оболочка. В противном случае вы получите ошибку.

Для начала, запустите отдельный контейнер и дайте ему имя:

docker run -d --name my_container nginx

Команда вернет ID контейнера. Теперь вы можете выполнить оболочку в контейнере и приложить к ней свои входные и выходные данные, используя опции -i и -t:

docker exec -it my_container bash

Вместо имени контейнера для всех дальнейших операций можно также использовать возвращенный ранее идентификатор.

Иногда bash бывает недоступен. Поэтому можно попробовать запустить базовую оболочку:

docker exec -it my_container sh

Вывод списка запущенных контейнеров

После запуска контейнера вы можете найти его в списке всех запущенных контейнеров, для этого воспользуйтесь следующей командой:

docker ps

Если добавить опцию -а, в списке появятся также контейнеры, завершившие исполнение:

docker ps -a

Расшаривание локальной папки, чтобы контейнер мог иметь к ней доступ

Иногда бывает полезным синхронизировать файлы между контейнером и локальной файловой системой. Это можно сделать, воспользовавшись при запуске контейнера опцией -v.

На Linux и macOS можно расшарить локальную временную папку следующим образом:

docker run --name=my_container -d -v $(pwd)/tmp:/var/log/nginx -p 8080:80 nginx

На Windows можно запустить:

docker run --name=my_container -d -v %cd%/tmp:/var/log/nginx -p 8080:80 nginx

Остановка запущенных контейнеров

Запущенный контейнер можно остановить при помощи следующей команды:

docker stop my_container

Остановка контейнера останавливает все процессы, но сохраняет изменения внутри файловой системы.

Запуск остановленного контейнера

Остановленный контейнер можно запустить следующим образом:

docker start my_container

Удаление контейнера

Чтобы удалить остановленный контейнер, выполните:

docker rm my_container

Чтобы остановить и удалить контейнер одной командой, можно добавить опцию -f.

docker rm -f my_container

Создание тома и расшаривание его между несколькими контейнерами

Создаем независимый том (volume) с именем SharedData:

docker volume create --name SharedData
docker run --name=my_container -d -v SharedData:/var/log/nginx -p 8080:80 nginx
docker run --name=my_container_2 -d -v SharedData:/var/log/nginx -p 8080:80 nginx

Теперь у обоих контейнеров будет общая папка, файлы в которой будут синхронизироваться с обоими контейнерами.

Удаление тома

Чтобы удалить том, нужно сначала удалить все контейнеры, использующие его.

docker rm -f my_container
docker rm -f my_container_2
docker volume rm SharedData

Удаление остановленных контейнеров и неиспользуемых образов

Безопасная команда очистки:

docker system prune -a

Удаление всех томов, которые не используются

Все отсоединенные тома можно удалить при помощи следующей команды:

docker system prune

Заключение

Создание контейнеров, вход в них, проброс портов и расшаривание папок это самые важные задачи, осуществляемые при помощи интерфейса командной строки Docker. Выполняемые при этом команды составляют основу таких систем как Kubernetes и позволяют нам создавать и запускать приложения изолированно.

Запись Руководство по образам Docker: удаление образов, остановка контейнеров и удаление разделов впервые появилась Techrocks.

Как удалить все Docker образы и контейнеры @ 900913 — Цифровое наше всё

Не все Docker-образы одинаково полезны. Они занимают место на диске, найти их на файловой системе не так то просто. К тому же, Docker имеет свои команды для управления образами – так что лучше не лезть самому на файловую систему, а довериться ему – вдруг у него сохранится кеш, или какая-то иная мета-информация, которая будет только путать и его, и вас.

Если кратко, то ответом на поставленный вопрос может служить данный скрипт:

#!/bin/bash
# Stop all containers
docker stop $(docker ps -a -q)
# Delete all containers
docker rm $(docker ps -a -q)
# Delete all images
docker rmi $(docker images -q)

Но давайте не будем на этом останавливаться и рассмотрим подробнее, что здесь происходит!

Получить список имён всех имеющихся Docker-контейнеров

Для начала, команда docker ps, которая используется в каждой инструкции – выводит список всех контейнеров. Однако, эта команда по умолчанию выводит только запущенные контейнеры. Чтобы вывести все, используем ключ -a.

Сам же список выводится довольно подробно, в виде таблицы, которую удобно смотреть человеку. Но нам то нужно не удобство, а просто список имён контейнеров. Как раз для этого мы используем ключ -q – от «quiet» (тихо).

Таким образом, чтобы получить просто список имён всех имеющихся в системе Docker-контейнеров, используется команда:

docker ps -a -q

Непосредственно удаление контейнеров и образов

Сначала нужно остановить запущенные контейнеры – Docker не позволяет удалить контейнер, пока он запущен:

docker stop $(docker ps -a -q)

– и пусть вас не смущает, что мы просим остановить уже остановленные контейнеры: вот к этому Docker безразличен. Ты попросил меня остановить то, что и так остановлено? Замечательно! – Значит ничего не надо делать!

Теперь мы можем удалить все контейнеры командой docker rm:

docker rm $(docker ps -a -q)

И всё для того, чтобы иметь возможность удалить непосредственно образ. Как вы могли догадаться, удалить образ без удаления всех контейнеров, которые его используют, нельзя.

docker rmi $(docker images -q)

Вот такой вот аналог смерти кащеевой! А что вы хотели? – Контейнеры…

Политика автоматического удаления Docker-образов | Yandex.Cloud

Политика удаления Docker-образов позволяет задать правила, в соответствии с которыми Docker-образы будут удаляться автоматически.

Задать политику удаления можно только для каждого отдельного репозитория. Политика применяется только к Docker-образам, имя которых в точности совпадает с именем репозитория. Совпадение по префиксу (вложенные репозитории) не поддерживается. Нельзя задать политику для группы репозиториев, реестра, каталога или облака.

Статусы политики удаления

Примечание

Политика по умолчанию создается в статусе DISABLED.

Политика удаления может находится в следующих статусах:

  • ACTIVE — политика активна и регулярно удаляет Docker-образы по установленным правилам.
  • DISABLED — политика выключена и не удаляет Docker-образы в репозитории. Политики в этом статусе можно использовать для подготовки и тестирования правил.

У репозитория может быть только одна активная политика и несколько выключенных. Активную политику можно выключить в любой момент.

Как для активной, так и для выключенной политики можно делать тестовые (dry-run) запуски, чтобы проверить, какие Docker-образы будут удалены в соответствии с правилами.

Правила политики удаления

Для удаления Docker-образы сначала фильтруются по тегам, а затем проверяются на соответствие условиям.

Важно

Необходимо указать хотя бы один фильтр по тегу и задать хотя бы одно условие удаления.

Чтобы сконфигурировать политику удаления, задайте следующие параметры:

  1. Фильтрация Docker-образа по тегам:
    • tag_regexp — флаг для указания фильтра в виде регулярного выражения.

      Использование регулярного выражения .* для tag_regexp означает все образы с тегами. Для того, чтобы правило распространялось на образы без тегов, надо явно выставлять флаг untagged.

    • untagged — флаг для применения правила к Docker-образам без тегов.

  2. Условия для удаления Docker-образов:
    • expire_period — период времени, который должен пройти с момента создания Docker-образа, чтобы он подходил для автоматического удаления. Период должен быть кратен 24 часам.
    • retained_top — количество Docker-образов (подпадающих под заданный фильтр по тегам), которое необходимо оставить, даже если expire_period уже истек.

Разрешение конфликтов правил

  • Если Docker-образ, отфильтрованный по тегу, подпадает только под одно правило для удаления, то он удаляется в соответствии с настройками этого правила.
  • Если Docker-образ, отфильтрованный по тегу, подпадает под несколько конфликтующих правил, он будет удален, только если этого требуют все правила. Если есть хотя бы одно правило, согласно которому Docker-образ не должен быть удален — он останется.

Docker удалить образы тегов

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Загрузка…

.

Как удалить образы, контейнеры, сети и тома Docker {2020}

Контейнеры Docker предназначены для обеспечения самодостаточной среды со всеми библиотеками и конфигурациями, необходимыми для работы программного обеспечения. Во время разработки они могут расти в неорганизованном виде со старыми, устаревшими и неиспользуемыми компонентами.

В этом руководстве вы узнаете, как организовать среду Docker путем удаления образов Docker, контейнеров, томов и сетей.

Использование этих команд делает управление контейнерами Docker быстрым и простым.

  • Система Linux под управлением Docker
  • Доступ к терминалу / командной строке ( Ctrl + Alt + T в Ubuntu, Alt + F2 в CentOS)
  • Учетная запись пользователя с sudo привилегиями

Примечание: Если ваша система отвечает « доступ запрещен » после попытки удаления, добавьте префикс sudo в начале команды.

Как удалить контейнеры Docker

Контейнер создает определенную среду, в которой может выполняться процесс.Многие контейнеры создаются, тестируются и забрасываются в течение жизненного цикла разработки.

Поэтому важно знать, как найти ненужные емкости и удалить их.

1. Сначала перечислите все контейнеры Docker с помощью команды:

  док-контейнер ls -a  

На выходе отображается список всех запущенных контейнеров, их идентификаторы, имена, изображения, статус и другие параметры.

Вы также можете сгенерировать список всех контейнеров только по их числовому идентификатору, выполните команду:

  док-контейнер ls –aq  

2.Чтобы остановить конкретный контейнер , введите следующее:

  остановка док-контейнера [container_id]  

Замените [container_id] числовым идентификатором контейнера из вашего списка.

В одной команде можно ввести несколько идентификаторов контейнеров.

Чтобы остановить все контейнеры , введите:

  docker container stop $ (докер-контейнер ls –aq)  

Это заставляет Docker использовать список всех идентификаторов контейнеров в качестве цели команды stop .

Примечание: Если вы вошли в систему как пользователь sudo , обязательно добавьте префикс sudo перед обеими командами docker при остановке всех контейнеров ( sudo docker container stop $ (sudo док-контейнер ls –aq ))

Удалить остановленный контейнер

Чтобы удалить остановленный контейнер , используйте команду:

  док-контейнер rm [container_id]  

Как и раньше, удаляется контейнер с указанным вами идентификатором.

Удалить все остановленные контейнеры

По удалить все остановленные контейнеры :

  док-контейнер rm $ (док-контейнер ls –aq)  

Удалить все контейнеры Docker

Чтобы очистить Docker и начать с нуля, введите команду:

  docker container stop $ (docker container ls –aq) && docker system prune –af ––volumes  

Это указывает Docker на остановку контейнеров, перечисленных в круглых скобках.

Внутри круглых скобок вы указываете Docker создать список всех контейнеров с их числовыми идентификаторами. Затем информация передается обратно в команду container stop и останавливает все контейнеры.

Атрибут && указывает Docker на удаление всех остановленных контейнеров и томов.

–af указывает, что это должно применяться ко всем контейнерам ( и ) без необходимого подтверждения ( f ).

Удаление контейнера с помощью фильтров

Вы также можете указать удаление всех объектов, не соответствующих указанной метке.

Для этого используйте команду:

  docker container prune ––filter = ”label! = Maintainer = Jeremy”  

Эта команда сообщает Docker удалить все контейнеры , которые не помечены сопровождающим как « Джереми ». Команда ! = представляет собой логическую запись, означающую « не равно .”

Разбивка метки команд:

  • label = <ключ>
  • label = <ключ> = <значение>
  • этикетка! = <Ключ>
  • метка! = <Ключ> = <значение>

Использование этих терминов в сочетании с ярлыками дает вам полный контроль над удалением ресурсов в Docker.

Как удалить образы Docker

Образы Docker — это файлы, которые включают несколько уровней, используемых для запуска кода в контейнере.

В процессе разработки изображения могут проходить множество итераций. Старые и устаревшие изображения могут загромождать вашу систему, занимать место для хранения и затруднять поиск.

1. Чтобы удалить образ Docker , начните с перечисления всех образов в вашей системе:

  образ докера ls  

В выходных данных отображаются локально доступные образы Docker, как показано ниже.

2. Запишите IMAGE ID — это идентификатор, используемый для удаления изображения.

3. Затем удалите ненужные изображения:

  образ докера rm [image_id1] [image_id2]  

Замените [image_id1] и [image_id2] идентификатором изображения, полученным с помощью первой команды. Вы можете ввести один идентификатор изображения или несколько идентификаторов для удаления.

Система может ответить на ваш запрос сообщением об ошибке, что существует конфликт, и она не может удалить ссылку на репозиторий. Это указывает на то, что контейнер использует изображение.Перед удалением изображения необходимо сначала удалить контейнер.

.

Удалите все образы и контейнеры — TechOverflow

Этот пост также доступен на: Deutsch (немецкий)

Проблема:

Вы используете Docker, но при работе с ним было создано множество образов и контейнеров. Вы хотите удалить их все, чтобы сэкономить место на диске.

Решение:

Предупреждение : Этот уничтожит все ваших изображений и контейнеров. Восстановить их нет возможности!

Выполните эти команды в оболочке:

 docker rm $ (docker ps -a -q)
docker rmi $ (docker images -q) 

Это решение было предложено пользователем GitHub @crosbymichael в этом выпуске

Если вы хотите удалить даже те изображения, на которые есть ссылки в репозиториях, используйте

 docker rmi $ (docker images -q) --force 

Справочная информация:

Вы можете увидеть контейнеры на своем компьютере, используя

 docker container ls 

Пример вывода:

 КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ КОМАНДА ИЗОБРАЖЕНИЯ СОЗДАЕТСЯ СТАТУС ИМЕНА ПОРТОВ
3477a4dcdce2 докер.elastic.co/elasticsearch/elasticsearch-oss:6.7.1 "/ usr / local / bin / dock…" 2 дня назад Up 2 дня 0.0.0.0:9200->9200/tcp, 9300 / tcp elasticsearch2
67997f002f15 appbaseio / dejavu "http-server '-p 135…" 2 дня назад Вверх 2 дня 0.0.0.0:1358->1358/tcp dejavu
 

Как мы видим, сейчас на этом компьютере работают два контейнера.

Для каждого контейнера столбец IMAGE показывает нам, какое изображение выполняется в контейнере.Например, второй контейнер работает на образе appbaseio / dejavu .

Когда мы говорим докеру показать нам все изображения, которые в данный момент находятся на компьютере:

 $ docker image ls -a
РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ СОЗДАННЫЙ РАЗМЕР
<нет> <нет> 39ac507bd271 11 дней назад 962 МБ
<нет> <нет> 6a2c829a5d4f 11 дней назад 962 МБ
докер.elastic.co/elasticsearch/elasticsearch-oss 6.7.1 c91b419ac445 3 недели назад 682MB
pypy 3 75e018538e96 4 недели назад 962MB
node 10 64c810caf95a 4 недели назад 899MB
appbaseio / dejavu последнее 47b8375dc541 2 месяца назад 141MB
восходящий столб / альпийский 3.4-v4.4.4-3.6.1 2d384efd00ab 2 года назад 247MB
 

Сразу видно, что образов гораздо больше, чем контейнеров.

Для этого есть четыре основные причины:

  • Docker сохраняет старые версии контейнеров, они не удаляются автоматически. В этом примере есть две версии docker.elastic.co/elasticsearch/elasticsearch-oss : версия 6.7.1 и версия 7.0.0 , хотя в настоящее время я использую только версию 6.7.1 . Согласно списку, версия 7.0.0 занимает дополнительные 682 мегабайта на моем SSD, но обратите внимание, что это число может быть неточным (см. многоуровневых изображений ниже)
  • Docker не удаляет автоматически образы, которые вы не более длительное использование (например, если вы использовали образ только для быстрой проверки, но больше не используете его)
  • Docker использует многоуровневых образов . Это означает, что такой образ, как appbaseio / dejavu , не является автономным, а (обычно) основан на некотором базовом образе, таком как ubuntu или debian .В большинстве случаев изображение состоит из нескольких слоев (обычно около 5-10) из-за способа их построения. Хотя это приводит к использованию меньшего дискового пространства, поскольку некоторые изображения используются несколькими «дочерними» образами, это по-прежнему приводит к тому, что на вашем диске остается много изображений, часто включая неиспользуемые промежуточные образы.
  • В случае, если вы сами создаете образы докеров, особенно если вы создаете свой собственный файл Docker, во время разработки часто создается много образов (представляющих промежуточные версии разрабатываемого вами программного обеспечения)

Для удаления образа, который вам больше не нужно, используйте команду docker image rm .Скопируйте идентификатор изображения из столбца IMAGE ID вывода docker image ls , как показано выше.

Например, чтобы удалить образ elasticsearch версии 7.0.0 , используйте

 $ docker image rm 0e92b9e5fe1e
Без тегов: docker.elastic.co/elasticsearch/elasticsearch-oss:7.0.0
Без тегов: docker.elastic.co/elasticsearch/[email protected]:e9ab1f4c2ffbc7054dab91e8dc7fd9a56d53cce734098910d876eb14849b1ba3
Удалено: sha256: 0e92b9e5fe1e0949f5174ed86d9cbc3c2a041df493453f82b6c044ff78c7d17b
Удалено: sha256: c2a552806b86aba72a6e6ea5efaaa295286e8b0cf42a14d799428e58f20e7090
Удалено: sha256: 71e7a706f7c03f0c7add24844f7b311edf83838ef383a877bcb94684b011893d
Удалено: sha256: d43e5d351c26273e43b11f6937cb9a3192d856b4e083acfbc14b8500056221f2
Удалено: sha256: f3a2ae77ca96f2f55300b00beedbf14ade0a27bf29c395dcbf84b5bf02ef80ad
Удалено: sha256: 5d7f2d83e59c0684b4a94ab5f6479d798444bdca8fe6c813f7ef6188cdd12ce5
Удалено: sha256: cc16decd0c6f218c3a21749e747d43deced9e8929e8db0b6050dd4102301651a
 

Как видно из выходных данных, при этом будет удалено не только само изображение ElasticSearch 0e92b9e5fe1e , но и все другие изображения, от которых зависит изображение (которые также не используются никакими другими изображениями).

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Theme: Overlay by Kaira Extra Text
Cape Town, South Africa