Moby: docker swarmモヌド127.0.0.1のポヌトは0.0.0.0に公開されたす

䜜成日 2017幎04月02日  Â·  53コメント  Â·  ゜ヌス: moby/moby

説明

docker swarmモヌドでは、ポヌトを127.0.0.1にバむンドするず、0.0.0.0でもポヌトが開きたす。 これは重倧なセキュリティ問題になる可胜性があるため、ドキュメントで説明する必芁がありたす。

問題を再珟する手順

  1. docker-compose.swarm.ymlファむルにMongoDBなどのサヌビスを䜜成し、ポヌト27017をロヌカルホストに公開したす。
  mongodb:
    image: mongo:3.2
    volumes:
      - ./persistent-data/mongodb:/data
      - ./persistent-data/mongodb/db:/data/db
    networks:
      data:
        aliases:
          - mongo.docker
    logging:
      driver: syslog
      options:
        syslog-address: "udp://10.129.26.80:5514"
        tag: "docker[mongodb]"
    ports:
      - "127.0.0.1:27017:27017"
    deploy:
      placement:
        constraints: [node.labels.purpose == main-data]
  1. 矀れを展開する
  2. netcatを䜿甚しお、矀れの倖偎からポヌトが開いおいるかどうかを確認したす

受け取った結果を説明しおください。

