要把 Windows 和 Linux 分清楚,更要把內核(kernel)和用戶空間(userland)分清楚。
容器內的進程是直接運行於宿主內核的,這點和宿主進程一致,只是容器的 userland 不同,容器的 userland 由容器鏡像提供,也就是說鏡像提供了 rootfs。
假設宿主是 Ubuntu,容器是 CentOS。CentOS 容器中的進程會直接向 Ubuntu 宿主內核發送 syscall,而不會直接或間接的使用任何 Ubuntu 的 userland 的庫。
這點和虛擬機有本質的不同,虛擬機是虛擬環境,在現有系統上虛擬一套物理設備,然後在虛擬環境內運行一個虛擬環境的作業系統內核,在內核之上再跑完整系統,並在裡面調用進程。
還以上面的例子去考慮,虛擬機中,CentOS 的進程發送 syscall 內核調用,該請求會被虛擬機內的 CentOS 的內核接到,然後 CentOS 內核訪問虛擬硬體時,由虛擬機的服務軟體截獲,並使用宿主系統,也就是 Ubuntu 的內核及 userland 的庫去執行。
而且,Linux 和 Windows 在這點上非常不同。Linux 的進程是直接發 syscall 的,而 Windows 則把 syscall 隱藏於一層層的 DLL 服務之後,因此 Windows 的任何一個進程如果要執行,不僅僅需要 Windows 內核,還需要一群服務來支撐,所以如果 Windows 要實現類似的機制,容器內將不會像 Linux 這樣輕量級,而是非常臃腫。看一下微軟移植的 Docker 就非常清楚了。
所以不要把 Docker 和虛擬機弄混,Docker 容器只是一個進程而已,只不過利用鏡像提供的 rootfs 提供了調用所需的 userland 庫支持,使得進程可以在受控環境下運行而已,它並沒有虛擬出一個機器出來。
參考:
https://www.docker.com/what-docker
視頻筆記: Windows Server 和 Docker - John Starks
首先,做技術工作,請珍惜生命,遠離百度;
其次,不翻牆、不用Google、不看英文資料,那請轉行,沒法混。
然後是回答問題,Docker的資料其實很豐富,特別是官方文檔講解非常詳細。
https://docs.docker.com/
另外,Docker有豐富的鏡像庫,Docker Hub,特別是官方(Official)的鏡像可以直接在生產環境中使用,製作比較精良。
https://hub.docker.com/explore/
所有的官方鏡像都有 Dockerfile,以及在github上有全部生成鏡像的配套文件,遵循了Dockerfile的最佳實踐,這些也是很好地學習資料。
另外,在 YouTube 的 Docker 官方頻道下有幾百個視頻講座,從初級到高級用戶都能從裡面學到很多東西。
https://www.youtube.com/user/dockerrun
Docker 屬于敏捷開發的產品,並且處於高速創新階段,每年都會有幾個版本發布。Docker 的版本號結構,目前是 <大版本號>.<小版本號>.<補丁版本號> 的結構。目前 大版本號 基本為 1,小版本號在一直變化。Docker 基本會保持 3 個小版本號 之內的兼容性(如果一個特性宣布廢棄,一般會在 3 個版本後才徹底移除)。
因此在購買 Docker 圖書的時候,應該遵循這樣的原則:觀察一下當前的 Docker 版本號,選擇不要晚於 2 個小版本的 Docker 書籍。 比如寫這段文字時為 1.12.5,那麼就不要購買介紹 Docker 1.9 及其以前版本的書籍了,否則看到的很多東西將會過時而無法使用,或者已經不必如此繁瑣有更簡單的方式去實現了。
總說看官方文檔,可是 Docker 官網文檔經常被牆,看不了怎麼辦?首先感謝偉大的牆及其先祖。
然後,我們可以本地運行 Docker 官方文檔的網站,以 docker 的方式:
$ docker run -d -p 80:4000 docs/docker.github.io
這樣訪問 Docker 宿主的 80 埠,如 http://localhost,就會看到官網文檔了。
對於那些訪問不了我的問答錄的童鞋,同樣可以用這樣的方式來本地運行:
$ docker run -d -p 80:80 twang2218/blog.lab99.org
然後就可以訪問本地 80 埠看到最新的問答錄了。
Docker 1.8以後版本都有什麼改進麼?每個版本發布時,官方博客 https://blog.docker.com都會有專門文章描述這個版本最主要的改進。
https://blog.docker.com/2015/11/docker-1-9-production-ready-swarm-multi-host-networking/
https://blog.docker.com/2016/02/docker-1-10/
https://blog.docker.com/2016/04/docker-engine-1-11-runc/
https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/
首先感謝偉大的牆,然後有條件的可以翻牆下載。
另外,對於不方便翻牆的童鞋們,我上傳了一份到百度雲上,鑑於百度雲這山寨貨文件完整性無法保證,我 zip 壓縮了不同系統的工具。所以較大,不要太介意,慢慢下載 🙂。
連結: https://pan.baidu.com/s/1o7V5scM 密碼: tzxc
ZIP 文件內包含了 md5sum.txt 以及 sha256sum.txt,下載後可以用其確認文件完整性。
校驗解壓縮後,在命令行進入到包含 md5sum.txt 的目錄後,執行:
$ md5sum -c md5sum.txt
docker-for-mac-1.12.3.dmg: OK
docker-toolbox-1.12.3.pkg: OK
boot2docker-1.12.3.iso: OK
如果結果都是 OK,說明校驗成功。
docker-VERSION.tgz: Docker 靜態編譯的一組可執行文件(比如 Jenkins 裡使用這裡面的 docker 命令行工具)
docker-compose-VERSION: Docker Compose 可執行文件
docker-machine-VERSION: Docker Machine 可執行文件
md5sum.txt: 校驗文件
docker-mac-VERSION.zip: macOS 系統(推薦使用 Docker for Mac)
boot2docker.iso,更新新版本時可能會需要。
docker-for-mac-VERSION.dmg: Docker for Mac 安裝文件
docker-toolbox-VERSION.pkg: Docker Toolbox for Mac 安裝文件(如果只需要單機 Docker 環境則不需要裝 Docker Toolbox)
md5sum.txt: 校驗文件
boot2docker-VERSION.iso: Docker Machine 建立本地虛擬機時所需的 boot2docker.iso,更新新版本時可能會需要。
docker-VERSION.zip: Docker Windows 命令行客戶端
docker-compose-VERSION.exe: Docker Compose 可執行文件
docker-machine-VERSION.zip: Docker Machine 可執行文件
docker-toolbox-VERSION.exe: Docker Toolbox for Windows 安裝程序
docker-for-windows-VERSION.msi: Docker for Windows (對於 Windows 10 Build 10586 以後的版本)
md5sum.txt: 校驗文件
相關信息頁面請訪問:https://coding.net/u/twang2218/p/docker-downloader/git
如果發現下載有問題,歡迎提交issue,或者 fork 並 提交 Pull Request
很多人問到 docker, docker.io, docker-engine 甚至 lxc-docker 都有什麼區別?
其中,RHEL/CentOS 軟體源中的 Docker 包名為 docker;Ubuntu 軟體源中的 Docker 包名為 docker.io;而很古老的 Docker 源中 Docker 也曾叫做 lxc-docker。這些都是非常老舊的 Docker 版本,並且基本不會更新到最新的版本,所以不要使用作業系統軟體源中的 Docker。
正確的方法應該是添加 Docker 官方的 apt/yum 源,然後再進行安裝。Docker 官方源中支持 Ubuntu、Debian、CentOS、OpenSUSE等。另外,也可以使用 Docker 官方提供的腳本進行安裝。
curl -fsSL https://get.docker.com/ | sh
如果訪問官方源太慢,可以使用國內的鏡像源安裝:
使用阿里雲的安裝腳本:
curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -使用DaoCloud的Docker安裝腳本:
curl -sSL https://get.daocloud.io/docker | sh改動真的生效了麼?在宿主上運行一下 ps -ef | grep docker 看看,自己做的那些配置有麼?沒有的話就說明沒有生效。那麼就要檢查原因了,除了簡單的忘記了重啟 Docker 服務外,還有可能修改錯了配置文件。
最近兩年處於 upstart/SysinitV 到 systemd 的過渡期,所以配置服務的方式對於不同的系統是不一樣的,要看自己使用的是什麼作業系統,以及什麼版本。
對於 upstart 的系統(Ubuntu 14.10或以前的版本,Debian 7或以前的版本),配置文件可能在
Ubuntu/Debian: /etc/default/docker
而對於 systemd 的系統(Ubuntu 15.04及以後的版本,Debian 8及以後的版本,CentOS/RHEL 7),配置文件則一般在 /etc/systemd/system/ 下的 docker.service 中。如果已經用命令 systemctl enable docker 啟用了 Docker 服務,那麼配置文件應該在:
/etc/systemd/system/multi-user.target.wants/docker.service
具體位置不同系統不同,而且要注意 upstart 的服務配置文件和 systemd 的配置文件的格式也不同,不要混淆亂配:
參考官網文檔:
https://docs.docker.com/engine/admin/configuring/#ubuntu
https://docs.docker.com/engine/admin/systemd/
來源:大橋下的蝸牛
原文:http://t.cn/RI8whG6
題圖:來自谷歌圖片搜索
版權:本文版權歸原作者所有
更多精彩熱文: