自动启动docker容器的链接依赖项

自动启动docker容器的链接依赖项

我跑docker 容器中的 gitlab并且它很好地将其依赖项(MySQL、Redis、Mailserver)分离到单独的 docker 容器中。运行它们不是问题,我以相反的顺序启动它们:先启动依赖项,然后启动 gitlab 本身。

有时我必须重新启动 docker 主机。目前,我通过 ssh 进入 docker 主机并手动重新启动容器。有没有更好的方法?比如只告诉某个服务启动 gitlab 容器,它会先启动它的依赖项?我知道我可以为每个 docker 容器创建单独的初始化脚本,但这不是我想要的。

答案1

你甚至可能想看看“官方”如图项目,现已被取代Docker 组成. 配置/设置应该相当容易。

运行 gitlab 的用例与图 - Wordpress 示例或使用gitlab-compose 脚本

如果你在 Mac 上工作,你可能需要看看Docker 工具箱其中包括 Compose,还有各种其他可快速启动和运行的工具!

答案2

我觉得你可以看看地板

你也可以像 CoreOS 一样管理依赖项。通过Unit为你的主gitlab容器编写一个文件,如下所示:

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

MySQL 容器、Redis 容器等的文件mysql.serice在哪里?Unitredis.service

答案3

如果有人觉得这有用,我写了一个fishshell 脚本(应该很容易移植到bash),用来docker inspect启动我容器的所有依赖项。以下是代码,使用杰奇解析 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
    end
end

# Returns all docker containers in the current directory, including their dependencies
function 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
    end
end

# Take all docker containers and dependencies, filter out duplicates without changing the order (the awk command), then start the containers in that order
all_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 expose
function 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
    end
end

它不只是启动容器,还会查找容器公开的端口,并测试是否可以连接到这些端口。如果您有数据库容器之类的东西,这很有用,因为它在启动时可能会执行清理,因此需要一些时间才能在网络上实际可用。像这样使用它:

start_and_wait {{container_name}}

或者,如果您使用上述脚本,请将最后一行替换为:

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

最后一行将确保所有容器仅在其依赖项完成后启动,同时等待依赖项实际完成启动。请注意,这可能并不适用于每个设置,因为某些服务器可能会立即打开其端口,而实际上尚未准备好(虽然我不知道有哪个服务器实际上会这样做,但这是 docker 开发人员在询问此类功能时给出的原因)。

相关内容