web-dev-qa-db-ja.com

WindowsコンテナはLinux上でホストできますか?

Windows ContainersonLinuxを実行することは可能ですか?シナリオは.NET(old net)で書かれたアプリと、これをDockerで実行してnet462を作成したいLinuxユーザーに基づいています。 localhostに対するAPI。

Docker Desktop for Windows のベータ版を使用しています

もしそうでなければ、なぜWindowsはLinuxコンテナを動かすことができ、その逆もできないのでしょうか?

編集:

しばらくしてこの質問はよくある質問です。回避策として新しいネットスタンダードを使用することをお勧めします。それは私が4.6.2フレームワークを新しいライブラリに詰め込むことを可能にしました。

152

Update3:06.2019いくつかのコメントは答えが明確ではないと言っています、私は明確にしようとします。

TL; DR:

Q:WindowsコンテナをLinuxで実行できますか?

A:いいえコンテナは基盤となる運用システムリソースとドライバを使用しているため、WindowsコンテナはWindowsでのみ実行でき、LinuxコンテナはLinuxでのみ実行できます。

Q:しかし、Docker For Windowsはどうですか?それとも他のVMベースのソリューションですか?

A:Docker for Windowsでは、Linuxコンテナ(Windows、ただし内部はLinux VMが作成されるため、まだLinuxコンテナはLinux上で実行され、WindowsコンテナはWindows上で実行されています。

ボーナス: この非常に素晴らしい記事 WindowsでのLinux Dockerコンテナの実行について読む

Q:だから、.Net Framework 462で何をすべきかアプリ、コンテナで実行したい場合は?

A:状況によります。いくつかの推奨事項に従ってください:

  • 可能であれば-.Netコアに移動します。 .Net Coreは、.Net Frameworkのほとんどの主要機能と.Net Framework 4.8のサポートを提供するため、 。Net frameworkの最後のバージョンになります
  • .Net Coreに移行できない場合(@Sebastianが述べたように)、ライブラリを.Net Standardに変換し、2つのバージョンのアプリ(1つは.net Framework 4.6.2に、もう1つは.Net Coreに)を使用することはできません。 Visual Studioは常に明確にサポートしています(マルチターゲットを使用)。ただし、一部の依存関係には特別な注意が必要な場合があります。

  • (推奨しません)場合によっては、Windowsコンテナーを実行できます。 Windowsコンテナはますます成熟し、Kubernetesなどのプラットフォームでのサポートが向上しています。ただし、.Net Frameworkコードを実行するには、1.4 GBのようなイメージサイズの「Server Core」のベースイメージで実行する必要があります。同じまれなケースでは、コードを.Net Coreに移行できますが、イメージサイズ95MのWindows Nanoサーバーで実行できます。

履歴の古い更新も残します

Update2:08.2018Docker-for-Windowsを使用している場合は、両方のウィンドウとlinux containersimultaneouslyhttps://blogs.msdn.Microsoft.com/premier_developer/2018/04/20/running-docker- windows-and-linux-containers-simultaneously /

ボーナス:質問には直接関係ありませんが、Linuxコンテナ自体だけでなく、kubernetesのようなオーケストレーターも実行できるようになりました: https ://blog.docker.com/2018/07/kubernetes-is-now-available-in-docker-desktop-stable-channel/

2018年に更新:

一般的に元の答えは正しい、が、数か月前に、dockerが追加されました 実験機能LCOW (- 公式githubリポジトリ )。

この投稿 から:

Docker for Windowsは既にLinuxコンテナーを実行していませんか?そのとおり。 Docker for Windowsは、Hyper-V Moby Linux VMを介したLinuxコンテナーのサポートにより、LinuxまたはWindowsコンテナーを実行できます(Docker for Windows 17.10以降、このVMはLinuxKitに基づいています)。

LCOWでLinuxコンテナを実行するためのセットアップは、Hyper-V Linux VMがLinuxを実行する以前のアーキテクチャよりもずっと簡単です。 Dockerデーモンとすべてのコンテナ。 LCOWを使用すると、DockerデーモンはWindowsプロセスとして実行され(Docker Windowsコンテナーの実行時と同じ)、Linuxコンテナーを起動するたびにDockerはLinuxカーネルでVMを実行する最小限のHyper-Vハイパーバイザーを起動します、runc、および一番上で実行されているコンテナプロセス。

Dockerデーモンは1つだけであり、そのデーモンは現在Windowsで実行されているため、itはすぐに同じネットワーク名前空間でWindowsとLinux Dockerコンテナーを並行して実行できます。これにより、Windows上のDockerユーザー向けの多くのエキサイティングな開発および生産シナリオのロックが解除されます。

オリジナル:

@PanagiotisKanavosのコメントで述べたように、コンテナは仮想化用ではなく、それらはホストマシンのリソースを使用しています。その結果、現在のところ、WindowsコンテナはLinuxマシンで「そのまま」実行できません。

しかし-VMを使用してそれを行うことができます-Windows上で動作します。 LinuxホストにWindows VMをインストールできます。これにより、Windowsコンテナーを実行できます。

それで、私見はPROD環境でこのようにそれを実行することは最良のアイデアではありません。

また、 この回答 により詳細が提供されます。

91
evgenyl

いいえ、Linux上でWindowsコンテナを直接実行することはできません。

しかし、あなたはLinux上でwindowsを走らせることができます。

Windows Server/10には、ubuntu OSの基本イメージが同梱されています( 2016年9月以降のベータ版サービスパック )。それがあなたがWindows上でLinuxを走らせることができる理由であり、他の賢明さではありません。こちらをチェックしてください。 https://thenewstack.io/finally-linux-containers-really-will-run-windows-linuxkit/

トレイメニューのdockerを右クリックすると、OSコンテナのLinuxとウィンドウを切り替えることができます。

enter image description here

enter image description here

16
Karthikeyan VK

仮想化とは異なり、コンテナ化は同じホストOSを使用します。そのため、Linux上に構築されたコンテナはWindows上では実行できず、その逆も同様です。

Windowsでは、コンテナのosと同じosを持つように(Hyper-vを使用して)仮想化の助けを借りる必要があります。そうすれば、同じことを実行できるはずです。

Windows用のDockerは、Hyper-v上に構築され、Windows上でLinux Dockerコンテナを実行するのに役立ちます。しかし、私の知る限りでは、Linux上でWindowsコンテナを実行するのに役立つものはありません。

8
sunil bhardwaj

仮想マシン内でWindowsコンテナを使用できます(ゲストOSは要件を満たす必要があります - Windows 10 ProまたはWindows 2016)。

例えば あなたはVirtualBoxを使うことができます 、ただSystem/Acceleration/Paravirtualization Interfaceの中でHyper-Vを有効にしてください。

その後、エラーが原因でDockerが起動しない場合は、設定の「Windowsコンテナに切り替え...」を使用してください。

(これは、受け入れられた回答へのコメントとして移動される可能性がありますが、私はそうするのに十分な評判を持っていません)

6
BalintPogatsa

解決策1-VirtualBoxを使用する

Muhammad Sahputraこの投稿 で示唆したように、Windows OSinsideVirtualBox(VBoxHeadlessを使用-グラフィカルインターフェイスなし)insideDockerコンテナ

また、NATネットワーク構成内のVMセットアップは、ポート転送を行うことができます。これにより、Dockerコンテナーとの間で送受信されるトラフィックをパススルーできます。これにより、最終的には、広い視野で、Linuxマシン上でWindowsベースのサービスを実行できます。

たぶんこれはDockerコンテナの典型的なユースケースではありませんが、間違いなくこの問題に対する興味深いアプローチです。


解決策2-Wineを使用する

単純なアプリケーションで、さらに複雑な場合は、wineをdocker container内で使用してみてください。

このドッカーハブページ は、目標の達成に役立つ場合があります。


数年前にWindowsのdocker-machineで行ったように、Dockerがすぐにネイティブソリューションをリリースすることを願っています。

5
Slavik Meltser

コンテナはOSカーネルを使用します。 Windowsコンテナは実行するためにプロセスを利用します。理論的にはWindowsコンテナはLinux上では動作できません。

ただし、VMstyleソリューションを利用した回避策があります。

私はMac上でVagrantとPackerを使うこの解決法を見つけました、それでそれはLinuxでも同様に働くべきです: https://github.com/StefanScherer/windows-docker-machine

このVagrant環境では、Windowsコンテナを使ってMacBookで作業するためのDocker Machineを作成します。 Docker for Mac LinuxコンテナーとWindowsコンテナーを簡単に切り替えることができます。

Running bash commands enter image description here

ヘッドレスVagrantボックスを構築する

$ git clone https://github.com/StefanScherer/packer-windows
$ cd packer-windows

$ packer build --only=vmware-iso windows_2019_docker.json
$ vagrant box add windows_2019_docker windows_2019_docker_vmware.box

Dockerマシンを作成する

$ git clone https://github.com/StefanScherer/windows-docker-machine
$ cd windows-docker-machine
$ vagrant up --provider vmware_fusion 2019

Windowsコンテナに切り替えます

$ eval $(docker-machine env 2019)
2
workaround

あなたはMSSQLとDOTNETをLinux上で、そしてそれ故に今日ではLinuxコンテナの中で実行することができます。

参照してください: https://hub.docker.com/r/Microsoft/mssql-server-linux/

また: https://hub.docker.com/r/Microsoft/dotnet/

1
dagelf

Docker for WindowsはLinuxコンテナーを完全に実行できますが、理論的には可能ですが、その逆は実際的な理由で実装されていません。

最も明白なものは、Docker for WindowsはLinux VMを自由に実行できるのに対し、Docker for LinuxはそれをVM内で実行するためにWindowsライセンスを必要とするでしょう。

また、Linuxは完全にカスタマイズ可能なので、Docker for Windowsで使用されるLinux VMは、コンテナを実行するために必要な最小限のものだけを含み、わずか数MBに削減されています。約1.5 GB。これは実用的なサイズではありませんが、Linux on Windowsよりもはるかに面倒です。

確かに誰かがWindowsライセンスにバンドルされ、Linuxの下でWindowsコンテナを実行する準備ができているDocker for Linuxのバリエーションを販売することは可能ですが、最終的には避けられないことです。 Windowsベンダのロックイン価格を支払うこと:お金と記憶スペースの両方で。

0
lvella