(物理LANに接続された)Debian-Stretchホストで、1つのデータベースコンテナー(ホストにマップされたポート)を備えた新しいdockerインストール(v18.09)を使用し、いくつかのDebian-Stretch VMでKVM/libvirtを実行します。 (SSHトンネル経由または直接の構成に応じて)LANからdockerコンテナーとVMにアクセスできますが、VMからdockerコンテナーにアクセスするのに苦労しています。
# brctl show
bridge name bridge id STP enabled interfaces
br-f9f3ccd64037 8000.0242b3ebe3a0 no
docker0 8000.024241f39b89 no veth35454ac
virbr0 8000.525400566522 yes virbr0-nic
数日間読んだ後、私はこの投稿で非常に説得力のある解決策を見つけました Docker and KVM with a bridge ( original )私がしなかったKVM "default"ブリッジを使用するために、1行のconfig daemon.jsonコードを使用してdockerを開始することをソリューションが提案しています。どのようにうまくいきますか?希望はありますか?
KVM VM間のネットワーキングに2つの異なる構成を試しました。どちらの場合も、VM間とLAN +ルーター+クラウドへの通信は問題ありませんが、どうすればよいかわかりません。フェンス-緑の芝生に... :)
設定1-KVM NATを使用したデフォルトブリッジ:Debianホストにsshしてdockerコンテナポートにアクセスできますが、直接ルートを使用したセットアップはありますか?
設定2-LANへのブリッジモードのmacvtapアダプター:VMからホストLAN IPにpingできません。両方が同じルーターに接続されています。VM自体はDestination Host Unreachable
。なぜだと思いますか?
Debianホストで直接行うよりも、別のVMでdockerデーモンを実行する方が良いでしょうか?この方法で、コンテナとVMの両方がKVMデフォルトブリッジですが、VM on a KVM Host。
明確なガイダンスをいただければ幸いです!
ところで、橋br-f9f3ccd64037
は、将来のコンテナ間通信のためにdockerで作成したユーザー定義のブリッジです。使用していません。
更新:
最初の構成では、VMゲストからのIPアドレス(172.17.0.2)で単純にdockerコンテナーに接続できることに気づきました。
最初のセットアップは2番目の構成でした。これは、VMにRDPを実行したいためです。macvtapドライバーはVMを直接LANに接続し、SSHリンクが不要なので、より簡単です。コンテナに届かなかったのはその時です。
解決策は、リンクされた記事に記載されているように単純でした。 dockerデーモンを最初に再起動したときに、構成が変更されなかった理由がわかりません。
Daemon.jsonのブリッジ引数の Dockerデーモンドキュメント で証拠を見つけた後、もう一度試してみましたが、dockerデーモンがKVMデフォルトブリッジを起動。
最初に、ドキュメントで提案されているように、次の内容で構成ファイル/etc/docker/daemon.json
を作成しました(iptables行は必要ない場合もあります)。
{
"bridge": "virbr0",
"iptables": false
}
必要なのは:
docker stop mysql
systemctl stop docker
systemctl start docker
docker start mysql
また、既存のdockerコンテナーはKVM=ブリッジで実行されていました。コンテナーのIPアドレスは次のようにして確認できます。
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql
192.168.122.2
今docker0ブリッジを削除できるかどうかはわかりませんが、コンテナーは3つのVMとともにvirbr0の下にリストされています。
brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024241f39b89 no
virbr0 8000.068ff2a4a56e yes veth2abcff1
virbr0-nic
vnet0
vnet1
vnet2
私は次の設定を使用してそれを実装するのに慣れています:
内部に物理NICを備えたbr0
ブリッジを作成します
kvmマシンは、以下のqemu xml構成スニペットを使用してブリッジに接続されています
<interface type='bridge'>
<mac address='52:54:00:a9:28:0a'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
dockerスタックはすべて同じように実行されています。スタックごとにルーティング可能なパブリックIPを予約しています。以下のopensvcサービス構成スニペットを使用して、このパブリックIPをブリッジbr0
に接続します。
[ip#0]
セクションでは、IP 1.2.3.4
をリソースID container#0
のコンテナーに構成し、Docker google/pauseであり、ブリッジbr0
に接続するように指示しています
docker宣言の構成container#0
により、netns = container#0
からのスタックheritネットワーク構成内の他のすべてのDocker
opensvcサービスが開始すると、ネットワークのセットアップはエージェントによって行われ、以下のログで報告されるすべてのコマンドが生成されます
opensvcサービス構成
[DEFAULT]
docker_daemon_args = --log-opt max-size=1m --storage-driver=zfs --iptables=false
docker_data_dir = /{env.base_dir}/docker
env = PRD
nodes = srv1.acme.com srv2.acme.com
orchestrate = start
id = 4958b24d-4d0f-4c30-71d2-bb820e043a5d
[fs#1]
dev = {env.pool}/{namespace}-{svcname}
mnt = {env.base_dir}
mnt_opt = rw,xattr,acl
type = zfs
[fs#2]
dev = {env.pool}/{namespace}-{svcname}/docker
mnt = {env.base_dir}/docker
mnt_opt = rw,xattr,acl
type = zfs
[fs#3]
dev = {env.pool}/{namespace}-{svcname}/data
mnt = {env.base_dir}/data
mnt_opt = rw,xattr,acl
type = zfs
[ip#0]
netns = container#0
ipdev = br0
ipname = 1.2.3.4
netmask = 255.255.255.224
gateway = 1.2.3.1
type = netns
[container#0]
hostname = {svcname}
image = google/pause
rm = true
run_command = /bin/sh
type = docker
[container#mysvc]
image = mysvc/mysvc:4.1.3
netns = container#0
run_args = -v /etc/localtime:/etc/localtime:ro
-v {env.base_dir}/data/mysvc:/home/mysvc/server/data
type = docker
[env]
base_dir = /srv/{namespace}-{svcname}
pool = data
起動ログ
2019-01-04 11:27:14,617 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - checking 1.2.3.4 availability
2019-01-04 11:27:18,565 - srv1.acme.com.appprd.mysvc.fs#1 - INFO - mount -t zfs -o rw,xattr,acl data/appprd-mysvc /srv/appprd-mysvc
2019-01-04 11:27:18,877 - srv1.acme.com.appprd.mysvc.fs#2 - INFO - mount -t zfs -o rw,xattr,acl data/appprd-mysvc/docker /srv/appprd-mysvc/docker
2019-01-04 11:27:19,106 - srv1.acme.com.appprd.mysvc.fs#3 - INFO - mount -t zfs -o rw,xattr,acl data/appprd-mysvc/data /srv/appprd-mysvc/data
2019-01-04 11:27:19,643 - srv1.acme.com.appprd.mysvc - INFO - starting docker daemon
2019-01-04 11:27:19,644 - srv1.acme.com.appprd.mysvc - INFO - dockerd -H unix:///var/lib/opensvc/namespaces/appprd/services/mysvc/docker.sock --data-root //srv/appprd-mysvc/docker -p /var/lib/opensvc/namespaces/appprd/services/mysvc/docker.pid --exec-root /var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec --log-opt max-size=1m --storage-driver=zfs --iptables=false --exec-opt native.cgroupdriver=cgroupfs
2019-01-04 11:27:24,669 - srv1.acme.com.appprd.mysvc.container#0 - INFO - docker -H unix:///var/lib/opensvc/namespaces/appprd/services/mysvc/docker.sock run --name=appprd..mysvc.container.0 --detach --hostname mysvc --net=none --cgroup-parent /opensvc.slice/appprd.slice/mysvc.slice/container.slice/container.0.slice google/pause /bin/sh
2019-01-04 11:27:30,965 - srv1.acme.com.appprd.mysvc.container#0 - INFO - output:
2019-01-04 11:27:30,965 - srv1.acme.com.appprd.mysvc.container#0 - INFO - f790e192b5313d7c3450cb257d075620f40c2bad3d69d52c8794eccfe954f250
2019-01-04 11:27:30,987 - srv1.acme.com.appprd.mysvc.container#0 - INFO - wait for up status
2019-01-04 11:27:31,031 - srv1.acme.com.appprd.mysvc.container#0 - INFO - wait for container operational
2019-01-04 11:27:31,186 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - bridge mode
2019-01-04 11:27:31,268 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link add name veth0pl20321 mtu 1500 type veth peer name veth0pg20321 mtu 1500
2019-01-04 11:27:31,273 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pl20321 master br0
2019-01-04 11:27:31,277 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pl20321 up
2019-01-04 11:27:31,281 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pg20321 netns 20321
2019-01-04 11:27:31,320 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip link set veth0pg20321 name eth0
2019-01-04 11:27:31,356 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip addr add 1.2.3.4/27 dev eth0
2019-01-04 11:27:31,362 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip link set eth0 up
2019-01-04 11:27:31,372 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip route replace default via 1.2.3.1
2019-01-04 11:27:31,375 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 /usr/bin/python3 /usr/share/opensvc/lib/arp.py eth0 1.2.3.4
2019-01-04 11:27:32,534 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - docker -H unix:///var/lib/opensvc/namespaces/appprd/services/mysvc/docker.sock run --name=appprd..mysvc.container.mysvc -v /etc/localtime:/etc/localtime:ro -v /srv/appprd-mysvc/data/mysvc:/home/mysvc/server/data --detach --net=container:appprd..mysvc.container.0 --cgroup-parent /opensvc.slice/appprd.slice/mysvc.slice/container.slice/container.mysvc.slice mysvc/mysvc:4.1.3
2019-01-04 11:27:37,776 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - output:
2019-01-04 11:27:37,777 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - 1616cade9257d0616346841c3e9f0d639a9306e1af6fd750fe70e17903a11011
2019-01-04 11:27:37,797 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - wait for up status
2019-01-04 11:27:37,833 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - wait for container operational