web-dev-qa-db-ja.com

新しいWindows 10(Ubuntu)bashユーザースペースでDockerをネイティブに実行できますか?

私の理解では、他のOSでdockerを実行する際の主な制限は、それを可能にしたLinuxネットワークコンテナーでした。 (確かにMac向け)。

最近 Microsoftが発表 aのベータ版 bunt linux ユーザーモード Windows 10でネイティブに実行されます。これにより、WindowsでELF形式でコンパイルされたバイナリを実行できます(コンパイルが必要なcygwin)

私の質問は:Dockerを新しいWindows 10(Ubuntu)bashユーザー空間でネイティブに実行できますか?

127
Hawkeye

UbuntuのWSL/WindowsのDebianで、Docker Desktop for Windowsをエンジンとして、Docker for Linuxをクライアントとして使用できます。 TCP経由で接続します。

Windows用のDockerデスクトップをインストールします。 https://hub.docker.com/editions/community/docker-ce-desktop-windows Linuxコンテナーの代わりにWindowsコンテナーを使用する場合は、両方のタイプのコンテナーをbashユーザー空間のLinux Dockerクライアントによって管理されます。

バージョン17.03.1-ce-win12(12058)以降、Linux DockerクライアントがTCPによるWindows Dockerデーモンとの通信を継続できるようにするには、Expose daemon on tcp:// localhost:2375 without TLSをチェックする必要があります

次の手順を実行します:

cd
wget https://download.docker.com/linux/static/stable/`uname -m`/docker-19.03.1.tgz
tar -xzvf docker-*.tgz
cd docker
./docker -H tcp://0.0.0.0:2375 ps

または

env DOCKER_Host=tcp://0.0.0.0:2375 ./docker ps

永続化するには:

mkdir ~/bin
mv ~/docker/docker ~/bin

対応する変数を.bashrcに追加します

export DOCKER_Host=tcp://0.0.0.0:2375
export PATH=$PATH:~/bin

もちろん、あなたはdocker-composeをインストールすることができます

Sudo -i
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

またはpython pip

Sudo apt-get install python-pip bash-completion
Sudo pip install docker-compose

そしてBashの完成。一番良いところ:

Sudo -i
apt-get install bash-completion
curl -L https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker > /etc/bash_completion.d/docker
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

Hyper-Vを使用してDockerデスクトップの2.1.0.1(37199)バージョンを使用してテストしました。

$ docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89e8a
 Built:             Thu Jul 25 21:17:37 2019
 OS/Arch:           linux/AMD64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:17:52 2019
  OS/Arch:          linux/AMD64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
Look both client and server say **OS/Arch: linux/AMD64**

ボリューム

ボリュームを追加するときは注意してください。パスC:\dirは、WSLでは/mnt/c/dirとして、Dockerエンジンでは/c/dir/として表示されます。あなたはそれを永久に克服することができます:

Sudo bash -c "echo -e '[automount] \nroot = /'>/etc/wsl.conf"

Wsl.confに変更を加えた後、WSLを終了して再ロードし、WSLが起動時に変更を読み込むようにする必要があります。

