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を間に挟んでゴニョゴニョすればできるんだろうけど