Запуск Hyperledger Composer на нескольких хостах

Я работаю с сетью Hyperledger Fabric, развернутой над роем докеров с двумя образами VirtualBox Ubuntu. Сеть полностью функциональна, все одноранговые узлы присоединились к каналу и обновили узловые узлы. Я следую руководству Composer с несколькими хостами: https://hyperledger.github.io/composer/latest/tutorials/deploy-to-fabric-multi-org

Настройка сети:

Host1: Orderer, Peer1.Org1, Peer2.Org1, CLI

Host2: Peer1.Org2, Peer2.Org2

connectionProfileManager.json - это мое соединение json для организации Manager.

{
    "name": "example-network",
    "x-type": "hlfv1",
    "version": "1.0.0",
    "channels": {
        "mychannel": {
            "orderers": [
                "orderer.example.com"
            ],
            "peers": {
                "peer0.manager.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true
                },
                "peer1.manager.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true
                },
                "peer0.sponsor.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true
                },
                "peer1.sponsor.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true
                }
            }
        }
    },
    "organizations": {
        "Manager": {
            "mspid": "ManagerMSP",
            "peers": [
                "peer0.manager.example.com",
                "peer1.manager.example.com"
            ],
            "certificateAuthorities": [
                "ca.manager.example.com"
            ]
        },
        "Sponsor": {
            "mspid": "SponsorMSP",
            "peers": [
                "peer0.sponsor.example.com",
                "peer1.sponsor.example.com"
            ],
            "certificateAuthorities": [
                "ca.sponsor.example.com"
            ]
        }
    },
    "orderers": {
        "orderer.example.com": {
            "url": "grpcs://localhost:7050",
            "grpcOptions": {
                "ssl-target-name-override": "orderer.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORDERER_CA_CERT"
            }
        }
    },
    "peers": {
        "peer0.manager.example.com": {
            "url": "grpcs://localhost:7051",
            "eventUrl": "grpcs://localhost:7053",
            "grpcOptions": {
                "ssl-target-name-override": "peer0.manager.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_MANAGER_CA_CERT"
            }
        },
        "peer1.manager.example.com": {
            "url": "grpcs://localhost:8051",
            "eventUrl": "grpcs://localhost:8053",
            "grpcOptions": {
                "ssl-target-name-override": "peer1.manager.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_MANAGER_CA_CERT"
            }
        },
        "peer0.sponsor.example.com": {
            "url": "grpcs://10.0.2.5:9051",
            "eventUrl": "grpcs://10.0.2.5:9053",
            "grpcOptions": {
                "ssl-target-name-override": "peer0.sponsor.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_SPONSOR_CA_CERT"
            }
        },
        "peer1.sponsor.example.com": {
            "url": "grpcs://10.0.2.5:10051",
            "eventUrl": "grpcs://10.0.2.5:10053",
            "grpcOptions": {
                "ssl-target-name-override": "peer1.sponsor.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_SPONSOR_CA_CERT"
            }
        }
    },
    "certificateAuthorities": {
        "ca.manager.example.com": {
            "url": "https://localhost:7054",
            "caName": "ca-manager",
            "httpOptions": {
                "verify": false
            }
        },
        "ca.sponsor.example.com": {
            "url": "https://10.0.2.5:8054",
            "caName": "ca-sponsor",
            "httpOptions": {
                "verify": false
            }
        }
    }
}

connectionProfileSponsor.json - это мой json для подключения к спонсорской организации.

