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


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

пятница, 29 января 2021 г.

Запускаем Docker в Docker

У меня появилась такая задача. Основное приложение codenjoy состоит из компонентов. Каждый компонент-процесс на хостовой машине завернут в Docker. Всеми контейнерами управляет DockerСompose. Один из компонентов - nginx является фасадом, выглядывает наружу, перенаправляя все запросы внутри виртуальной сети созданной DockerCompose.

На сцене появляется новый компонент-процесс, который запускает другие процессы внутри своего Docker управляя им. А раз уж оно само завенрнуто в Docker, то отсюда вывод google('ho to run docker inside docker'). 

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

/var/run/docker.sock:/var/run/docker.sock:rw

Сделать это можно либо через ключик -v в команде docker run, либо в блоке volumes docker-compose.yml файла.

docker run -v /var/run/docker.sock:/var/run/docker.sock -ti ubuntu bash 
curl -sSL https://get.docker.com/ | sh
docker ps

Сам же Dockerfile для запуска из под docker-compose.yml у меня такой

FROM java-workspace as dockerized-java-workspace

USER root
ENV DEBIAN_FRONTEND noninteractive

RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - \
&& apt-key fingerprint 0EBFCD88 \
&& apt-get -y install software-properties-common \
&& add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(dpkg --status tzdata|grep Provides|cut -f2 -d'-') stable" \
&& apt-get -y update \
&& apt-get -y install docker-ce \
&& docker -v

Тут java-workspace наследуется в конечном счете от openjdk:11-jdk, т.к. мне нужна еще java на борту.

Детально можно глянуть в этом коммите.