それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

docker別ホストから接続、管理SockをTCP経由許可して利用する。

docker の管理を別ホストから行いたい

ほとんどの人はDockerが動いているマシンへ SSHで接続してるともう。

ssh 経由で docker を使う場合

作業用PC ----<SSH>---- docker-host

リモートのDockerがインストールされたマシン中でdocker コマンドを叩いている場合

接続の詳細。

実際には接続がUNIX のソケット経由になっている。

作業用PC ----<SSH>---- docker-host----<unix:/socket>----/var/run/docker.sock

ん?unix/socket?そうですね。ソケットファイル経由です。
「だったら、ファイルじゃなくポートをリッスンすれば直接つながるのでは?」と思った貴方は大正解です。

tcp 接続でダイレクトに接続できる。

docker は TCPリッスンできるので、socket を経由しなくてもダイレクトに接続ができる。

作業用PC --------------- tcp ----------------- docker-host

SSH経由に比べると、ポートは開きっぱなしだし、認証関係もすっ飛ばすし、危険性が高いように思えるかもしれないが 仮想マシン間、開発マシンと仮想マシン、ローカル内部でこれを使うとサクッと接続できるので、便利です。

Docker のTCP接続を有効にする

-H を使って tcp へのリッスンを追加する。

/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

ただしfd を消しちゃうと socket ファイル経由で接続ができなくなる。

ubuntu の docker にTCPをリッスンさせる

ubuntu で apt install docker.io でインストールした apt のdocker の場合、起動管理をsystemd が行っているのでsystemd のサービスファイルを書き換える。

sudo vim /lib/systemd/system/docker.service

該当サービスの ExecStartに -H tcp://0.0.0.0:2375 を追記する。

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

systemd をリロードして docker を再起動する

sudo systemctl daemon-reload
sudo systemctl restart docker

これでTCP経由で接続ができる。

クライアント側から docker接続する

docker コマンドは、DOCKER_HOST 変数で接続先を任意に指定することができる。

DOCKER_HOST=tcp://192.168.100.100:2375 docker ps

または、継続的に変数に入れてあげる。

export DOCKER_HOST=tcp://192.168.100.100:2375
docker ps 

これで、docker を任意のマシンからSSHすることなく操作ができる。

2375 はデフォルトのポートでWindowsのDockerが初期インストール時にデフォルトに設定されていたので。同じものにしました。

portainer / windows docker で使われています。

この機能、portainer や docker windowsで公式に使われています。注意深く見ていると気づいたと思います。

この公式機能であるポートリッスンを使えば、いちいちSSHしなくていんですよね。

portainer などと組み合わせる。

portainer など docker 管理のシステムと組み合わせるときにどうしてもこれらの設定が必要になってくる。

ポート管理に注意

ローカル中のdocker であれば、権限は ユーザーごとに決めることができるが、TCPをリッスンしてしまうと制御不能なので、取り扱い注意ですね。*1

参考資料

How do I expose the docker API over TCP? - Server Fault

*1:前時代のtcpwrapperやxinetd的な systemd.socketを間に挟んでゴニョゴニョすればできるんだろうけど