{
    "name": "example-network",
    "x-type": "hlfv1",
    "version": "1.0.0",
    "channels": {
        "mychannel": {
            "orderers": [
                "orderer.example.com"
            ],
            "peers": {
                "peer0.manager.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true
                },
                "peer1.manager.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true
                },
                "peer0.sponsor.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true
                },
                "peer1.sponsor.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "ledgerQuery": true,
                    "eventSource": true
                }
            }
        }
    },
    "organizations": {
        "Manager": {
            "mspid": "ManagerMSP",
            "peers": [
                "peer0.manager.example.com",
                "peer1.manager.example.com"
            ],
            "certificateAuthorities": [
                "ca.manager.example.com"
            ]
        },
        "Sponsor": {
            "mspid": "SponsorMSP",
            "peers": [
                "peer0.sponsor.example.com",
                "peer1.sponsor.example.com"
            ],
            "certificateAuthorities": [
                "ca.sponsor.example.com"
            ]
        }
    },
    "orderers": {
        "orderer.example.com": {
            "url": "grpcs://10.0.2.4:7050",
            "grpcOptions": {
                "ssl-target-name-override": "orderer.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORDERER_CA_CERT"
            }
        }
    },
    "peers": {
        "peer0.manager.example.com": {
            "url": "grpcs://10.0.2.4:7051",
            "eventUrl": "grpcs://10.0.2.4:7053",
            "grpcOptions": {
                "ssl-target-name-override": "peer0.manager.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_MANAGER_CA_CERT"
            }
        },
        "peer1.manager.example.com": {
            "url": "grpcs://10.0.2.4:8051",
            "eventUrl": "grpcs://10.0.2.4:8053",
            "grpcOptions": {
                "ssl-target-name-override": "peer1.manager.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_MANAGER_CA_CERT"
            }
        },
        "peer0.sponsor.example.com": {
            "url": "grpcs://localhost:9051",
            "eventUrl": "grpcs://localhost:9053",
            "grpcOptions": {
                "ssl-target-name-override": "peer0.sponsor.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_SPONSOR_CA_CERT"
            }
        },
        "peer1.sponsor.example.com": {
            "url": "grpcs://localhost:10051",
            "eventUrl": "grpcs://localhost:10053",
            "grpcOptions": {
                "ssl-target-name-override": "peer1.sponsor.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_SPONSOR_CA_CERT"
            }
        }
    },
    "certificateAuthorities": {
        "ca.manager.example.com": {
            "url": "https://10.0.2.4:7054",
            "caName": "ca-manager",
            "httpOptions": {
                "verify": false
            }
        },
        "ca.sponsor.example.com": {
            "url": "https://localhost:8054",
            "caName": "ca-sponsor",
            "httpOptions": {
                "verify": false
            }
        }
    }
}

Скрипт для установки .bna в организации / хосте Manager:

cat << "EOF"                                                                                             
"     
EOF
echo "Removing existing cards if any"
rm -fr $HOME/.composer
echo "Creating temporary directories"
mkdir -p /tmp/composer/manager
mkdir -p /tmp/composer/sponsor

echo "Pasting certificates in tmp/composer/..."
awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/peerOrganizations/manager.example.com/peers/peer0.manager.example.com/tls/ca.crt > /tmp/composer/manager/ca-manager.txt
awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/peerOrganizations/sponsor.example.com/peers/peer0.sponsor.example.com/tls/ca.crt > /tmp/composer/sponsor/ca-sponsor.txt
awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt > /tmp/composer/ca-orderer.txt

echo "Creating the connection profile file"
cp connectionProfile.json  /tmp/composer/example-network.json

echo "Adding the certificates in connection profile"
replacementManager = "/tmp/composer/manager/ca-manager.txt"
replacementSponsor = "/tmp/composer/sponsor/ca-sponsor.txt"
replacementOrderer = "/tmp/composer/ca-orderer.txt"

file = "/tmp/composer/example-network.json"
manager = "/tmp/composer/proaManager.json"
sponsor = "/tmp/composer/proaSponsor.json"
final = "/tmp/composer/proaFinal.json"
partFinal = "/tmp/composer/partFinal.json"

sed -i 's/\\n/±/g' $replacementManager
sed -i 's/\\n/±/g' $replacementSponsor
sed -i 's/\\n/±/g' $replacementOrderer

sed -e "s@INSERT_MANAGER_CA_CERT@$(cat $replacementManager)@g" $file > $manager
sed -e "s@INSERT_SPONSOR_CA_CERT@$(cat $replacementSponsor)@g" $manager > $sponsor
sed -e "s@INSERT_ORDERER_CA_CERT@$(cat $replacementOrderer)@g" $sponsor > $partFinal

sed $"s/\±/\\\n/g" $partFinal > $final

echo "Creating connection profile for manager"
cp /tmp/composer/proaFinal.json /tmp/composer/manager/proaManager.json
ex -sc '4i|"client": {
        "organization": "Manager",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    },' -cx /tmp/composer/manager/proaManager.json