[〜#〜]更新[〜#〜]

from: Windows 10バージョン1803のコマンドラインの新機能

nixソケット UnixソケットはWindowsではサポートされていませんでしたが、現在サポートされています! WindowsとWSLの間でUnixソケットを介して通信することもできます。これのすばらしい点の1つは、WSLがLinux Dockerクライアントを実行して、Windowsで実行されているDocker Daemonとやり取りできることです。

[〜#〜]更新[〜#〜]

このスクリプトとUnixソケットの使用は Pengwin のpengwin-setupに含まれていました。

よろしく

104

現在(2016年4月)の時点で、答えは次のとおりです。

まだわかりません(しかし、おそらくわかりません)。

事実

  • Windows 10はさまざまなLinuxプログラムを実行できるようになりました(Bash Shellやさまざまなテキストユーティリティなど)。これらはポートではありません(つまり、たとえば Cygwin のように再コンパイルされたバージョン)。通常のLinuxシステムで実行されるものと同じ ELFバイナリ です。この場合、それらはUbuntuから取得されました。
  • これを可能にするために、Windows 10はLinuxシステムコール(syscalls)を受け入れ、ELFバイナリをロードして実行できるように変更されました( Scott Hanselmanによるコメント )。つまり、変更されていないLinux実行可能ファイルを実行でき、必要に応じて変更されていない共有ライブラリをロードし、WindowsはそれらをWindowsプロセスとして実行します。
  • そのようなLinuxプログラムがカーネルと対話したいときはいつでも、システムコールを発行します(またはライブラリにそれを実行させます)。これが(おそらく)Linuxでの実行との唯一の違いです。Linuxで実行すると、Linuxカーネルがこれらの呼び出しを処理します。 Windows 10では、Windows 10カーネルが代わりに実行します。

憶測

したがって、問題は、Dockerが必要とするシステム呼び出し(特にchrootと名前空間など)が実装されているかどうかです。答えはおそらく「いいえ」です。 Dockerには、プロセスとリソースの管理、およびプロセスの分離のために、かなり高度な(そしてLinux固有の)機能が必要です。これをすべてWindowsで複製することはおそらく可能ですが、多くの作業が必要になります。また、このWindows機能の目標はLinuxユーザー空間プログラムを実行しているように見えるため、すべての作業を行った可能性は低いようです(そして秘密にしておく) 。

しかし、私が知る限り、どちらにしても明確な情報はありません。

既存のDockerポート

もちろん、MicrosoftがWindows 10でのDockerサポートを希望していると判断した場合は、おそらくそれを提供できるでしょう。 Dockerを別のカーネルに移植する前例がいくつかあります。

  • FreeBSDのDockerポート があります。 「実験的」というラベルが付いていますが、原理的には機能しているようです。 Dockerリポジトリの変更されていないDockerコンテナを使用できます。つまり、実際にイメージにLinuxのようなホスト環境を提供します。
  • DockerをWindows(具体的にはWindows Server 2016)に移植するプロジェクトが進行中です。こちらをご覧ください Docker blog entry 2015年8月以降。ただし、上記のFreBSDポートとは異なり、これはDockerを許可するポートになりますWindowsのLinuxイメージではなく、WindowsでWindowsイメージを実行します。 これを指摘してくれたRоryMcCuneに感謝します。
51
sleske

初のインサイダープレビューが昨日リリースされました。 dockerをインストールしようとしましたが、次のエラーで失敗します: docker fail

そのため、最初のプレビューでは現在機能していないように見えます。ただし、多くの人が推測しているように、将来のリリースで機能する可能性があります。

13
CodedBeard

いいえ、できません。

コンテナーを実行するには、Dockerに複数のものが必要です。

  • chroot
  • 名前空間:
    • PID
    • ユーザー
    • 通信網
    • マウント
    • UTS
    • IPC

これらはすべて、Linuxに実装されているカーネル機能です。残念ながら、それらのほとんどは、Windowsで(MicrosoftがWindowsカーネルに実装したLinuxサブシステムでも)代替として使用できる同様の機能を備えていません。これらはすべてOSによって提供される必要があります。

13

Creator Update (2017年6月13日に公開)以降、ネイティブWindows実行可能ファイルをWSLで直接実行できます。つまり、すでにインストールされている場合 Docker for Windows は、C:\Program Filesの下にインストールされているdockerバイナリを呼び出すだけです。末尾が.exeであるため、最も簡単なオプションはエイリアスを作成することです。 .bashrcでは、次のようなものが機能するはずです。

DOCKER_BIN='/mnt/c/Program Files/Docker/Docker/resources/bin'
for f in "$DOCKER_BIN"/*; do
  alias "$(basename "$f" | sed 's/.exe$//')"'="'"$f"'"'
done

これにより、DOCKER_BINディレクトリ内のすべてのファイルのエイリアスが作成されます。

$ type docker
docker is aliased to `"/mnt/c/Program Files/Docker/Docker/resources/bin/docker.exe"'

$ docker --version
Docker version 17.03.1-ce, build c6d412e

注意点:Linuxディレクトリから実行すると、「Unable to translate current working directory」のようなエラーメッセージが表示されます。ちょうどcdをWindowsディレクトリ(例:/mnt/c/Users/YourUsername)に入れれば、大丈夫です。

7
dimo414

Docker 1.12がリリースされ、Linux Dockerクライアントが分離されると、Windows 10 bashでdocker clientを実行できるようになります。

これは、Docker Windowsクライアントを使用している場合はそれほど聞こえないかもしれませんが、クライアント側の機能にdockerを含むLinuxツールチェーンがある場合に役立ちます。

6
mixja

Windows 10バージョン1607ビルド1493.10ではUbuntu Bashに正常にインストールできますが、機能しません:(

単純な「dockerバージョン」で次のようにわかります。

Client version: 1.6.2
Client API version: 1.18
Go version (client): go1.2.1
Git commit (client): 7c8fca2
OS/Arch (client): linux/AMD64
FATA[0000] Get http:///var/run/docker.sock/v1.18/version: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS?

次に「Sudo docker -d」を実行すると、次のエラーが発生します。

FATA[0000] ERROR: You are running Linux kernel version 3.4.0+, which is unsupported for running Docker. Please upgrade your kernel to 3.8+.

したがって、これは間違いなくbash側からのストッパーです。

それにもかかわらず、 Docker for Windows をインストールすると、魅力的に機能し、Linuxサーバーと必要なすべてのものをデプロイできることは明らかです。

> docker version
Client:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      windows/AMD64

Server:
 Version:      1.12.0
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   8eab29e
 Built:        Thu Jul 28 21:15:28 2016
 OS/Arch:      linux/AMD64
4
Bruno Medina

2016年9月現在、いいえ。

Windows上のDockerの現在のすべての実装は仮想化を使用しており、Docker 1.12はWindowsでハイパーバイザーを使用しているため、仮想化に対するコンテナー化の利点がなくなります。

Dockerには、Linuxシステムコールを使用するだけでは不十分です。

プロセスコントロールグループ(cgroups)、スタック可能なファイルシステム(aufs)、およびカーネル外のその他のLinuxベースのシステムが必要です。

CgroupsもaufsもWindows 10カーネルにはネイティブではありません。

ここにWindows Server 2016の実装があります: https://msdn.Microsoft.com/en-gb/virtualization/windowscontainers/quick_start/quick_start_windows_server 。 。しかし、これは一部のWindowsサービスのみを実行します。 UbuntuではなくIIS

3
Graham

Dockerは現在、現在のビルド(14316)では機能しません-インストールできると想定しています。

root@localhost:~# docker --help
runtime: address space conflict: map(0x7ff5ddbb0000) = 0x7ff5ffd20000
fatal error: runtime: address space conflict
2
lgj

差出人: https://blog.docker.com/2016/07/docker-for-mac-and-windows-production-ready/

Faster and more reliable – native development environment using
hypervisors built into each operating system. (No more VirtualBox!)
1
gavenkoa