Windows Server 2016系統的Docker容器初體驗

天府雲創發表於2018-06-14

最近微軟釋出了Windows Server 2016正式版,其中最讓廣大開發者和運維同學期待的就是Docker對Windows容器的支援。

2017年3月 . Docker 推出原生版本的管理工具 Docker for Window.

這裡的原生,指的不是原生的 Windows API,而是不使用 VirtualBox.是使用 Hyper-V…但骨子裡,最終還是使用的 Linux API

windows下安裝docker的方法應該參考docker官網,之前參考的是網上其他人翻譯的部落格,出了一些問題,後來發現,是由於docker更新速度較快,安裝官網的方法最為妥當!(國外的開源軟體的安裝配置最好看官方網站文件

Windows支援兩種不同型別的容器,即 Windows Server 容器和 Hyper V 容器。 這兩種型別的容器的使用方式相同,也支援相同的容器映像。 但是它們的實現機制不同,提供了不同的安全隔離級別

  • Windows Server 容器 - 非常類似與Linux中的容器,使用通過名稱空間、資源控制實現程式隔離。每個Windows Server容器都與宿主機共享同一個核心。
  • Hyper V 容器 - 每個容器都執行在一個高度優化的Hyper V虛擬機器中,所以容器擁有獨立的核心。這樣容器的隔離性會更好,但是啟動速度會慢一些,其資源佔用也會增加。

如果你手邊沒有Windows Server 2016的環境,我們也可以在Windows 10 作業系統上,使用Docker for Windows來開始實驗。

下面引用Docker 中文指南中的幾個提示:

提示1:Docker 已經在windows7.1和windows 8上通過測試,當然它也可以在低版本的windows上使用。但是你的處理器必須支援硬體虛擬化。

提示2:Docker 引擎使用的是Linux核心特性,所以我們需要在 Windows 上使用一個輕量級的虛擬機器 (VM) 來執行 Docker。我們使用 Windows的Docker客戶端來控制 Docker 虛擬化引擎的構建、執行和管理 。

提示3:為了簡化這個過程,我們設計了一個叫 Boot2Docker 的應用程式,你可以通過它來安裝虛擬機器和執行 Docker。

提示4:雖然你使用的是 Windows 的 Docker 客戶端,但是 docker 引擎容器依然是執行在 Linux 宿主主機上(現在是通過Virtual box)。直到我們開發了 windows 版本的 Docker 引擎,你只需要在你的 Windows 主機上啟動一個 Linux 容器。

Windows安裝docker環境的基本要求:

(1)必須是64位作業系統,win7或者更高 (推薦Windows 10/server 2016 因為新版整合了很多新元件
(2)支援“ Hardware Virtualization Technology”,並且,“virtualization ”可用(也就是在BIOS啟用VT引數)

Docker在windows安裝方法有兩種:

1、微軟官方提供的docker安裝 此方法直接通過Powershell直接命令安裝(今天我們著重講這個安裝方法)

2、通過docker網頁下載的獨立安裝包到作業系統上進行一步步安裝配置

Docker開始區分Docker Community Edition(社群版)和Docker Enterprise Edition(企業版)

https://blog.csdn.net/tina_ttl/article/details/51372604  https://blog.csdn.net/ltyzsd/article/details/79040021

3、通過Hyper進行安裝docker容器

https://blog.csdn.net/sanyuedexuanlv/article/details/78759743  https://yq.aliyun.com/articles/62375

工作中對Windows Server 2016下的Docker,也評估了一段時間了,特此做一些分享,幫助大家填坑。本系列的討論主要關注Windows Server 2016下的原生Docker容器,不涉及Hyper-V模式的容器。

如果想使用Vagrant安裝,可以使用jacqinthebox/windowsserver2016和stefanscherer/windows_2016_docker這兩個box。不過,vagrant box國內網路下載速度超慢,反而微軟官網的下載速度還行,所以其實自己下載試用版的Windows Server 2016的ISO安裝也花不了多少時間。(Packer + Vagrant = AutomationVagrant安裝docker方法詳見http://www.dockerinfo.net/834.html

假設你已經有了一個全新安裝的Windows Server 2016帶GUI的系統,並且已經安裝了全部更新補丁,下面就正式開始我們的Windows Server Docker之旅。

開始安裝Docker之旅

一、首先安裝 Windows 更新

執行以下命令,確保 Windows Server 系統保持最新狀態:

複製
sconfig

將出現一個文字配置選單,可以選擇其中的選項 6 下載並安裝更新:

複製
===============================================================================
                         Server Configuration
===============================================================================

1) Domain/Workgroup:                    Workgroup:  WORKGROUP
2) Computer Name:                       WIN-HEFDK4V68M5
3) Add Local Administrator
4) Configure Remote Management          Enabled