echo "Creating connection profile for sponsor"
cp /tmp/composer/proaFinal.json /tmp/composer/sponsor/proaSponsor.json
ex -sc '4i|"client": {
        "organization": "Sponsor",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    },' -cx /tmp/composer/sponsor/proaSponsor.json

    #-------------------
    #-- MANAGER
    #-------------------

    echo "Getting the certificates for administrator of manager"
    export MANAGER=crypto-config/peerOrganizations/manager.example.com/users/[email protected]/msp
    cp -p $MANAGER/signcerts/A*.pem /tmp/composer/manager
    cp -p $MANAGER/keystore/*_sk /tmp/composer/manager

    echo "Creating card for manager"
    composer card create -p /tmp/composer/manager/proaManager.json -u PeerAdmin -c /tmp/composer/manager/[email protected] -k /tmp/composer/manager/*_sk -r PeerAdmin -r ChannelAdmin -f [email protected]

    echo "Importing card for manager"
    composer card import -f [email protected] --card PeerAdmin@proaManager

    composer network install --card PeerAdmin@proaManager --archiveFile [email protected]
    cp endorsement-policy.json  /tmp/composer/endorsement-policy.json

    echo "Retrieving business network administrator certificates for Manager"
    composer identity request -c PeerAdmin@proaManager -u admin -s adminpw -d andreim

    #-------------------
    #-- START NETWORK
    #-------------------

    echo "Starting the business network"
    composer network start -c PeerAdmin@proaManager -n example-network -V 0.0.1 -o endorsementPolicyFile=/tmp/composer/endorsement-policy.json -A andreim -C andreim/admin-pub.pem

    echo "Creating a business network card to access the business network as Manager"
    composer card create -p /tmp/composer/manager/proaManager.json -u andreim -n example-network -c andreim/admin-pub.pem -k andreim/admin-priv.pem
    composer card import -f [email protected]

    composer network ping -c andreim@example-network

Скрипт для установки .bna на спонсорскую организацию / хост:

cat << "EOF"                                                                                      
"     
EOF
echo "Removing existing cards if any"
rm -fr $HOME/.composer
echo "Creating temporary directories"
mkdir -p /tmp/composer/manager
mkdir -p /tmp/composer/sponsor

echo "Pasting certificates in tmp/composer/..."
awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/peerOrganizations/manager.example.com/peers/peer0.manager.example.com/tls/ca.crt > /tmp/composer/manager/ca-manager.txt
awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/peerOrganizations/sponsor.example.com/peers/peer0.sponsor.example.com/tls/ca.crt > /tmp/composer/sponsor/ca-sponsor.txt
awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt > /tmp/composer/ca-orderer.txt

echo "Creating the connection profile file"
cp connectionProfile.json  /tmp/composer/example-network.json

echo "Adding the certificates in connection profile"
replacementManager = "/tmp/composer/manager/ca-manager.txt"
replacementSponsor = "/tmp/composer/sponsor/ca-sponsor.txt"
replacementOrderer = "/tmp/composer/ca-orderer.txt"

file = "/tmp/composer/example-network.json"
manager = "/tmp/composer/proaManager.json"
sponsor = "/tmp/composer/proaSponsor.json"
final = "/tmp/composer/proaFinal.json"
partFinal = "/tmp/composer/partFinal.json"

sed -i 's/\\n/±/g' $replacementManager
sed -i 's/\\n/±/g' $replacementSponsor
sed -i 's/\\n/±/g' $replacementOrderer

sed -e "s@INSERT_MANAGER_CA_CERT@$(cat $replacementManager)@g" $file > $manager
sed -e "s@INSERT_SPONSOR_CA_CERT@$(cat $replacementSponsor)@g" $manager > $sponsor
sed -e "s@INSERT_ORDERER_CA_CERT@$(cat $replacementOrderer)@g" $sponsor > $partFinal

sed $"s/\±/\\\n/g" $partFinal > $final

echo "Creating connection profile for manager"
cp /tmp/composer/proaFinal.json /tmp/composer/manager/proaManager.json
ex -sc '4i|"client": {
        "organization": "Manager",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    },' -cx /tmp/composer/manager/proaManager.json

echo "Creating connection profile for sponsor"
cp /tmp/composer/proaFinal.json /tmp/composer/sponsor/proaSponsor.json
ex -sc '4i|"client": {
        "organization": "Sponsor",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    },' -cx /tmp/composer/sponsor/proaSponsor.json

    #-------------------
    #-- SPONSOR
    #-------------------

    echo "Getting the certificates for administrator of sponsor"
    export SPONSOR=crypto-config/peerOrganizations/sponsor.example.com/users/[email protected]/msp
    cp -p $SPONSOR/signcerts/A*.pem /tmp/composer/sponsor
    cp -p $SPONSOR/keystore/*_sk /tmp/composer/sponsor

    echo "Creating card for sponsor"
    composer card create -p /tmp/composer/sponsor/proaSponsor.json -u PeerAdmin -c /tmp/composer/sponsor/[email protected] -k /tmp/composer/sponsor/*_sk -r PeerAdmin -r ChannelAdmin -f [email protected]

    echo "Importing card for Sponsor"
    composer card import -f [email protected] --card PeerAdmin@proaSponsor

    composer network install --card PeerAdmin@proaSponsor --archiveFile [email protected]
    cp endorsement-policy.json  /tmp/composer/endorsement-policy.json

    echo "Retrieving business network administrator certificates for Sponsor"
    composer identity request -c PeerAdmin@proaSponsor -u admin -s adminpw -d andreis

    #-------------------
    #-------------------

    echo "Creating a business network card to access the business network as Sponsor"
    composer card create -p /tmp/composer/sponsor/proaSponsor.json -u andreis -n example-network -c andreis/admin-pub.pem -k andreis/admin-priv.pem
    composer card import -f [email protected]

    composer network ping -c andreis@example-network

После небольшого обновления в структуре профилей подключения установка .bna на обоих хостах работает нормально, и я могу запустить сеть с хоста 1.

Новая проблема, с которой я сталкиваюсь, возникает только тогда, когда я отправляю команды ping сети. Вот что я получаю для хоста 1:

Error: Error trying invoke business network. Error: Peer localhost:7051 has rejected transaction '92a332f3c48fa4f1f3e1b858d9f21cf49d191205f1e5da7c3a4724e193ed8974' with code ENDORSEMENT_POLICY_FAILURE

И это когда я пингую на хосте 2:

Error: Error trying to ping. Error: transaction returned with failure: Error: The current identity, with the name 'admin' and the identifier 'ca847f358ae8007968e02b194ed034fe82d55595ec2f7961a570de0c89fdd481', has not been registered

Обновлено:

На хосте 1 создаются два новых контейнера dev-peer1.manager ... и dev-peer0.manager ... Но на хосте 2 появляется только один новый контейнер dev-peer0.sponsor ...

ОБНОВЛЕНИЕ 2

Это из peer0.manager после обновления узлов привязки:

2018-10-03 07:25:56.656 UTC [gossip/gossip] learnAnchorPeers -> INFO 035 Anchor peer with same endpoint, skipping connecting to myself
2018-10-03 07:25:56.656 UTC [gossip/service] updateEndpoints -> WARN 036 Failed to update ordering service endpoints, due to Channel with mychannel id was not found
2018-10-03 07:25:56.668 UTC [kvledger] CommitWithPvtData -> INFO 037 Channel [mychannel]: Committed block [1] with 1 transaction(s)
2018-10-03 07:25:56.689 UTC [gossip/gossip] learnAnchorPeers -> INFO 038 Anchor peer with same endpoint, skipping connecting to myself
2018-10-03 07:25:56.689 UTC [gossip/service] updateEndpoints -> WARN 039 Failed to update ordering service endpoints, due to Channel with mychannel id was not found
2018-10-03 07:25:56.709 UTC [kvledger] CommitWithPvtData -> INFO 03a Channel [mychannel]: Committed block [2] with 1 transaction(s)
2018-10-03 07:25:58.731 UTC [gossip/comm] func1 -> WARN 03b peer0.sponsor.example.com:7051, PKIid:[243 157 143 36 230 129 13 112 17 86 197 255 202 84 128 217 169 218 84 171 24 5 85 85 183 248 81 52 115 118 126 40] isn't responsive: EOF
2018-10-03 07:25:58.731 UTC [gossip/discovery] expireDeadMembers -> WARN 03c Entering [[243 157 143 36 230 129 13 112 17 86 197 255 202 84 128 217 169 218 84 171 24 5 85 85 183 248 81 52 115 118 126 40]]
2018-10-03 07:25:58.731 UTC [gossip/discovery] expireDeadMembers -> WARN 03d Closing connection to Endpoint: peer0.sponsor.example.com:7051, InternalEndpoint: , PKI-ID: [243 157 143 36 230 129 13 112 17 86 197 255 202 84 128 217 169 218 84 171 24 5 85 85 183 248 81 52 115 118 126 40], Metadata: []
2018-10-03 07:25:58.731 UTC [gossip/discovery] expireDeadMembers -> WARN 03e Exiting
2018-10-03 07:25:58.761 UTC [gossip/discovery] resurrectMember -> INFO 03f Entering, AliveMessage: GossipMessage: tag:EMPTY alive_msg:<membership:<endpoint:"peer0.sponsor.example.com:7051" pki_id:"\363\235\217$\346\201\rp\021V\305\377\312T\200\331\251\332T\253\030\005UU\267\370Q4sv~(" > timestamp:<inc_num:1538551519456217249 seq_num:41 > > , Envelope: 83 bytes, Signature: 70 bytes t: {1538551519456217249 41}
2018-10-03 07:25:58.761 UTC [gossip/discovery] resurrectMember -> INFO 040 Exiting

Стоит ли беспокоиться о предупреждениях? Если я установлю цепной код marbles для одноранговых узлов, все будет работать нормально ... Я могу запросить все одноранговые узлы с правильными результатами.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
0
239
1

Ответы 1

Вам нужно будет установить, создать и импортироватьBND на каждом отдельном хосте с одинаковой версией на обоих из них (один и тот же файл .bna), если вы этого не сделаете, это не сработает. И запускаем BND в одном из хостов

Еще я заметил, что я не могу найти скрипт, в котором вы устанавливаете BND на свой 2-й хост. Это как если бы вы все устанавливали на свой хост 1.

#-------------------
#-- SPONSOR
#-------------------

echo "Getting the certificates for administrator of sponsor"
export SPONSOR=crypto-config/peerOrganizations/sponsor.example.com/users/[email protected]/msp
cp -p $SPONSOR/signcerts/A*.pem /tmp/composer/sponsor
cp -p $SPONSOR/keystore/*_sk /tmp/composer/sponsor

echo "Creating card for sponsor"
composer card create -p /tmp/composer/sponsor/exampleSponsor.json -u PeerAdmin -c /tmp/composer/sponsor/[email protected] -k /tmp/composer/sponsor/*_sk -r PeerAdmin -r ChannelAdmin -f [email protected]

echo "Importing card for Sponsor"
composer card import -f [email protected] --card PeerAdmin@exampleSponsor

composer network install --card PeerAdmin@exampleSponsor --archiveFile [email protected]
cp endorsement-policy.json  /tmp/composer/endorsement-policy.json

echo "Retrieving business network administrator certificates for Sponsor"
composer identity request -c PeerAdmin@exampleSponsor -u admin -s adminpw -d andreis

Этот раздел должен быть исключен на вашем хосте 2.

Шаги, которым вы должны следовать.

  • Установите BND на хосте 1
  • Установите BND на хост 2
  • Запустить BND на хосте 1
  • Создайте и импортируйте узел [email protected] 1
  • Создайте и импортируйте узел [email protected] 2

(Всегда предполагая, что спонсор будет в хосте 2)

Не стесняйтесь спрашивать, есть ли у вас сомнения, и извините за мой ржавый английский :)

Я обновил свой вопрос, добавив дополнительную информацию о проблеме, с которой я столкнулся. Я все еще думаю, что что-то не так в URL-адресах «удаленных» партнеров для каждой организации.

Macaret 02.10.2018 14:15

Вы уверены, что ваши сверстники общаются друг с другом? Возможно, вы можете проверить, нормально ли они работают, выполнив «docker ps» и «docker logs [container id]», чтобы проверить, общаются ли они, возможно, у вас есть проблемы со связью

Diego Bascans 02.10.2018 22:59

Я обновил вопрос журналами от peer0 после того, как присоединяюсь ко всем одноранговым узлам и обновляю узловые узлы. Стоит ли беспокоиться о предупреждениях?

Macaret 03.10.2018 09:40

Нет, не беспокойтесь о предупреждении. Кажется, что транзакции совершаются на этом узле, но как насчет одноранговых узлов на других узлах? они получают ваши транзакции?

Diego Bascans 03.10.2018 13:25

Я установил цепной код marbles в той же сети, и я могу установить и запросить одноранговые узлы на хосте 2. Это должно означать, что все в порядке. Кажется, что когда я запускаю сеть через Composer, контейнеры цепного кода появляются на хосте 1, но на хосте 2 они не появляются ... Что могло вызвать это?

Macaret 03.10.2018 13:33

Возможно, вы можете запустить "docker ps -a" на своем хосте 2, это покажет ваши закрытые контейнеры, и вы можете проверить журнал, в котором запущен "docker ps <container id>", чтобы просмотреть, что произошло, есть так много причин, которые могут быть убивая этого пэра

Diego Bascans 03.10.2018 13:55

Другие вопросы по теме