nc -vz PUBLIC_NODE_IP 27017
found 0 associations
found 1 connections:
[...]
Connection to PUBLIC_NODE_IP port 27017 [tcp/*] succeeded!

期埅した結果を説明しおください。
ポヌトは、少なくずもこのサヌビスを実行しおいるスりォヌムノヌドでは、127.0.0.1でのみ䜿甚できたす。

重芁ず思われる远加情報たずえば、問題はたたにしか発生したせん

docker version出力

Docker version 17.03.1-ce, build c6d412e

docker info出力

スりォヌムマネヌゞャヌのDocker情報

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 1
Server Version: 17.03.1-ce
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 3
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: active
 NodeID: pk7ulemi0z0chgtsg0azfrjz5
 Is Manager: true
 ClusterID: 27etomlyjvtmygrm6rcdgr2ni
 Managers: 1
 Nodes: 6
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Number of Old Snapshots to Retain: 0
  Heartbeat Tick: 1
  Election Tick: 3
 Dispatcher:
  Heartbeat Period: 5 seconds
 CA Configuration:
  Expiry Duration: 3 months
 Node Address: 10.129.26.165
 Manager Addresses:
  10.129.26.165:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.4.0-64-generic
Operating System: Ubuntu 16.04.2 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 992.4 MiB
Name: <HIDDEN>
ID: IMOK:QIR7:WU5Y:WTPP:EPRQ:F77G:ULGE:WOG4:O7S7:6AFE:V7QG:2XEK
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: <HIDDEN>
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

远加の環境の詳现AWS、VirtualBox、物理など
DigitalOceanの液滎でテスト枈み。

areswarm kinbug

最も参考になるコメント

ほが2幎間、Docker開発者の䞭には、その機胜が必芁な堎合に1぀の有効で

党おのコメント53件

はい、これぱラヌを出力するはずです。 サヌビスデフォルトは「ingress」ネットワヌクを䜿甚しお「公開」し、最終的にどの_node_に到達するかを予枬できないため、IPアドレスの指定をサポヌトしたせんしたがっお、䜿甚可胜なIPアドレスは䞍明です-127.0ですが.0.1が可胜かもしれたせん。 この問題は、その機胜https://github.com/docker/docker/issues/26696を远跡しおい

ここでのバグは、dockerがオプションを黙っお無芖するのではなく、゚ラヌを生成する必芁があるこずです。 この最小限のdocker-composeファむルを䜿甚しお再珟可胜。

version: "3.2"
services:
  mongodb:
    image: nginx:alpine
    ports:
      - "127.0.0.1:27017:80"

ping @dnephin @vdemeester

@ fer2d2スりォヌムモヌドで䜕かを公開するず ports堎合はstack deploy 、 ingressネットワヌクで公開されるため、公開されたす。 そこを回避するいく぀かの方法があるが、パッティングkind/bugその䞊で、我々は、少なくずも人々に譊告しなければならないのでに関するこずやっおたずきにstack deployこの衚蚘法を持っおいるポヌトを持぀぀たり、 host:port:port 。

これを回避するには、いく぀かの方法がありたす。

  • たず、 mongoポヌトを公開する堎合にのみ公開する必芁がありたす。mongoからアクセスできたす。
  • ingressではなくホストで公開する堎合぀たり、スりォヌムモヌドを䜿甚しない堎合ず同じように、スりォヌムパブリックではなく、実行䞭のホスト䞊でのみ、ポヌト拡匵構文を䜿甚する必芁があり
    ports:
      - mode: host
        target: 80
        published: 9005

docker run -p 80:9005  ず同じように動䜜するため、 0.0.0.0にバむンドされたすが、ホストに限定されたす。

しかし、 @ thaJeztahが蚀ったように、「ここでのバグは、dockerがオプションを黙っお無芖するのではなく、゚ラヌを生成するはずだずいうこずです」👌

/ cc @mavenugo @abochを䜿甚しお、実際に特定のIPにバむンドできるようにする方法があるかどうかを確認したすか ノヌドのIPが異なるため、達成するのは非垞に困難です。

@vdemeesterこの衚蚘を䜿甚しお、ホストタヌゲットずしおlocalhostを指定できたすか

    ports:
      - mode: host
        target: 127.0.0.1:80
        published: 9005

これはポヌト構成の拡匵フォヌマットであるため、正しく機胜するはずです。

前もっお感謝したす

長い構文では、タヌゲットず公開の䞡方が敎数型ずしお適甚されおいるようです

SSHトンネルを介しお䞀郚のサヌビスに接続しおいる堎合、これは望たしい動䜜ではないず思いたす。 たずえば、MySQLたたはMongoDBサヌバヌを127.0.0.1に配眮し、SSHトンネル経由で接続する堎合、Docker Swarmを䜿甚しお、0.0.0.0でデヌタベヌスポヌトを公開するか、SSHを内郚で実行するカスタムデヌタベヌスコンテナを䜜成する必芁が

SQL WorkbenchやRobomongoなど、この制限特定のむンタヌフェむスバむンディングのために䜿甚できないSSHトンネルを䜿甚するデヌタベヌスクラむアントは倚数ありたす。

私たちの䌚瀟では@ fer2d2ず同じ問題があり、sshトンネルを介しおMongoboosterをdockerswarmに接続しようずしおいたす。 私たちが芋぀けた唯䞀の解決策は、27017ポヌトを開き、ナヌザヌずパスワヌドでデヌタベヌスを保護するこずでした。

連絡あった

+1

+1

長い圢匏のポヌトマッピングにip_address portペアを蚱可する別の䜿甚䟋は、゚ニヌキャストアドレスたたはルヌプバックに関連付けられおいる可胜性のあるその他のアドレスです。 これらは、ルヌプバックネットワヌクでのみ衚瀺されるずいう点で127.0.0.1アドレスに䌌おいたす。 このプロパティを持぀ノヌドに制限されたサヌビスは、ポヌト倉換のiptablesルヌルを回避しながら、ポヌトの衝突を回避するために、゚ニヌキャストアドレスでのみポヌトを公開したい堎合がありたす。

次のように指定するず、オプションになる可胜性がありたすか。

placement:
        constraints:
          - node.id ==

也杯

+1

+1

+1

私自身のために私はこの問題を解決したした

iptables -I DOCKER-USER -i eth0 -j DROP
iptables -I DOCKER-USER -m state --state RELATED,ESTABLISHED -j ACCEPT

Dockerはこれらのルヌルに觊れたせん。 自分で远加するだけ
-A DOCKER-USER -j RETURN
その結果、ポヌトは0.0.0.0でリッスンしたすが、倖郚むンタヌフェむスeth0からはアクセスできたせん。

この動䜜は「デフォルトで安党」に違反しおおり、ドキュメントにメモを入れるだけでは䞍十分です。 今のずころ、゚ラヌが発生するはずです。

たた、モヌドingress / hostにも関連しおいたすこれらの2぀の問題は議論で混乱しおいるようです。 サヌビスがすべおのノヌドのロヌカルアドレスにバむンドされるのを停止する必芁があるが、倖郚アドレスにはバむンドされない入力モヌドに぀いおは䜕もありたせん。 したがっお、127.xxxを蚱可する必芁がありたす。 非スりォヌムモヌドdocker runを䜿甚では、127.0.0.280や127.0.0.3:80などにバむンドしたす。開発䞭の耇数のサヌバヌをロヌカルでテストしたす。

もう1぀の問題は、入力モヌドがデフォルトであるずいうこずです。 これは予期しないこずであり、セキュリティの問題にも぀ながりたす。 127.0.0.3:80にバむンドされたポヌトを䜿甚しお、ネットワヌクのプラむベヌト郚分にあるように制玄されたノヌドでサヌビスを開始しようずしたした。 次に、パブリックノヌドのパブリックむンタヌフェむスにもバむンドされたした。 これは、IPアドレスを黙っお無芖し、入力モヌドを黙っお䜿甚しおいるため、デヌタが公開されおいたす。

ナヌスケヌス

  • 私に圱響を䞎えたナヌスケヌス間違いなく本物

    • 1ポヌトは他のノヌドで䜿甚されおいるため、特定のノヌドのポヌトにバむンドしたす。 これにはホストモヌドを䜿甚できたすが、デフォルトは驚きです。

    • 2他のノヌドにはパブリックむンタヌフェむスがあるため、特定のノヌドのポヌトにバむンドしたす。 これにはホストモヌドを䜿甚できたすが、デフォルトは「デフォルトで安党」に違反しおいたす。

    • 3他のホストに衚瀺したくないため、ロヌカルでバむンドしたす。デフォルトは「デフォルトで安党」に違反しおいたす

    • 4 127.0.0.3にバむンドしたす。これは、開発マシンに倚くのものがあり、このポヌトで127.0.0.1が䜿甚されおいるためです。 たた、 /etc/hostsを䜿甚しお、各ドメむン名が異なるコンテナに送信されるようにしたす。 これはdocker runで機胜したすが、composeでは機胜したせん。

  • その他のナヌスケヌス

    • これは内郚ネットワヌクであるため、192.168.0.xなどの特定のむンタヌフェむスにバむンドしたす。 デフォルトは「デフォルトで安党」に違反しおいたす

    • 特定の特定のノヌドにバむンドしたすが、このノヌドで実行するようにサヌビスを制限したせん。 これは1たたは2ず同様のナヌスケヌスですが、制玄を䜿甚しおいたせん。 トラフィックは矀れを経由しおルヌティングされたす。

芁玄するず

  • IPアドレスを無芖し、0.0.0.0にバむンドするこずず、デフォルトの入力モヌドは、どちらも「デフォルトで安党」に違反しおいたす。 IPアドレスが指定され、ドキュメントが曎新された堎合、゚ラヌが発行されたす。 モヌドが指定されおいないデフォルトがない堎合、゚ラヌが発行され、ドキュメントが曎新されたす。 これにより、モヌドの問題が修正され、予期しないセキュリティの問題が停止したす。
  • その埌、ホストモヌドでIPアドレスのサポヌトを远加できたす。
  • ロヌカルアドレス127.xxxに制限されおいる入力モヌドでのIPアドレスのサポヌトを远加できたす。 異なるロヌカルアドレス䟋127.0.0.2ず127.0.0.3は異なるものずしお扱われる必芁がありたすOSに枡されるだけです。

ロヌカルアドレスぞのバむンドを蚱可するず、制玄のあるノヌドに圹立ちたす。 特定のアドレスぞのバむンドを蚱可するか、制玄されたノヌドで機胜するか、スりォヌムを介しおノヌドの1぀にあるアドレスの1぀にルヌティングされたす入力モヌドのみの堎合がありたす。 このルヌティングはすでに行われおいたす

@ richard-delorenzi Mobyは珟圚、ホストIPを受け入れおいたせん。 したがっお、機胜リク゚スト以倖では、これはクラむアント偎の問題のように聞こえたす...具䜓的には、composeyamlがDockerCLIでどのように倉換されるかです。

入力が機胜する方法はかなりよく文曞化されおいたすが、これはCLIでの動䜜が悪いこずに同意したす。

+1

+1

+1

私が䜿甚する皮類の回避策がありたす。 スタンドアロンコンテナを実行し、それらを「core」ずいう名前のネットワヌクに接続したす。このネットワヌクは、矀れの䞭で実行されおいるすべおのバック゚ンドサヌビスmongo、elasticsearch、influxdbなどで䜿甚されたす。

䜜成ファむルでこれを行う方法がわからないため、次のようにスタンドアロンコンテナを実行しおいるだけです。

docker run --name kibana --rm -d -v /var/lib/kibana:/usr/share/kibana/config -p 127.0.0.1:5601:5601 --network core docker.elastic.co/kibana/kibana:6.1.2

docker run --name chronograf --rm -d -v /var/lib/chronograf:/var/lib/chronograf -p 127.0.0.1:8888:8888 --network core chronograf:1.4 chronograf --influxdb-url=http://influxdb:8086

これらを開始した埌、dockerpsは新しいコンテナヌが127.0.0.1にバむンドされおいるこずを瀺したす。 アヌメン。 次に、ロヌカルワヌクステヌションからDockerホストにトンネリングしお、次のように安党にアクセスできたす。

ssh -i my_ssh_key.pem [email protected]  -L 8888:localhost:8888  -L 5601:localhost:5601 -N

ブラりザから、 http// localhost 8888たたはhttp// localhost 5601に接続でき

私のために働きたす。

UNIX゜ケットが127.0.0.1TCP / IP゜ケットを眮き換えるこずができる堎合、私がfluent-bitに察しお実装した可胜な回避策はここにあり

mode別のオプションを远加するず圹立぀かもしれたせん。 hostずingressに加えお、 localようなもの。

「ナヌザビリティMobyはナヌザビリティを損なうこずなく安党なデフォルトを提䟛したす」ずいう文蚀を削陀しおください。 mobyのreadmeファむル。 これは間違いなく虚停の広告です。@ richard-delorenziのコメントを参照しおください。

サヌビスはデフォルトでポヌトを公開しないため、ポヌトを公開するように指定しない限り、サヌビスにアクセスできたせん。 珟圚、特定のIPアドレスぞのバむンドはサポヌトされおいたせん。 サヌビスにアクセスできない堎合は、ポヌトを公開せず、内郚オヌバヌレむネットワヌクを䜿甚しおサヌビスに接続したす。

IPアドレスぞのバむンドのサポヌトの远加に぀いおは、 https//github.com/moby/moby/issues/26696で説明されおい

スタックをデプロむするずきに譊告が远加されたした。

docker stack deploy -c- test <<'EOF'
version: '3'
services:
  web:
    image: nginx:alpine
    ports:
      - "127.0.0.1:8080:80"
EOF

WARN[0000] ignoring IP-address (127.0.0.1:8080:80/tcp) service will listen on '0.0.0.0' 
Creating network test_default
Creating service test_web

たた、指定されたIPアドレスを䜿甚しおサヌビスをデプロむしようずするず、゚ラヌが発生しおデプロむに倱敗したす。

docker service create -p 127.0.0.1:9090:80 nginx:alpine
invalid argument "127.0.0.1:9090:80" for "-p, --publish" flag: hostip is not supported
See 'docker service create --help'.

@daluシステムがむンタヌネットに公開されおいお、Dockerにクラスタヌ䞊のサヌビスを公開するように指瀺した堎合、期埅が他の䜕かになる理由が

確かに、開発ず実際の展開を制限するこの構成圢匏には、いく぀かの重倧な劥協点がありたす。

@ cpuguy83

システムがむンタヌネットに公開されおいお、Dockerにクラスタヌ䞊のサヌビスを公開するように指瀺した堎合、期埅が他の䜕かになる理由がわかりたせん。

いいえ。 誰かが127.0.0.1や10.0.0.0などの非パブリックIPにバむンドした堎合、なぜパブリックにアクセスできる必芁があるのですか 実際、それは正解です。

特定のIPアドレスぞのバむンドは珟圚サポヌトされおいたせん

@dalu

しかし、それは公にではなく、アクセス可胜でなければなりたせん。 そしお、それがここでのすべおの取匕です。
デフォルトでは安党ではなく、セマンティクスによる修正を回避しおいたす。
この問題は、適切な解決策がないたた、ほが2幎間開いおいたす。

swarmが䜿甚できないため、swarmからkubernetesに移行しおいたす。 この移行には非垞にコストがかかるものの、この決定には完党に満足しおいたす。

@Bessonvそれは

問題は、䜜成フォヌマットが開発環境向けに蚭蚈されおおり、クラスタヌのデプロむをサポヌトするようにプッシュされおいるこずです。 「dockerstack」ぱラヌになるはずですが、1぀の䜜成ファむルを䜿甚しおすべおをルヌル化できるようにしたいので、この混乱が発生したす。

@ cpuguy83
この説明に満足できるかどうかはわかりたせん。 最埌に、䜜成フォヌマットは、目的の状態の単なる説明です。 1台のマシン䜜成ずクラスタヌ矀れの間にいく぀かの違いがあるこずはたったく問題ありたせん。 私の芋解では、䜜曲をサポヌトする意味はたったくありたせん。 特にスりォヌムモヌドのアクティブ化はずおも簡単だからです。 しかし、これには矀れを修正する必芁がありたす。

問題はたったく矀がっおおらず、compose圢匏ずdockercliでの実装で100です。
珟圚、スタックは100クラむアント偎の実装であるこずに泚意しおください。

スタック内では、デヌタベヌス、redisなどの内郚サヌビスのポヌトを明瀺的に公開する必芁がないこずがわかりたした。内郚サヌビスのports構成を省略し、名前で参照するだけで問題ありたせん。

スタック内のdbサヌビスの䟋

services:
  db:
    image: postgres:11-alpine
  networks:
    - backend

... Django appサヌビスは、デフォルトで次のようにポヌトを䜿甚できたす。

DATABASES = {
    'default': env.db(default='postgres://user:pass<strong i="13">@db</strong>:5432/catalog'),
}

したがっお、この堎合、パブリックサヌビスのみを明瀺的に公開するず、デフォルトでセキュアのように芋え

問題はたったく矀がっおおらず、compose圢匏ずdockercliでの実装で100です。
珟圚、スタックは100クラむアント偎の実装であるこずに泚意しおください。

䜕でも:(この問題のためにスタックの䜿甚をやめ、もう気にしたせん。 図曞通のせい、枯湟劎働者のせい、私の猫のせい。

dockerを盎接䜿甚する堎合、たたはcomposeを䜿甚する堎合、この問題は発生しおいたせん。

このアプロヌチが圹立぀ように芋えたす矀れのすべおのノヌドで実行する必芁がありたす

  1. 矀れを残す
  2. ネットワヌクdocker_gwbridgeを削陀したす
  3. 远加オプションcom.docker.network.bridge.host_binding_ipv4 = IPを䜿甚しおネットワヌクdocker_gwbridgeを再䜜成したす
  4. 矀れに戻る
    モヌド「ホスト」で公開されたポヌトで機胜したす。 モヌドがない堎合、「ホスト」入力ネットワヌクは他のドラむバヌおよびスコヌプ「スりォヌム」ずずもに䜿甚されたす。

恐ろしい解決策

$ mv /usr/bin/docker-proxy /usr/bin/docker-proxy-original
$ cat << 'EOF' > /usr/bin/docker-proxy
#!/bin/sh
exec /usr/bin/docker-proxy-original `echo $* | sed s/0.0.0.0/127.0.0.1/g`
EOF
$ chmod 755 /usr/bin/docker-proxy
$ service docker restart

@jsmouret最新のdockerリリヌスでdocker -proxyを芋぀けるこずすらできたせん。 それはいく぀かの遺産ですか それずも名前が違うの

状況によりたす...

$ apt-file search docker-proxy
docker-ce: /usr/bin/docker-proxy
docker.io: /usr/sbin/docker-proxy

この動䜜は、ドキュメントに䜕らかの圢で文曞化する必芁がありたす。
珟圚、ショヌトポヌトマッピングからホストを無芖するだけです。 そしお静かに動䜜したせん。

もう1぀の奇劙なこずは、長い構文スキヌマでホストを蚭定できないこずです。

この動䜜は、ドキュメントに䜕らかの圢で文曞化する必芁がありたす。

同意する; そのペヌゞのどこかで蚀及されおいるず思いたしたが、芋぀かりたせん。 ドキュメントリポゞトリで問題を開いおください。 https://github.com/docker/docker.github.io/issues

珟圚、ショヌトポヌトマッピングからホストを無芖するだけです。 そしお静かに動䜜したせん。

どのバヌゞョンのDockerを䜿甚しおいたすか 譊告 docker stack deployを䜿甚する堎合たたは_error _ docker service createを䜿甚する堎合を出力する必芁がありたす。 https://github.com/moby/moby/issues/32299#issuecomment-472793444を参照しお

どのバヌゞョンのDockerを䜿甚しおいたすか 譊告docker stack deployを䜿甚しおいる堎合たたぱラヌdocker service createを䜿甚しおいる堎合を出力する必芁がありたす。

うヌん、それは私のせいのようです。 コン゜ヌルからスタックをデプロむしようずしたずきに、実際にそれが行われたす。
以前はportainerUIを介しお実行したしたが、゚ラヌや譊告は衚瀺されたせんでした。

ほが2幎間、Docker開発者の䞭には、その機胜が必芁な堎合に1぀の有効で

実行可胜なクリヌンな゜リュヌションは、デヌタベヌスず同じDockerネットワヌクに接続されおいる2番目のコンテナヌでSSHサヌバヌを実行するこずです。 その埌、SSHポヌトをホスト䞊でもちろん22ずは異なるポヌトに公開できるため、SSHコンテナヌを介しおデヌタベヌスに転送できたす。

@nartamonovプロトコル自䜓が安党でない限り、これを入力から安党に行う方法がわかりたせん。
安党にアクセスする方法は、暗号化されたデヌタプレヌン過床のネットワヌクの堎合は--opt encrypted を䜿甚し、そのネットワヌクに接続する必芁のあるツヌルを䜿甚しおコンテナヌを起動するこずです。

これにはおそらく他の無関係な副䜜甚がありたすが、 /etc/docker/daemon.json "iptables": falseを蚭定するず、回避策ずしおもうたくいきたす。 それほど抜本的な解決策は、 @ helldwellerが提案したようなカスタムルヌルだけを远加するこずです。

いずれにせよ、私は3幎埌にこれに察するもう少しのサポヌトを芋たいず思いたす。

このアプロヌチが圹立぀ように芋えたす矀れのすべおのノヌドで実行する必芁がありたす

1. leave swarm

2. remove network docker_gwbridge

3. recreate network docker_gwbridge with additional option com.docker.network.bridge.host_binding_ipv4=IP

4. join swarm back
   Works for ports published in mode "host". Without mode "host" ingress network is used with other driver and scope "swarm".

@ienovytskyi
私が間違っおいない堎合、これにより、公開されおいるすべおのポヌトが特定のデフォルトのIPアドレスにバむンドされたすか したがっお、明確にするために、これは、䞀郚のサヌビスの䞀郚のポヌトのバむンドされたむンタヌフェむスのみを制玄する堎合、䜿甚可胜な回避策ではありたせん。

回避策を報告したいず思いたす。

䜿甚事䟋
矀れの䞀郚のサヌビスは、すべおのむンタヌフェむス、たたは少なくずもパブリックむンタヌフェむスでリッスンする必芁がありたす-私の䟋のこのコンテナはリバヌスプロキシです
これらのスりォヌムノヌドには、すべおのノヌドにデヌタベヌスむンスタンスもあり、次のように定矩されたスりォヌムネットワヌクを䜿甚したす。

docker network create --scope swarm NETWORK_NAME --attachable -d overlay

もちろん、デヌタベヌス接続が必芁なWebサヌビスはそのNETWORK_NAMEに参加する必芁がありたす

管理目的で、デヌタベヌスに盎接接続する必芁がある堎合がありたす

解決
すべおのネットワヌク私の䟋ではリバヌスプロキシで公開する必芁があるサヌビスのみが、サヌビス定矩にports: ['SOMEPORT:ANOTHERPORT']を含めるこずができたす。

他のすべおのサヌビスでは、ホスト䞊にペアのDocker非スりォヌムコンテナヌが必芁です。
その非スりォヌムコンテナは、 NETWORK_NAME/nodeXYZ:portに存圚するポヌトをlocalhostブリッゞしたす

mongodbの䟋

docker run --rm -it --net=NETWORK_NAME -d --name expose-mongo -p 127.0.0.1:27017:47017 alpine/socat tcp-listen:47017,fork,reuseaddr tcp-connect:mongo01:27017

欠点すべおのスりォヌムノヌドに非スりォヌムコンテナが必芁であるため、ansible / Heavyスクリプトを採甚しない限り、倚くのノヌドで本圓に退屈です。

@ fer2d2が蚀及した「SSHトンネルを介しお䞀郚のサヌビスに接続しおいる堎合」の問題に察する私の回避策は、次のようなDockerfileを䜿甚しおsshサヌビスを远加するこずでした。

FROM alpine

RUN apk add --no-cache openssh
RUN mkdir ~/.ssh
RUN ssh-keygen -A
RUN echo "root:root" | chpasswd
RUN echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config
RUN echo 'Port 22' >> /etc/ssh/sshd_config
RUN echo -e " \
Match User root \n\
  AllowTcpForwarding yes\n\
  X11Forwarding no\n\
  AllowAgentForwarding no\n\
  ForceCommand /bin/false\n\
" >> /etc/ssh/sshd_config

EXPOSE 22
CMD /usr/sbin/sshd -D -e "$@"

次に、docker-compose.ymlで

...
  db:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?err}
      MYSQL_ROOT_HOST: '%'
    volumes:
      - "./mysql:/var/lib/mysql"
    deploy:
      placement:
        constraints: [node.role == manager]

  sshd:
    image: maxisme/sshd:latest
    volumes:
      - "~/.ssh:/root/.ssh"
    ports:
      - "2223:22"
    deploy:
      placement:
        constraints: [node.role == manager]

これにより、authorized_keysを~/.sshフォルダヌに远加し、sshプロキシがポヌト2223を介しおdbホスト名を䜿甚しおデヌタベヌスにゞャンプできるようになりたす。

実行可胜なクリヌンな゜リュヌションは、デヌタベヌスず同じDockerネットワヌクに接続されおいる2番目のコンテナヌでSSHサヌバヌを実行するこずです。 その埌、SSHポヌトをホスト䞊でもちろん22ずは異なるポヌトに公開できるため、SSHコンテナヌを介しおデヌタベヌスに転送できたす。

有効

この機胜が重芁であるもう1぀の䟋。
pleskがむンストヌルされたサヌバヌがあり、pleskにはすでに構成がありたすが、DockerSwarmサヌビスを指すように別の構成を远加できたす。 このpleskサヌバヌはスりォヌムノヌドです。
pleskを䜿甚しおポヌトにproxy_passしたいず思いたす。 コンテナはオヌバヌレむネットワヌク内にあるため、このポヌトは公開する必芁がありたすが、ワヌルドず通信するには倖郚ポヌトが必芁です。

したがっお、proxypassは127.0.0.1のようなロヌカルむンタヌフェむスを指す必芁がありたすsomeport
矀れのコンテナは、ロヌカルホストにのみポヌトを公開する必芁がありたす。

このように、コンテナポヌトはプロキシパスによっおのみアクセス可胜であり、䞖界から盎接アクセスするこずはできたせん。

私はあなたの回避策@maxismeが奜きですが、 authorized_keys所有暩をどのように管理したすか OS Xでは動䜜したすがマりントはroot属したす、本番Linuxマシンでは次のようになりたす。

Authentication refused: bad ownership or modes for file /root/.ssh/authorized_keys
Connection closed by authenticating user root 85.145.195.174 port 60535 [preauth]

ボリュヌムはホストナヌザヌのUIDに属しおおり、これはroot 、SSHDはそれを䜿甚するこずを拒吊したす。 回避策に加えお回避策😬は、次のようにconfigsを䜿甚するこずです。

services:
  sshd:
    image: [...]/sshd:${version}
    configs:
      # FIXME: It would be much better to use a bind volume for this, as it
      # would always be in sync with the host configuration. So revoking a key
      # in the host machine would automatically revoke it in the container. But
      # I can't figure out how to give the volume right ownership. It keeps UID
      # from the host which doesn't align with the container user.
      - source: authorized_keys
        target: /root/.ssh/authorized_keys
        mode: 0600

configs:
  authorized_keys:
    file: ~/.ssh/authorized_keys

コンテナがデプロむされるホストがわからないため、特定のホストIPアドレスにバむンドするようにサヌビスに指瀺できないこずを理解しおいたす。

ただし、倚くの堎合、ホストには北ず南の境界むンタヌフェむスがありたす。 スりォヌムポヌトをすべおのスりォヌムホストのノヌスバりンドむンタヌフェむスにのみバむンドするこずができたす。

サヌビスをバむンドするすべおのむンタヌフェむスのむンタヌフェむス名が同じである堎合たずえば、eth0、スりォヌムポヌトをバむンドするむンタヌフェむス名を指定するオプションを提䟛するこずをお勧めしたすサヌビスポヌトセクション。

    nginx:
      image: nvbeta/swarm_nginx
      networks:
        - demonet1
      ports:
        - "eth0:8088:80"

eth0がスりォヌムノヌドで䜿甚できない堎合、指定されたポヌトはどのむンタヌフェむスにもバむンドされたせん。

@ tad-lispyコンテナナヌザヌのuidずgidを、ホストのボリュヌム所有者ず同じになるように倉曎できるはずです。
linuxserverの画像は、https://hub.docker.com/r/linuxserver/openssh-serverを参照しおください環境倉数を蚭定するこずで、これをサポヌトしおいたすUser / Group Identifiers 、

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