TCP経由でdocker APIを公開するにはどうすればよいですか?


13

portainerを使用していますが、リモートエンドポイントを管理できません。コマンドラインを使用してリモートDockerノードに接続しようとしましたが、メッセージが表示されましたCannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?

はい、実行中です。私は自分をdockerグループに追加し、ノードにSSHで接続してdockerにアクセスできます。ただし、Dockerノードにリモートでアクセスすることはできません。

/etc/default追加/コメント解除するように修正しましたDOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

私も変更/etc/init.d/docker/etc/init/docker.conf、含めるDOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

Dockerサービスを再起動し、ログアウトしてプロセスで複数回ログインしましたが、リモートノードに接続できません。IPを渡すことでローカルノードに接続することさえできません。

何を逃しましたか?どのファイルのどの構成がAPI over TCPを公開していますか?

user@hostname:~$ docker -H tcp://<REMOTE_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<REMOTE_IP>:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://127.0.0.1:2375 info
Cannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?
user@hostname:~$ docker -H tcp://<LOCAL_IP>:2375 info
Cannot connect to the Docker daemon at tcp://<LOCAL_IP>:2375. Is the docker daemon running?
user@hostname:~$

編集: 実行ps aux | grep -i dockerするとこれが返されます-

root      3581  0.1  0.2 596800 41540 ?        Ssl  04:17   0:35 /usr/bin/dockerd -H fd://
root      3588  0.0  0.0 653576 14492 ?        Ssl  04:17   0:18 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

2375は聞いていますか?ss -ntl
jscott

いいえ。2375でリッスンするものは何もありません。また、どのファイルのどの設定がこれに影響するのかわかりません。ps aux役立つ場合は、回答にの出力を含めました。
ローLord。

同様のことを試みましたが、docker-ceをインストールしたUbuntu 16.04では、/ etc / default / docker、/ etc / init / docker.conf、および/etc/init.d/dockerファイルが単に無視されていると思われますが、誰でも確認できます?「service docker status」を実行すると、実際に発生するのは「systemctl status docker」、他の管理システム全体だと思います。
chrisinmtown

回答:


21

Ivan Krizsanの投稿のおかげで解決策を見つけました。

/lib/systemd/system/docker.serviceUbuntu 16.04.2 LTSシステムで編集して行を変更する必要がありました

ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:

それから

sudo systemctl daemon-reload
sudo systemctl restart docker.service

そしてすべてが働いた:-)。次のステップは、ハイジャックされているドッカーデーモンフォームを保護する方法を見つけることです。


1
この変更により、DockerdはUbuntu 16.04でdocker-ce ver 17.06でHTTPリクエストをリッスンすることを確認します。サービススクリプトを直接変更するのは間違っているように感じます。
chrisinmtown

7
Dockerサービススクリプト(またはサービススクリプト)を直接編集しないでください。SystemDには差分編集機能が組み込まれていますsystemctl edit docker.service。useとsystemctlは、編集した新しいファイルを作成します。これにより、更新によって変更が消去されるのを防ぎます。SystemDは、実行時に2つのファイルをマージします。ここでは良いドキュメント:digitalocean.com/community/tutorials/...
Routhinator

ありがとう!これは非常に便利です。更新中に警告が表示され続けます。これについて見ていきます:_)
ロード・ロー。

4
:Ubuntuのサーバ18.04で、それはこのように働いたExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA

私が使用している場合-H tcp://せず、自身で設定を-H fd://設定、Iは発行しないことができ、クライアントのコマンド、例えば...、ドッキングウィンドウの情報、ドッキングウィンドウのバージョンなど
クリス・F

2

/ etc / defaultディレクトリは、ディストリビューションメンテナが設定ファイルを置く場所です。Dockerのリポジトリから直接dockerをインストールする場合、このディレクトリは使用されません。

/ lib / systemdディレクトリは、パッケージがsystemdファイルをインストールする場所であり、アップグレード時にそこに加えられた変更を上書きします。これを使用すると、変更は失われます。

永続化するsystemdユニットファイルに独自の変更を加えるには、/ etc / systemd / system / docker.service.d /にユニットファイルを作成します。たとえば、ここに標準の/etc/systemd/system/docker.serviceがあります。 d / override.conf:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd

このオーバーライドは、systemdからdockerdデーモンへのすべてのコマンドラインフラグを単に解除します。完了したら、dockerで使用される/etc/docker/daemon.jsonのすべての設定をオーバーライドできます。設定に応じて、デーモンを再起動せずにリロードできます。例えば、ここに/etc/docker/daemon.jsonの例があります:

{
"debug": false,
"experimental": true,
"hosts": ["fd://", "tcp://0.0.0.0:2376"],
"labels": ["foo=bar", "fez=baz"],
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"},
"storage-driver": "overlay2",
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/host-cert.pem",
"tlskey": "/etc/docker/certs/host-key.pem",
"tlsverify": true
}

目的に合わせて、ホストを設定するための行のみが必要です。

上記の構成ファイルの非常に重要な部分の1つは、TLS設定です。クライアントとサーバー間で相互TLSを構成せず、ネットワークでリッスンするためにdockerを開いた場合、パスワードなしで許可されたルートログインで、開いているtelnetサーバーと同等のものを実行しています。telnetよりもsshを好む場合、またはルートアカウントのパスワードを好む場合は、TLSを構成する必要があります。Docker APIポートはインターネット上で頻繁にスキャンされます。この構成手順をスキップすると、しばらくするとホストにマルウェアがインストールされます。

クライアントとサーバーのTLSキーを構成する方法の詳細については、https//docs.docker.com/engine/security/https/を参照してください。


1
Dockerサービスの将来の更新に耐えられる非常に良い答えです。これが正しい方法です。
-Fopedush

2

Dockerデーモンを再構成して再起動したくない場合ncatは、(nmapパッケージから)を使用してunixソケットをTCPソケットにブリッジするだけです。

ncat -lknvp 2375 -c "ncat -U /var/run/docker.sock"

代わりに、socatまたは他のツールを使用できます


すごい!このコマンドをバックグラウンドで実行できますか?端末の接続を閉じると失われます
Felix

ああ、私が見つかりました。nohupそして&
フェリックス

0

Dockerデーモンが接続をリッスンする場所構成する方法を説明した公式ドキュメントがあります

systemd vs daemon.json

systemdユニットファイルとdaemon.jsonファイルの両方を使用して接続をリッスンするようにDockerを構成すると、Dockerの起動を妨げる競合が発生します。

systemdユニットファイルを使用したリモートアクセスの構成

  1. コマンドsudo systemctl edit docker.serviceを使用して、テキストエディターでdocker.serviceのオーバーライドファイルを開きます。

  2. 次の行を追加または変更して、独自の値を置き換えます。

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. ファイルを保存します。

  4. systemctl構成を再ロードします。

    $ sudo systemctl daemon-reload
    
  5. Dockerを再起動します。

    $ sudo systemctl restart docker.service
    
  6. netstatの出力を調べて、Dockerdが構成済みのポートでリッスンしていることを確認して、変更が受け入れられたかどうかを確認します。

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

でリモートアクセスを構成する daemon.json

  1. 次のように、/ etc / docker / daemon.jsonのホスト配列を設定して、UNIXソケットとIPアドレスに接続します。

    {
    "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
    }
    

    systemdユニットファイルとdaemon.jsonファイルの両方を使用して接続をリッスンするようにDockerを構成すると、Dockerの起動を妨げる競合が発生します。

    1. 次の行を追加または変更して、独自の値を置き換えます。

      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd
      
    2. ファイルを保存します。

    3. systemctl構成を再ロードします。

      $ sudo systemctl daemon-reload
      
  2. Dockerを再起動します。

  3. netstatの出力を調べて、Dockerdが構成済みのポートでリッスンしていることを確認して、変更が受け入れられたかどうかを確認します。

    $ sudo netstat -lntp | grep dockerd
    tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    

Dockerクライアントは、DOCKER_HOST環境変数を受け入れ-Hて、クライアントにフラグを設定します。次のコマンドのいずれかを使用します。

$ docker -H tcp://127.0.0.1:2375 ps

または

$ export DOCKER_HOST="tcp://127.0.0.1:2375"
$ docker ps
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.