为更多并行运行/启动容器配置docker和docker compose

为更多并行运行/启动容器配置docker和docker compose,docker,docker-compose,Docker,Docker Compose,TL;医生: 当启动总共12个容器(分布在四个docker compose应用程序(每个应用程序定义了三个服务)时,无论下面的硬件有多强大,都会发生此错误: UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60) 是否存在限制或改进docker引擎并行运行/启动或docker套接字读取性能的配置 提高读取超时(就像许多论坛上建议的那样)似乎不是解决这个问题的正确方法 长版本:

TL;医生: 当启动总共12个容器(分布在四个docker compose应用程序(每个应用程序定义了三个服务)时,无论下面的硬件有多强大,都会发生此错误:

UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
是否存在限制或改进docker引擎并行运行/启动或docker套接字读取性能的配置

提高读取超时(就像许多论坛上建议的那样)似乎不是解决这个问题的正确方法

长版本:

我正在使用docker compose启动我的主题应用程序进行集成测试

在此集成测试过程中,每个客户机都会启动并使用其个性化的测试文件进行测试

docker compose文件由三个服务组成:

  • PHP
  • MySQL
  • Neo4j
所有图像都只是预填充的公共图书馆docker图像

由于应用程序启动需要相当长的时间(因为数据库启动需要很长的时间),因此我将该过程并行化,以便三个应用程序可以并行运行

启动过程的简化示例如下所示:

#!/bin/bash -e
clients=("a" "b" "c" "d" "e")
declare -A pids
pids=()
for client in "${clients[@]}"; do
    joblist=($(jobs -p))
    while
        ((${#joblist[*]} >= 3))
    do
        sleep 1
        joblist=($(jobs -p))
    done
    {
        docker-compose -f $client/docker-compose.yml up -d
        #wait for mysql
        while ! docker-compose -f $client/docker-compose.yml exec -T mysql isAlive.sh; do
            sleep 1
        done
        #wait for neo4j
        while ! docker-compose -f $client/docker-compose.yml exec -T neo4j isAlive.sh; do
            sleep 1
        done
        #run tests
        for i in $client/tests/*.yml; do
            if ! runTest $i; then
                exit 1
            fi
        done
    } &
    pids["$client"]="$!"
done
for p in "${!pids[@]}"; do
    if ! wait "${pids[$p]}"; then
        echo "error with $p"
        exit 1
    fi
done
当在虚拟机(6个虚拟CPU、专用SSD存储和48 GB RAM)中运行这些测试时,三个测试的并行化非常健壮。上面的所有内容都开始返回如下错误

UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
我认为这与虚拟机的性能有关, 现在我升级到一台裸机(2x 8核CPU@超过3GHz/核,60 GB RAM,SSD存储),尽管所有组件(CPU、RAM、存储网络[我自己和我的主机检查过])的利用率都很低,但这个问题仍然存在


提高读取超时似乎不是正确的解决方案,因为在利用服务器提供的全部性能时存在一些错误。这可能是一些docker配置或限制,我找不到任何与此相关的信息。

这看起来像是docker守护程序本身正在备份。等待服务准备就绪的
一些代码有什么作用?如果它做了类似于docker ps的事情,在一个紧密的循环中,我可以看到最终会遇到这样的问题。@DavidMaze我扩展了代码示例以涵盖您的问题。为什么即使底层的裸机系统功能强大得多,你也能看到这样的问题?除了重写代码以不使用docker命令之外,还有什么方法可以防止这种情况发生?这看起来就像docker守护进程本身正在备份一样。等待服务准备就绪的
一些代码有什么作用?如果它做了类似于docker ps的事情,在一个紧密的循环中,我可以看到最终会遇到这样的问题。@DavidMaze我扩展了代码示例以涵盖您的问题。为什么即使底层的裸机系统功能强大得多,你也能看到这样的问题?除了重写代码以不使用docker命令外,还有什么方法可以防止这种情况发生?