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


126

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

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

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


4
それは「単なる」bashユーザースペースではありません。それは実際の、かなり完全なLinuxユーザー空間ですが、X Windows、つまりテキストのみではありません。言って、「bashが」..非常によく、テキストのみの制限を伝える
MSalters

私は何か見落としてますか?これは実際に配布されましたか?現時点では、それをベーパーウェアとしてのみ知っています。
マイケルハンプトン

2
しかし私はそれがWindowsサーバー2016と一緒にリリースされる、MicrosoftとドッカーがネイティブWindowsにドッカーをもたらすことに取り組んでいることは注目に値します(私の知る限り、それはまだのように窓のインサイダーにしても利用できません)、彼らはこれを解放するまで、それは明らかではないだろうと思います
Rоryマッキューン

1
@RоryMcCune:おもしろい。ただし、2015年8月のこのDockerブログエントリによると、これはDockerがWindows上のLinuxイメージではなくWindows上のWindowsイメージを実行できるようにするポートになります。
-sleske

2
実際、それがWindowsネイティブDockerの目的です。コンテナ輸送の性質は、あなたがまたは(おそらく)いくつかの仮想化では、Microsoftが開発しているこの新しいサブシステム追加せずに、他のカーネルでシステムを実行することはできませんということです
RоryMcCune氏

回答:


103

Windows用のDockerデスクトップをエンジンとして使用し、Linux用のDockerをクライアントとして使用して、Windows上のUbuntu / DebianのWSLで使用できます。それらをTCP経由で接続します。

Docker Desktop for Windowsをインストールします:https : //hub.docker.com/editions/community/docker-ce-desktop-windows Linuxコンテナーの代わりにWindowsコンテナーを使用する場合は、両方のタイプのコンテナーをLinux dockerクライアントで管理できます。 bashユーザースペース。

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

次の手順を実行します:

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 Desktopの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/mnt/c/dir、WSL上および/c/dir/dockerエンジンごとに表示されます。あなたは永久にそれを克服することができます:

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

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

更新

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

Unixソケット UnixソケットはWindowsではサポートされていませんでしたが、現在はサポートされています!WindowsとWSLの間でUnixソケットを介して通信することもできます。これの素晴らしい点の1つは、WSLがLinux Docker Clientを実行して、Windows上で実行されているDocker Daemonと対話できるようにすることです。

更新

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

よろしく


3
@ joel-pearson様、dockerにはエンジンとクライアントの2つの部分があります。エンジンは、Docker Toolbox(VirtualBoxベース)またはDocker for Windows(Hyper-Vベース)を使用してWindowsで実行されます。どちらも、Dockerチームによって公式にサポートされています。Dockerエンジンはまだbashユーザースペースで実行されません。WindowsのDockerクライアントは、cmd、powershell、またはcygwinで実行できます。この答えは、bashユーザースペースでdockerクライアントを実行する方法です。どうして?個人的にはbashが好きで、完成はうまくいきます。質問はドッカーエンジンに関するものであることに同意しますが、クライアントを探していたときに見つけました。多くの人が同じことをしています。
カルロスラファエルラミレス

1
私はちょうどそれをテストし、1.12で私のために動作します:) Windowsでいくつかの深刻な開発を行うことができるようになったことに非常に興奮しています。
ザックラッセル

2
Windows上のUbuntuでBashの指示を試し、「Dockerデーモンに接続できません。このホストでdockerデーモンが実行されていますか?」いくつかの手順がありませんか?
mpen

5
2017年2月の時点で、これがまだ唯一の方法です。
hdave

3
2017年6月以降、bashシェルからWindows実行可能ファイルdockerを実行できます。Dockerクライアントをインストールする代わりに、をdocker.exe直接使用して、Dockerサブシステムを照会/対話できます。ただし、WindowsのドッカーはWindowsの変数と構成を使用することに注意してください。
ハイメ

51

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

まだわかりません(おそらくそうではありません)。

事実

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

憶測

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

しかし、私が知る限り、どちらの方法でも決定的な情報はありません。

既存のDockerポート

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

  • あるFreeBSD用ドッカーポートが。「実験的」というラベルが付いていますが、基本的には機能しているようです。Dockerリポジトリーからの変更されていないDockerコンテナーを使用できます。つまり、実際にイメージにLinuxのようなホスト環境を提供します。
  • DockerをWindows(具体的にはWindows Server 2016)に移植するプロジェクトが進行中です- 2015年8月のこのDockerブログエントリを参照してください。ただし、上記のFreBSDポートとは異なり、これはDockerがWindowsでWindowsイメージを実行できるようにするポートです。 Windows上のLinuxイメージではありません。これを指摘してくれたR®McCuneに感謝します。

1
更新:現在、MSDNブログのトピックに関する記事があります:Linux用のWindowsサブシステムの概要
-sleske

今日の時点で、それは、Hyper-Vで可能です:tutorials.ubuntu.com/tutorial/...
ニック・スウィーティング

