Windows Server 2016系統的Docker容器
https://blog.csdn.net/enweitech/article/details/80689387
2018年06月14日 14:58:23 天府雲創 閱讀數:2912
版權宣告:本文為EnweiTech原創文章,未經博主允許不得轉載。 https://blog.csdn.net/English0523/article/details/80689387
最近微軟釋出了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 = Automation)Vagrant安裝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