Автоматический запуск связанных зависимостей контейнера docker

Я бегу gitlab в контейнере docker и он довольно красиво разделяет свои зависимости (MySQL, Redis, Mailserver) на отдельные контейнеры docker. Запустить их не проблема, я запускаю их в обратном порядке: сначала зависимости, а затем сам gitlab.

Время от времени мне приходится перезапускать хост docker. В настоящее время я подключаюсь по ssh к хосту docker и вручную перезапускаю контейнеры. Есть ли для этого лучший способ? Например, просто скажите какой-нибудь службе запустить контейнер gitlab, и она сначала позаботится о запуске своих зависимостей? Я знаю, что могу создавать отдельные сценарии инициализации для каждого контейнера docker, но это не то, что я ищу.

Возможно, вы даже захотите заглянуть в "официальный" Инжир проект, который теперь был заменен на Компоновщик Docker Compose. Его должно быть довольно легко настроить / настроить.

Ваш вариант использования запуска gitlab в основном такой же, как и Рис. - Пример Wordpress или с помощью gitlab-создать скрипт

И если вы работаете на компьютере Mac, возможно, вам захочется взглянуть на Панель инструментов Docker toolbox который включает в себя Compose, а также различные другие инструменты для быстрого запуска и запуска!

Я думаю, вы можете посмотреть на Настил

Кроме того, вы можете управлять зависимостями так, как это делает CoreOS. Написав Unit файл для вашего основного gitlab контейнер, подобный:

[Unit]...Requires=docker.serviceRequires=redis.serviceRequires=mysql.service...[Service]TimeoutStartSec=0ExecStartPre=-/usr/bin/docker kill gitlabExecStartPre=-/usr/bin/docker rm gitlabExecStart=/usr/bin/docker run --name gitlab gitlabExecStop=/usr/bin/docker stop gitlab

Где mysql.serice является Unit файл для контейнера MySQL, redis.service один из них Redis и т. Д.

На случай, если кто-нибудь сочтет это полезным, я написал fish сценарий оболочки (должен быть легко переносимым на bash) с использованием docker inspect чтобы запустить все зависимости моих контейнеров. Вот код, использующий jq для анализа json:

#!/usr/local/bin/fish# Start all containers# Returns all the dependencies of the input + the input, eg. [dep1, dep2, input]function docker_links_lookup    set result (docker inspect $argv[1] | jq ".[0].HostConfig.Links" | pcregrep -o1 "\"/(.*):.*\"")    for x in $result         docker_links_lookup $x        echo $x    endend# Returns all docker containers in the current directory, including their dependenciesfunction all_docker_containers     for dir in */        if test -f "$dir/Dockerfile"            set container_name (echo $dir | sed "s/\///") #remove trailing /            docker_links_lookup $container_name            echo "$container_name"        end    endend# Take all docker containers and dependencies, filter out duplicates without changing the order (the awk command), then start the containers in that orderall_docker_containers | awk '!seen[$0]++' | xargs docker start

Обратите внимание, что этот код предполагает, что в текущем каталоге есть подкаталоги, соответствующие контейнеру docker с тем же именем. Он также не имеет дела с циклическими зависимостями (я не знаю, имеет ли это какой-либо из других инструментов), но он также был написан менее чем за полчаса. Если у вас есть только один контейнер, вы просто используете docker_links_lookup функция, подобная этой:

docker_links_lookup {{container_name}} | awk '!seen[$0]++' | xargs docker start

Редактировать:

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

# This starts the docker containers that are passed in, and waits on the ports they exposefunction start_and_wait    for container in $argv        set ports (docker inspect $container | jq ".[0].Config.ExposedPorts | keys" 2>/dev/null | egrep -o "[0-9]+" | xargs)        docker start $container        docker run -e PORTS="$ports" --link $container:wait_for_this n3llyb0y/wait > /dev/null    endend

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

start_and_wait {{container_name}}

Или, если вы используете приведенный выше сценарий, замените последнюю строку на эту:

start_and_wait (all_docker_containers | awk '!seen[$0]++' | xargs -n 1)

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