Docker-composeでmongoレプリカセットをセットアップする必要があります。レプリカセットの場合、コンテナはお互いを認識している必要があります。
docker-compose.yml
で試しました
dbreplicasetpart1:
image: mongo:2.6.8
expose:
- '27018'
links:
- replicasetpart2
- replicasetpart3
cap_add:
- NET_ADMIN
dbreplicasetpart2:
image: mongo:2.6.8
links:
- replicasetpart1
- replicasetpart3
expose:
- '27019'
cap_add:
- NET_ADMIN
...
循環インポートメッセージが表示されます。しかし、dbreplicasetpart1へのバックリンクを削除すると、dbreplicasetpart2からdbreplicasetpart1にpingできません。解決策は何ですか?
Docker 1.10用に更新
Docker 1.10では、作成ファイル内でネットワークを定義できます。これが更新されたコードです
version: "2"
services:
replica1:
image: mongo:2.6.8
container_name: replica1
networks:
- my-net
ports:
- "27018"
environment:
REPLICA2_URL: "http://replica2:27019"
replica2:
image: mongo:2.6.8
container_name: replica2
networks:
- my-net
ports:
- "27019"
environment:
REPLICA1_URL: "http://replica1:27018"
networks:
my-net:
driver: bridge
Docker 1.9の以前の回答
Docker 1.9現在、これに対する解決策は、カスタムネットワークを作成し、docker-compose up
コマンドに渡すことです。
ネットワークを作成docker network create --driver bridge my-net
Docker-compose.ymlファイルの環境変数(${NETWORK}
)としてそのネットワークを参照します。例えば:
`` `
replica1:
image: mongo:2.6.8
container_name: replica1
net: ${NETWORK}
ports:
- "27018"
environment:
REPLICA2_URL: "http://replica2:27019"
replica2:
image: mongo:2.6.8
container_name: replica2
net: ${NETWORK}
ports:
- "27019"
environment:
REPLICA1_URL: "http://replica1:27018"
`` `
replica1
のhttp://replica1:27018
は、replica1サービス(コンテナー)のIPアドレスに解決されることに注意してください。 IPアドレスをハードコーディングする必要はありません。 replica1のエントリは、replica2コンテナの/ etc/Hostに自動的に追加されます。 replica1コンテナーについても同様です。 Dockerは/ etc/Hostファイルにreplica2のエントリを追加します。
NETWORK=my-net docker-compose up -d -f docker-compose.yml
ブリッジネットワークを作成しましたが、これは1つのノード(ホスト)内でのみ機能します。開発者に適しています。 2つのノードを相互に通信させる必要がある場合、オーバーレイネットワークを作成する必要があります。しかし同じ原理。ネットワーク名をdocker-compose upコマンドに渡します。
アンバサダーパターンを使用する必要があります。
https://docs.docker.com/engine/admin/ambassador_pattern_linking/
基本的に、両方をブリッジする中間コンポーネントを作成します。 Spring CloudのEurekaディスカバリサービスで使用する例を見ることができます。
ambassador:
image: cpuguy83/docker-grand-ambassador
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
command: "-name eureka_1 -name eureka2_1 "
eureka:
links:
- "ambassador:eureka2"
eureka2:
links:
- "ambassador:eureka"
簡単にするために、リンクのみをコピーしました
このソリューションをアンバサダーで使用することがわかりました。それは確かにより快適なソリューションです。私たちのために働く構成:
amba1:
image: cpuguy83/docker-grand-ambassador
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
command: "-name cucumber_dbreplicasetpart1_1"
amba2:
image: cpuguy83/docker-grand-ambassador
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
command: "-name cucumber_dbreplicasetpart2_1"
amba3:
image: cpuguy83/docker-grand-ambassador
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
command: "-name cucumber_dbreplicasetpart3_1"
dbreplicasetpart1:
image: 'mongo:2.6.8'
hostname: dbreplicasetpart1
command: >
bash -c
'
mongod --fork --logpath mongo.log --smallfiles --replSet rs1
echo "
printjson(
rs.initiate(
{
_id : \"rs1\",
members : [
{_id : 0, Host : \"dbreplicasetpart1:27017\"},
{_id : 1, Host : \"dbreplicasetpart2:27017\"},
{_id : 2, Host : \"dbreplicasetpart3:27017\"},
]
}
)
);
" | mongo;
tail -f mongo.log
'
links:
- "amba2:dbreplicasetpart2"
- "amba3:dbreplicasetpart3"
dbreplicasetpart2:
image: 'mongo:2.6.8'
hostname: dbreplicasetpart2
command: >
bash -c
'
mongod --fork --logpath mongo.log --smallfiles --replSet rs1
echo "
printjson(
rs.initiate(
{
_id : \"rs1\",
members : [
{_id : 0, Host : \"dbreplicasetpart1:27017\"},
{_id : 1, Host : \"dbreplicasetpart2:27017\"},
{_id : 2, Host : \"dbreplicasetpart3:27017\"},
]
}
)
);
" | mongo;
tail -f mongo.log
'
links:
- "amba1:dbreplicasetpart1"
- "amba3:dbreplicasetpart3"
dbreplicasetpart3:
image: 'mongo:2.6.8'
hostname: dbreplicasetpart3
command: >
bash -c
'
mongod --fork --logpath mongo.log --smallfiles --replSet rs1
echo "
printjson(
rs.initiate(
{
_id : \"rs1\",
members : [
{_id : 0, Host : \"dbreplicasetpart1:27017\"},
{_id : 1, Host : \"dbreplicasetpart2:27017\"},
{_id : 2, Host : \"dbreplicasetpart3:27017\"},
]
}
)
);
" | mongo;
tail -f mongo.log
'
links:
- "amba1:dbreplicasetpart1"
- "amba2:dbreplicasetpart2"
docker-compose.yml
ファイルを更新せずに、
docker network connect docker-compose-network-you-want-to-connect conatianer-name-from-another-docker-compose
もっと こちら