5) Windows Update Settings:             DownloadOnly
6) Download and Install Updates
7) Remote Desktop:                      Disabled
...

出現提示時,選擇選項 A 下載所有更新。(此步驟必須進行,否則後續安裝會失敗或者各種報錯類似於linux各種軟體版本依賴)


二、開啟windows PowerShell然後直接輸入以下命令進行安裝Docker

安裝docker服務一般都會參考微軟官方的quickstart windows server文件,按照它的步驟安裝行不行?行。但是,有一些細節,它分散到別的幾個頁面了,如果你沒有都仔細讀一下,並親自體驗一下相關功能的話,很可能會遇到一些坑。
首先安裝oneget PowerShell模組
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force #指定Nuget安裝包最小版本

再使用oneget 安裝最新版本docker
Install-Module -Name DockerMsftProvider -Force                #安裝docker模組
powershell中詢問你是否確實要安裝來自“DockerDefault”的軟體,選擇“A”全是。
Install-Package -Name docker -ProviderName DockerMsftProvider -Force #安裝docker包

安裝完成重啟計算機(windows一如既往地安裝之後重啟服務才能生效)
Restart-Computer -Force #重新啟動




安裝過程中報錯故障排除

警告: C:\Users\ADMINI~1\AppData\Local\Temp\2\DockerMsftProvider\Docker-17-06-2-ee-13.zip does not exist
Install-Package : 找不到路徑“C:\Users\ADMINI~1\AppData\Local\Temp\2\DockerMsftProvider\Docker-17-06-2-ee-13.zip”,因
為該路徑不存在。
所在位置 行:1 字元: 1
+ Install-Package -Name docker -ProviderName DockerMsftProvider

這是什麼鬼,怎麼會出錯啊!靜下心來看看錯誤Install-Package : 找不到路徑“C:\Users\ADMINI~1\AppData\Local\Temp\DockerMsftProvider\Docker-1-12-2-cs2-ws-beta.zip”,

那我們就開啟這個地址去看看結果發現:

裡面有個json 檔案我們開啟看看

看到這個我明白了,原來是沒有下載下來這個包那麼我們手動下載吧,

https://dockermsft.blob.core.windows.net/dockercontainer/docker-1-12-2-cs2-ws-beta.zip

 "url":  "https://dockermsft.blob.core.windows.net/dockercontainer/docker-17-06-2-ee-13.zip", 直接下載到本地。

 

 

 然後我們把包放到C:\Users\ADMINI~1\AppData\Local\Temp\DockerMsftProvider目錄下然後

 

再執行以下命令
Find-Package –roviderName DockerMsftProvider | Install-Package -Verbose

 

看到提示後我們在輸入A 然後回車

Restart-Computer -Force

重啟以下機器 ,PowerShell 中輸入 docker info 

 

大功告成

提示:如果你希望稍後更新 Docker:

  • 檢視已安裝的版本,檢視時使用 Get-Package -Name Docker -ProviderName DockerMsftProvider
  • 查詢當前版本,查詢時使用 Find-Package -Name Docker -ProviderName DockerMsftProvider
  • 當你準備就緒後,進行升級,升級時使用 Install-Package -Name Docker -ProviderName DockerMsftProvider -Update -Force,後跟 Start-Service Docker

三、部署第一個Windows容器docker

安裝完docker包後,如果你立刻嘗試在命令列執行任何docker命令,比如:docker images,會報無法連線伺服器錯誤,原因是,必須重啟一下機器。

檢視所安裝的docker環境版本:

docker version 或者 docker info

重啟完機器回來,我們應該已經可以執行比如docker images檢視映象這樣的命令了,不過,有可能你開啟一個cmd或者powershell視窗,執行docker images會收到下面的錯誤,不用慌,那是因為你沒有以Adnimistrator超級管理員模式開啟cmd或powershell視窗:...省略... //./pipe/docker_engine: Access is denied ...省略...

對於此練習,你將從 Docker Hub 登錄檔下載預先建立的 .NET 示例映像,並部署執行 .Net Hello World 應用程式的簡單容器。

使用 docker run 部署 .Net 容器。 這也可下載容器映像,可能需要幾分鐘時間。

console複製
docker run microsoft/dotnet-samples:dotnetapp-nanoserver

使用docker run 部署一個.net core hellworld官方應用程式映象

容器啟動後,請列印 hello world 訊息,然後退出。

