« WSL及びUbuntuのインストール手順を再整理しておく(2018年版) | トップページ | MOLESKINEノートのゴムバンドを交換してみた »

2018.05.01

WSLから名前付きパイプ経由でDocker for Windowsを利用してみる

WSLからDockerの利用を試みましたので、その手順をメモ。
PowerShellからでもDocker for Windowsを使えますが、Docker上でLinux環境を使うつもりなので、そうするとWSLから利用したほうが相互運用性が高いことは明らかです。

WebサイトにはDocker for WIndows標準機能だと2375ポート経由で利用するやり方が出てくると思うのですが、以下にあるように、
WSLから名前付きパイプ経由でDocker for Windowsに接続する方法:Qiita
[Cross Post] WSL Interoperability with Docker:Microsoft Developer
名前付きパイプを使うことができるそうです。ありがとうございます。

そこでここでは、上の記事を参考にして、WSLから名前付きパイプを使ってDoker for Windowsに接続してみます。

上のMicrosoftのサイトには、2375ポート経由だとマルウェアから攻撃に脆弱性があるよ、と書かれており、名前付きパイプを利用するために、npiperelayをmakeして名前付きパイプによりWSLからDocker for Windowsに接続する方法が紹介されています。この方法を参考にして以下の手順を試みました。


# Make sure we have the latest package lists
$ sudo apt update
$ sudo apt upgrade
# Download Go. You should change the version if there's a newer one. Check at: https://golang.org/dl/
$ sudo wget https://dl.google.com/go/go1.10.1.linux-amd64.tar.gz
# unzip Go
$ sudo tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin
$ go get -d github.com/jstarks/npiperelay
# Building the relay
$ GOOS=windows go build -o /mnt/c/Users/<your Windows user>/go/bin/npiperelay.exe github.com/jstarks/npiperelay
$ sudo ln -s /mnt/c/Users/tonop/go/bin/npiperelay.exe /usr/local/bin/npiperelay.exe

上の手順でgo言語をインストールしてnpiperelay.exeをmakeできます。go言語のバージョンは適宜読み替えてください。

次に、socatをインストールして、docker-relayというスクリプトから呼び出すようにします。


# Install socat
$ sudo apt install socat
$ sudo apt install docker.io
$ touch ~/docker-relay
$ chmod +x ~/docker-relay

docker-relayは次のようにしました。上のサイトのコードは変更して次のようにしました。


#!/bin/sh

set -e

do_start () {
exec socat UNIX-LISTEN:/var/run/docker.sock,fork,group=docker,umask=007 EXEC:"npiperelay.exe -ep -s //./pipe/docker_engine",nofork &
}

do_stop () {
ps aux | grep "socat UNIX-LISTEN:/var/run/docker.sock" | grep -v grep | awk '{ print "kill -9", $2 }' | sh
if [ -e /var/run/docker.sock ]; then
rm -f /var/run/docker.sock
fi
}

case "$1" in
start)
do_start
;;

stop)
do_stop
;;

restart)
do_stop
do_start
;;

*)
echo "Usage: ~/docker-relay {start|stop|restart}"
exit 1
esac

exit 0

docker-relayは、dockerグループがDockerパイプを介してアクセスさせることができます。ユーザー権限でDockerに接続するために、WSLユーザーにDockerグループを加えます。

$ sudo adduser <your WSL user> docker

Dockerを起動します。
2018042901_3

2375ポートは使用不可とします。
2018050101_2

Dockerを起動した後に、docker-relayを実行します。
次に、例えば、Docker versionを実行してみましょう。


$ sudo docker-relay start
$ docker version

もし、dockerにうまく接続できない、パイプが機能しない、ということがあったら、
docker-relay をrestartするか、Docker for Windowsを再起動してください。
2018042901_2

Dockerコンテナに、ホスト(ここではWSL)のディスクボリュームをマウントする方法は、以下のとおりです。


$ docker run -v C:/Users/<your Windows user>/tmp:/root/tmp -it <docker image> bash

/mnt/c/指定は正しくありません。Docker for WindowsはあくまでWindowsアプリとして振る舞うからです。

もしかしたらディスクマウントの共有マウントがうまくいかないかもしれません。その場合は、以下を試してみてください。

2018042901_3_2

2018042902_2

Reset credentialをクリックしてディスクマウント認証をやり直します。Cドライブのチェックが外れたらチェックしてApply(適用)します。この後に、再度docker run -v ...を試してみてください

今回はこのブログの200回目の記事となりました。引き続きよろしくお願い申し上げます。

|

« WSL及びUbuntuのインストール手順を再整理しておく(2018年版) | トップページ | MOLESKINEノートのゴムバンドを交換してみた »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1024423/73321908

この記事へのトラックバック一覧です: WSLから名前付きパイプ経由でDocker for Windowsを利用してみる:

« WSL及びUbuntuのインストール手順を再整理しておく(2018年版) | トップページ | MOLESKINEノートのゴムバンドを交換してみた »