投票数の多い回答が、何が起こっているかを推測するよりも有用であるという理由だけで、私はそれを支持しました。
ジェームズ

13

最初のインサイダープレビューが昨日リリースされました。Dockerをインストールしようとしましたが、次のように失敗します。 ドッカーが失敗する

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


5
実際に試してみることをお勧めします。一つのこと:スクリーンショットのテキストを実際のテキストとして追加してください(Ubuntuターミナルはコピー&ペーストをサポートしています)。「本物の」テキストには多くの利点があります(読みやすく、スクリーンリーダーをサポートし、検索エンジンでクロール可能)
sleske

更新:最終的な記念日の更新を実行しているマシンにdockerを完全にインストールすることができました。ただし、次のdocker ps場合に失敗しますGet http:///var/run/docker.sock/v1.18/containers/json: dial unix /var/run/docker.sock: setsockopt: invalid argument. Are you trying to connect to a TLS-enabled daemon without TLS?
。– kumarharsh

それが今で働くようになっています。tutorials.ubuntu.com/tutorial/...
ニック・スウィーティング

13

いいえ、これは不可能です。

Dockerは、コンテナを実行するために複数のことを必要とします:

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

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


4
実際、Windowsには、ユーザー、マウント、およびIPCの名前空間があります。Active Directoryにはユーザー名前空間が必要であり、マルチユーザー操作にはマウント名前空間とIPC名前空間が必要です。基本的に、Windowsのカーネルオブジェクトマネージャーは、最初のWindows NTリリースから常に名前空間を持っているため、それほど奇妙ではありません。
MSalters

3
また、リモートデスクトップサービスでは、セッションオブジェクトはこれらの名前空間を積極的に使用して、同時操作を提供します。これは、必要なインフラストラクチャがすべて揃っているという意味ではありませんが、主要な部分はそこにあります。についてchrootは、Ubuntu環境にはすでにWIN32のルートとは異なるルートがあることに注意してください。
MSalters

6
実際、どちらにでも答えるのは時期尚早だと思います。Scott Hanselmanのコメントで説明されているように、Windows 10カーネルはLinuxのシステムコールを受け入れるようになりました。したがって、問題は、Dockerが必要とする(chrootおよび名前空間用の)syscallsが実装されたかどうかです。答えは「いいえ」である可能性が高いですが、私が知る限り、決定的な情報はありません。
sleske 16

1
@sleskeは正しいです。この質問には現時点では答えられません。未亡人のLinuxスペースで作業している開発者が何をしているのかについての本当の兆候がなければ「できません」と言うのはかなり不合理です。
ライアン

2
この答えが完全に間違っていると自信を持って述べるのに十分なことはわかりませんが、その言い回しの仕方は、その妥当性について少し懐疑的です。特に「Bashはシンプルなユーザースペースプログラムであり、これらを提供することはできません」と述べ、LinuxのWindow Subsystemを「新しいBash機能」と呼ぶと、この答えはすべてのMicrosoftが行った完全に誤った仮定に基づいているように聞こえますWindowsへのポートbashでした。それは起こったことではありません。Windowsカーネル上で実行されるLinuxカーネルインターフェース全体を開発しました:msdn.microsoft.com/en-us/commandline/wsl/about
Ajedi32

7

Creator Update(2017年6月13日に公開)の時点で、ネイティブのWindows実行可能ファイルをWSLで直接実行できます。これは、既にDocker for Windowsをインストールしている場合は、のdocker下にインストールされているバイナリを単に呼び出すことができることを意味しますC:\Program Files.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ディレクトリから実行すると、「現在の作業ディレクトリを変換できません」などのエラーメッセージが表示されます。cdWindowsディレクトリ(例:)に入るだけで、/mnt/c/Users/YourUsernameうまくいくはずです。


これは、bash環境変数をdocker-compose YMLファイルにピックアップしないようです。そのためのアイデアはありますか?
リューディガーシュルツ

1
Windows dockerバイナリを呼び出しており、Linuxシェルを介して呼び出しているだけなので、これは理にかなっています。それを達成する良い方法があるかどうかはわかりません。
dimo414

6

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

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


4

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

簡単な「ドッカーバージョン」で次のことがわかります。

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側からのストッパーです。

それにもかかわらず、Windows用Dockerをインストールすることができ、魅力的な動作をします。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

3

2016年9月現在、No。

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

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

プロセス制御グループ(cgroups)、スタッカブルファイルシステム(aufs)、およびカーネル外の他のLinuxベースのシステムが必要です。

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

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


2

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

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

驚くばかり!続けてください。
ホークアイ

これはgolang(Dockerで記述されている)でのメモリ割り当ての動作に関連しているようです:groups.google.com/forum
Meade

鉱山はコマンドの後に永久にハングします。
wieczorek1990

1

From: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!)

2
これは、bashでLinuxのdocker clientを実行できるようになったため、使用していない場合はPowerShellを使用しないでください
Carlos Rafael Ramirez

1
彼らがこれをdocker swarmにスケールアップするかどうかを見るのは面白いでしょう。
ホークアイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.