console複製
         Dotnet-bot: Welcome to using .NET Core!
    __________________
                      \
                       \
                          ....
                          ....'
                           ....
                        ..........
                    .............'..'..
                 ................'..'.....
               .......'..........'..'..'....
              ........'..........'..'..'.....
             .'....'..'..........'..'.......'.
             .'..................'...   ......
             .  ......'.........         .....
             .                           ......
            ..    .            ..        ......
           ....       .                 .......
           ......  .......          ............
            ................  ......................
            ........................'................
           ......................'..'......    .......
        .........................'..'.....       .......
     ........    ..'.............'..'....      ..........
   ..'..'...      ...............'.......      ..........
  ...'......     ...... ..........  ......         .......
 ...........   .......              ........        ......
.......        '...'.'.              '.'.'.'         ....
.......       .....'..               ..'.....
   ..       ..........               ..'........
          ............               ..............
         .............               '..............
        ...........'..              .'.'............
       ...............              .'.'.............
      .............'..               ..'..'...........
      ...............                 .'..............
       .........                        ..............
        .....


**Environment**
Platform: .NET Core 1.0
OS: Microsoft Windows 10.0.14393

有關 Docker Run 命令的深入資訊,請參閱 Docker.com 上的 Docker Run 參考

四、批量管理你的windows docker容器

若要使用 Window 容器,則需要安裝 Docker。 Docker 由 Docker 引擎和 Docker 客戶端組成。

Windows 上的 Kubernetes | Microsoft Docs 

https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/kubernetes/getting-started-kubernetes-windows

以administrator模式開啟powershell視窗,執行docker images,是不是成功了?小興奮 :) 下面你想試試pull一個image或者執行一個未曾下載過的image?如果在牆外,應該沒問題。絕大多數情況下,在牆內的同學會遇到無法連線docker的伺服器錯誤。什麼?有人問什麼是“牆”?那個——請自行google一下百度。言歸正傳,訪問不了牆外的,我們就需要訪問牆內的映象,阿里雲開發者平臺和DaoCloud都提供了免費的docker映象服務,需要先免費註冊一下。

假設你已經註冊了阿里雲開發賬號或者daocloud賬號,拿到比如阿里雲的類似https://xxxxxxxx.mirror.aliyuncs.com的地址,我們需要將映象地址配置到docker服務。請從檔案瀏覽器中開啟C:\ProgramData\docker\config目錄。注意C:\ProgramData\是一個預設隱藏的目錄,直接從C盤瀏覽是看不到,需要自己位址列打一下。接下來,我們需要在config目錄下新建一個名叫daemon.json的文字檔案,包含下面的內容(別忘了將映象地址替換成你自己的,不然後面報地址不能解析別怪我啊):{ "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"] }

然後重啟docker的windows服務,通過GUI重啟,或者,在administrator模式的powershell視窗中執行都可以:Restart-Service docker -f

好了,現在我們可以試著pull或者執行一個docker image了,比如:docker run microsoft/dotnet-samples:dotnetapp-nanoserver

應該可以看到,image成功下載、執行,螢幕列印出下面這個小人:


如果沒看到,一定不是我的錯啦,肯定是你上面的步驟沒看仔細,不如再重新看一遍! 8-)

第一篇就到這裡,自己試試其他docker命令吧!

下一篇,我會手把手帶大家實戰一個傳統iis應用的部署,中間會填滿網路、埠、檔案系統volume等等你遲早會遇到的坑,敬請期待!(docker實戰並且實際應用到生產環境才作重要)

五、附錄windows docker常用的管理命令

https://wenku.baidu.com/view/868c47c36e1aff00bed5b9f3f90f76c661374ce7.html (推薦看一哈通訊原理)

1. 檢視docker資訊(version、info)

# 檢視docker版本 
docker version 

# 顯示docker系統的資訊 
docker info

2. 對image的操作(search、pull、images、rmi、history)

# 檢索image 
docker search image_name

# 下載image 
docker pull image_name 
#列出映象列表; -a, --all=false Show all images; --no-trunc=false Don't truncate output; -q, --quiet=false Only show numeric IDs 
docker images

# 刪除一個或者多個映象; -f, --force=false Force; --no-prune=false Do not delete untagged parents 
docker rmi image_name
 
# 顯示一個映象的歷史; --no-trunc=false Don't truncate output; -q, --quiet=false Only show numeric IDs docker his

3. 啟動容器(run)

docker容器可以理解為在沙盒中執行的程式。這個沙盒包 含了該程式執行所必須的資源,包括檔案系統、系統類庫、shell 環境等等。但這個沙盒預設是不會執行任何程式的。你需要在沙盒中執行一個程式來啟動某一個容器。這個程式是該容器的唯一程式,所以當該程式結束的時候,容 器也會完全的停止。

