1. 程式人生 > >LCOW —— 單一Docker引擎下可同時執行Linux和Windows容器啦!

LCOW —— 單一Docker引擎下可同時執行Linux和Windows容器啦!

本文來自微軟的技術專家Stefan Scherer,主要介紹了LCOW這一新功能將給Windows 10帶來哪些變化,這對基於Windows 10的開發、除錯都意義非凡。本文作者還結合具體的例項,為我們演示了這一系列變化帶來的諸多便利。

就在上週,Docker官方的master分支上新增了 LCOW (Linux Containers on Windows)功能。啟用這項功能,即可在單一的Docker引擎下,同時執行Linux和Windows容器。


下面趕緊跟小編一起,看看Windows 10將會發生哪些變化?
lcow-marked.jpg
  • 可以用Docker命令docker ps,列出所有正在執行的Linux或Windows容器。
  • 在容器和主機之間通過儲存卷共享資料。
  • 容器之間可以通過容器網路互相通訊。
  • 通過將埠對映到主機,實現本地訪問。但目前,它還只是Windows 10 1803版預覽體驗計劃(Windows Insider)的一項功能。

執行Linux容器

現在,你需要指定
--platform 來拉取Linux映象。如果拉取的是一個既有Linux又有Windows的多重架構的映象,同樣需要指定該選項。
docker pull --platform linux alpine

映象拉取完畢即可執行,無需指定 --platform 選項。
docker run alpine uname -a

另外,Windows上執行Linux容器需要一臺小型的Hyper-V虛擬機器。同時,LinuxKit專案提供了LCOW的映象,請參照: https://github.com/linuxkit/lcow

共享儲存

接下來我們看一下,如何用一種簡單的方式,實現不同平臺容器間的資料共享。

方法是把Linux和Windows容器,繫結到同一個儲存卷。

下面的例子中,Linux和Windows容器通過主機的一個共享資料夾,實現資料共享。
2.gif
首先,在Windows 10 上新建一個資料夾。
cd \
mkdir host

啟動Linux容器

在Windows 10主機上啟動一個Linux容器,並且將主機上的共享資料夾掛載到該容器的 /test 資料夾。
docker run -it -v C:\host:\test alpine sh

我們在 /test 資料夾下,新建一個名為hello-from-linux.txt的檔案。
uname -a > test/hello-from-linux.txt

啟動Windows容器

在Windows 10主機上啟動一個Windows容器,並且將主機上的共享資料夾掛載到該容器的 C:\test 資料夾。
docker run -i -v C:\host:C:\test microsoft/nanoserver:1709 cmd

我們在 C:\test 資料夾下,新建一個名為hello-from-windows.txt的檔案。
ver > test\hello-from-windows.txt

測試結果

上述兩個容器中新建的檔案,都儲存在Windows 10 主機的共享資料夾。
PS C:\> dir host


Directory: C:\host


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        1/21/2018   4:32 AM             85 hello-from-linux.txt
-a----        1/21/2018   4:33 AM             46 hello-from-windows.txt

在開發過程中,如果需要共享配置檔案或程式碼的話,這實在是太方便了有木有~

混合編排

值得一提的是,使用Docker Compose還可混合編排容器。下面是一個混合編排Linux和Window web伺服器的例子。
version: "3.2"

services:

  web1:
    image: nginx
    volumes:
      - type: bind
        source: C:\host
        target: /test
    ports:
      - 80:80

  web2:
    image: stefanscherer/hello-dresden:0.0.3-windows-1709
    volumes:
      - type: bind
        source: C:\host
        target: C:\test
    ports:
      - 81:3000

networks:
  default:
    external:
      name: nat

你也可以思考一下,如何編排一個Linux資料庫和Windows前端,反過來也一樣。

如何搭建你的LCOW測試環境

如果你想試著玩一下LCOW,建議使用Windows 10 1709虛擬機器。

Azure

我在微軟Azure上用Windows 10 1709虛擬機器測試過LCOW。你可以選擇具有巢狀式hypervisor的V3 機器以便執行Hyper-V容器。

容器和Hyper-V

首先,啟用容器和Hyper-V功能:
Enable-WindowsOptionalFeature -Online -FeatureName containers -All -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All -NoRestart

LinuxKit

然後,為你的LCOW安裝一個LinuxKit映象。下面是我下載的最新版LinuxKit,你也可以自行從 linuxkit/lcow 下載。
Invoke-WebRequest -OutFile "$env:TEMP\linuxkit-lcow.zip" "https://23-111085629-gh.circle-artifacts.com/0/release.zip"
Expand-Archive -Path "$env:TEMP\linuxkit-lcow.zip" -DestinationPath "$env:ProgramFiles\Linux Containers" -Force

建立Docker

現在,你可以下載並安裝Docker引擎了。
Invoke-WebRequest -OutFile "$env:TEMP\docker-master.zip" "https://master.dockerproject.com/windows/x86_64/docker.zip"
Expand-Archive -Path "$env:TEMP\docker-master.zip" -DestinationPath $env:ProgramFiles -Force

接下來,安裝Docker service並開啟實驗功能。
. $env:ProgramFiles\docker\dockerd.exe --register-service --experimental

緊接著,配置PATH以便使用Docker CLI。
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";$($env:ProgramFiles)\docker", [EnvironmentVariableTarget]::Machine)

恭喜你!現在可以重啟機器了。重啟過程中會自動更新容器和Hyper-V的配置。如果一切順利,重啟完後Docker engine應該已經起來並處於執行狀態了,這時你可以在PowerShell終端使用Docker CLI。

本地的Vagrant環境

如果你的 Vagrant 安裝了Hyper-V或VMware,那就更方便了。只需幾個命令,就可輕鬆搭建本地測試環境。

你只需要從我的GitHub下載包含LCOW環境的docker-windows-box,執行以下命令就可以了。
git clone https://github.com/StefanScherer/docker-windows-box
cd docker-windows-box
cd lcow
vagrant up

如果你的Windows 10虛擬機器上沒有Vagrant base box,系統會自動下載安裝。如果已經下載了,則只進行安裝。

總結

未來幾個月,隨著這些Docker新功能加入到Windows,Windows 10無疑將成為2018年最具吸引力的開發者平臺。

想象一下,你用 docker-compose.yml 編排Linux和Windows容器,通過Visual Studio Code實時除錯你的應用程式,等等。

如果您喜歡這篇文章,請分享給您的朋友。如果想了解Windows容器的最新情況,請關注原文作者的推特 @stefscherer