В этом блоге я объясню шаги, необходимые для запуска Docker в Docker, используя два разных метода.
Вопрос под управлением докера в контейнере Docker часто встречается при использовании инструментов CI/CD, таких как женкинс.
В Jenkins все команды на этапах вашего трубопровода выполняются на том, что вы указываете. Этот агент может быть контейнером докера. Итак, если одна из ваших команд, например, на этапе сборки, является командой Docker (например, для создания изображения), то у вас есть случай, когда вам нужно запустить команду Docker в контейнере Docker.
Кроме того, сама Дженкинс может быть запущен как контейнер докера. Если вы используете Docker Agent, вы запустите этот контейнер докера из контейнера Jenkins Docker. Если у вас также есть команды Docker в вашем трубопроводе Jenkins, у вас будет три уровня вложенных «докеров».
Однако с приведенным выше подходом все эти докеры используют один и тот же демон докера, и все трудности нескольких демонов (в этом случае три) в той же системе, которые в противном случае произошли, обойдены.
Есть 2 способа достижения докера в докере.
1) запустить докер, установив Docker.Sock (метод DOOD) 2) DIND метод
Что такое/var/run/docker.sock?
/var/run/docker.sock — это сокет Unix по умолчанию. Розетки предназначены для связи между процессами на том же хосте. Docker Daemon по умолчанию слушает docker.sock. Если вы находитесь на одном хозяине, где работает Docker Daemon, вы можете использовать/var/run/docker.sock для управления контейнерами. Это рекомендуется способ использовать Docker внутри контейнера докеров, с которым два экземпляра докеров не зависят друг от друга, но обходит много технических проблем с низкой уровнями.
С помощью этого подхода контейнер с установленным Docker, не запускает свой собственный документ Docker, но подключается к демону Docker о хост-системе. Это означает, что у вас будет Docker CLI в контейнере, а также на хост-системе, но они оба соединяются с одним и тем же демоном докера. В любое время в вашей машине работает только один демон докера, один работает на хост-системе. Для достижения этого вы можете запустить контейнер докера, который установлен Docker. Например, вы можете использовать Docker Image, который представляет собой Docker Image, который установлен Docker, и начнет так: запустить Docker с разъемом Unix по умолчанию Docker.sock в качестве тома.
docker run -ti -v /var/run/docker.sock:/var/run/docker.sock docker
Здесь мы запускаем Docker с Docker docker docker.sock в качестве объема. А затем внутри контейнера Docker, который вы только что начали, запустите несколько команд Docker, например:
docker pull ubuntu
Аналогичным образом, я потянул еще несколько изображений, после выполнения следующей команды:
docker images
Соблюдайте вывод. Выход точно такой же, как при запуске этих команд на хост-системе. Похоже, что установка Docker контейнера, которую вы только что начали, и что вы, возможно, ожидаете, что будут свежими и нетронутыми, уже есть некоторые изображения, кэшированные и некоторые контейнеры. Это потому, что мы подключались к Docker CLI в контейнере, чтобы поговорить с демоном докера, который уже работает на хост-системе.
Это означает, что если вы вытяните изображение внутри контейнера, это изображение также будет видно на хост-системе (и наоборот). И если вы запускаете контейнер внутри контейнера, этот контейнер на самом деле будет «сестра» для всех контейнеров, работающих на хост-машине (включая контейнер, в котором вы бежите Docker).
Смотрите изображение ниже.
На следующем изображении вы можете увидеть контейнер запущен.
Этот метод фактически создает детский контейнер внутри контейнера. Если вы действительно хотите, вы можете использовать «REAL» Docker в Docker, который вложенными экземплярами Docker, которые полностью инкапсулированы друг от друга. Вы можете сделать это с тегом DIND (Docker в Docker) Docker Image следующим образом:
docker run --privileged -d --name dind-test docker:dind
Теперь войдите в контейнер, используя EXEC.
docker exec -it dind-test /bin/sh
Здесь я вытащил изображение Ubuntu, которое можно увидеть в следующем изображении Здесь я запустил еще один контейнер внутри бегового контейнера. Здесь я могу запустить определенные команды Ubuntu. Здесь я обновил систему управления пакетом Ubuntu.
Бег Docker в Docker, используя Docker.Sock и Diind Method — это менее безопасны, поскольку он имеет полные привилегии над демоном докера.
Оригинал: «https://dev.to/piyushbagani15/how-to-run-docker-inside-docker-2en7»