# 在容器中執行"echo"命令,輸出"hello word" 
docker run image_name echo "hello word" 

# 互動式進入容器中 
docker run -i -t image_name /bin/bash 

# 在容器中安裝新的程式 
docker run image_name apt-get install -y app_name

# 在一次進剛才進入的容器
docker exec -i -t [容器ID]

Note: 在執行apt-get 命令的時候,要帶上-y引數。如果不指定-y引數的話,apt-get命令會進入互動模式,需要使用者輸入命令來進行確認,但在docker環境中是無法響 應這種互動的。apt-get 命令執行完畢之後,容器就會停止,但對容器的改動不會丟失。

4. 檢視容器(ps)

# 列出當前所有正在執行的container 
docker ps 

# 列出所有的container 
docker ps -a 

# 列出最近一次啟動的container 
docker ps -l

5. 儲存對容器的修改(commit)

當你對某一個容器做了修改之後(通過在容器中執行某一個命令),可以把對容器的修改儲存下來,這樣下次可以從儲存後的最新狀態執行該容器。

# 儲存對容器的修改; -a, --author="" Author; -m, --message="" Commit message 
docker commit ID new_image_name

6. 對容器的操作(rm、stop、start、kill、logs、diff、top、cp、restart、attach)

# 刪除所有容器 
docker rm `docker ps -a -q` 
   
# 刪除單個容器; -f, --force=false; -l, --link=false Remove the specified link and not the underlying container; -v, --volumes=false Remove the volumes associated to the container 
docker rm Name/ID 
   
# 停止、啟動、殺死一個容器 
docker stop Name/ID 
docker start Name/ID 
docker kill Name/ID 
   
# 從一個容器中取日誌; -f, --follow=false Follow log output; -t, --timestamps=false Show timestamps 
docker logs Name/ID 
   
# 列出一個容器裡面被改變的檔案或者目錄,list列表會顯示出三種事件,A 增加的,D 刪除的,C 被改變的 
docker diff Name/ID 
   
# 顯示一個執行的容器裡面的程式資訊 
docker top Name/ID 
   
# 從容器裡面拷貝檔案/目錄到本地一個路徑 
docker cp Name:/container_path to_path 
docker cp ID:/container_path to_path 
   
# 重啟一個正在執行的容器; -t, --time=10 Number of seconds to try to stop for before killing the container, Default=10 
docker restart Name/ID 
   
# 附加到一個執行的容器上面; --no-stdin=false Do not attach stdin; --sig-proxy=true Proxify all received signal to the process 
docker attach ID

Note: attach命令允許你檢視或者影響一個執行的容器。你可以在同一時間attach同一個容器。你也可以從一個容器中脫離出來,是從CTRL-C。

7. 儲存和載入映象(save、load)

當需要把一臺機器上的映象遷移到另一臺機器的時候,需要儲存映象與載入映象。

# 儲存映象到一個tar包; -o, --output="" Write to an file 
docker save image_name -o file_path 

# 載入一個tar包格式的映象; -i, --input="" Read from a tar archive file 
docker load -i file_path 
   
# 機器a 
docker save image_name > /home/save.tar

# 使用scp將save.tar拷到機器b上,然後:
docker load < /home/save.tar

8、 登入registry server(login)

# 登陸registry server; -e, --email="" Email; -p, --password="" Password; -u, --username="" Usernamedocker login

9. 釋出image(push)

# 釋出docker映象 
docker push new_image_name

10. 根據Dockerfile 構建出一個容器

#build 
   --no-cache=false Do not use cache when building the image 
   -q, --quiet=false Suppress the verbose output generated by the containers 
   --rm=true Remove intermediate containers after a successful build 
   -t, --tag="" Repository name (and optionally a tag) to be applied to the resulting image in case of success 

docker build -t image_name Dockerfile_path

【參考資料】

1.官方部落格https://blog.docker.com/2016/09/build-your-first-docker-windows-server-container/

2.Get Started, Part 1: Orientation and setup | Docker Documentation https://docs.docker.com/get-started/

3.https://msdn.microsoft.com/virtualization/windowscontainers/containers_welcome

4.Windows下部署安裝Docker - CSDN部落格 https://blog.csdn.net/ltyzsd/article/details/79040021

5.https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/quick-start/quick-start-windows-server


Windows PowerShell ISE 不適用於與容器的互動式會話。 即使容器正在執行,也會顯示為掛起。

首先,從 nanoserver 映像啟動一個具有互動式會話的容器。 啟動容器後,容器中將顯示一個命令列介面。

複製
docker run -it microsoft/nanoserver cmd


相關文章