Несколько контейнеров Docker, тот же образ, другая конфигурация
Я совершенно новичок в Docker, поэтому я ценю ваше терпение.
Я ищу способ развернуть несколько контейнеров с одним и тем же изображением, однако мне нужно передать в другой конфигурации (файл) каждому?
прямо сейчас, я понимаю, что как только вы создаете образ, это то, что развертывается, но проблема для меня в том, что я не вижу смысла в создании нескольких изображений одного и того же приложения, когда это только конфигурация, которая отличается между стеклотара.
Если это норма, то мне придется иметь дело с этим, однако, если есть другой способ, пожалуйста, избавьте меня от моих страданий! :)
спасибо!
3 ответов
Я думаю, глядя на примеры, которые легко понять, может дать вам лучшую картину.
то, что вы хотите сделать, совершенно верно, изображение должно быть все, что вам нужно запустить, без конфигурации.
чтобы создать конфигурацию, вы либо:
a) объем крепления
используйте Тома и монтируйте файл во время запуска контейнера docker run -v my.ini:/etc/mysql/my.ini percona
(и подобные с docker-compose
).
Помните, вы можете повторять это так часто, как вам нравится, поэтому смонтируйте несколько конфигураций в свой контейнер (таким образом, runtime-версия изображения).
Вы создадите эти конфигурации на хосте перед запуском контейнера и должны отправить эти файлы с контейнером, что является недостатком этого подхода (переносимость)
b) конфигурация на основе точки входа (поколение)
большинство расширенных изображений docker предоставляют сложную так называемую точку входа, которая потребляет переменные ENV, которые вы передаете при запуске изображение, чтобы создать конфигурацию(ы) для вас, например https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh
поэтому, когда вы запускаете это изображение, вы можете сделать docker run -e MYSQL_DATABASE=myapp percona
и это запустит percona и создаст базу данных percona для вас.
Все это делается
- добавление скрипта точки входа здесь https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L65
- не забудьте скопируйте скрипт в образ сборки https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L63
- затем во время запуска изображения ваша переменная ENV вызовет это:https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh#L91
конечно, вы можете делать с этим все, что захотите. Например, это настраивает общий образ portus: https://github.com/EugenMayer/docker-rancher-extra-catalogs/blob/master/templates/registry-slim/11/docker-compose.yml который имеет этот entrypoint https://github.com/EugenMayer/docker-image-portus/blob/master/build/startup.sh
Итак, вы видите, что стратегия точки входа очень распространена и очень сильна, и я бы предположил, что вы пойдете по этому маршруту, когда сможете.
c) производные изображения
возможно для "завершенности" , image-производная стратегия, поэтому у вас есть базовый образ под названием "myapp" и для установки X вы создаете новый образ
from myapp
COPY my.ini /etc/mysql/my.ini
COPY application.yml /var/app/config/application.yml
и назовите это изображение myapp: x - очевидная проблема заключается в том, что у вас в конечном итоге много изображений, с другой стороны, по сравнению с a) его гораздо более портативным.
надеюсь, что это поможет
просто запустите из того же изображения столько раз, сколько необходимо. Будут созданы новые контейнеры, которые затем могут быть запущены и остановлены каждый из них, сохраняя свою собственную конфигурацию. Для вашего удобства было бы лучше дать каждому из ваших контейнеров имя с "--name".
F. i:
docker run --name MyContainer1 <same image id>
docker run --name MyContainer2 <same image id>
docker run --name MyContainer3 <same image id>
вот именно.
$ docker ps
CONTAINER ID IMAGE CREATED STATUS NAMES
a7e789711e62 67759a80360c 12 hours ago Up 2 minutes MyContainer1
87ae9c5c3f84 67759a80360c 12 hours ago Up About a minute MyContainer2
c1524520d864 67759a80360c 12 hours ago Up About a minute MyContainer3
после этого у вас есть ваши контейнеры, созданные навсегда, вы можете запускать и останавливать их, как VMs.
docker start MyContainer1
каждый контейнер работает с тем же образом RO, но с определенным слоем файловой системы контейнера RW. В результате каждый контейнер может иметь свои собственные файлы, которые отличаются от любой другой контейнер.
вы можете передать конфигурацию на CLI, как переменную среды или как уникальное крепление Тома. Это очень стандартный вариант использования для Docker.