實習的時候接觸到Docker 也用了一段時間,整理一下對docker的理解。php
版權聲明:本文爲博主ray原創文章,未經博主容許不得轉載。 css
我的博客連接:http://wxinray.com/server/Docker-introductionhtml
Docker 是 Docker.Inc 公司開源的一個基於 LXC技術之上構建的Container容器引擎, 源代碼託管在 GitHub 上, 基於Go語言並聽從Apache2.0協議開源。mysql
官網解釋:nginx
Docker is an open platform for developers and sysadmins to build, ship, and run distributed applicationsgit
所以能夠把Docker理解爲超輕量虛擬機的一種實現。web
簡化配置、代碼流水線管理、提升開發效率、隔離應用、整合服務器、調試能力、多租戶環境、快速部署。sql
Docker一般用於以下場景:docker
web應用的自動化打包和發佈;數據庫
自動化測試和持續集成、發佈;
在服務型環境中部署和調整數據庫或其餘的後臺應用;
從頭編譯或者擴展示有的OpenShift或Cloud Foundry平臺來搭建本身的PaaS環境。
讓咱們想象一個運行環境,當作一個管理系統的時候,須要nginx,php,mysql 以及一些其餘的依賴。因而我須要安裝這些軟件,再裝一堆依賴庫,根據你的操做系統平臺和版本進行設置,有時候還要從源代碼編譯報出一堆莫名其妙的錯誤亦或是軟件版本的不一樣形成的問題,可不是這麼好裝。並且萬一你機器掛了,全部的東西都要從新來,可能還要把配置在從新弄一遍。這十分的麻煩和浪費時間。
使用Docker就能夠幫你解決這方面的煩惱,就至關於有了一個能夠運行起來的虛擬機,只要將Docker容器運行起來,就能夠省略上述繁瑣的配置和安裝依賴。並且一旦你想換臺機器,直接把這個容器端起來,再放到另外一個機器就行了。硬件,操做系統,運行環境什麼的都不須要考慮了。
而且還能夠經過Docker容器,整個開發、測試和生產環境能夠保持高度的一致。
能夠發現Docker容器功能和 VM 相似,那爲啥不直接用 VM 而還要整出個容器這麼個概念來呢?
由於相比於 VM Docker提供了輕量級的虛擬化,它幾乎沒有任何額外開銷。對好比下:
項目 | 虛擬機 | Docker |
---|---|---|
啓動與中止 | 比啓動windows快 | 快速啓動中止,幾秒內 |
佔用資源 | 需正確解析合理分配 | 下降額外開銷 |
耦合度 | 在硬件設施上運行各類不同的平臺 | 可在不一樣硬件設施和應用環境中使用 |
結構圖 | ![]() |
![]() |
Docker 使用客戶端-服務器(C/S)架構模式,使用遠程API來管理和建立Docker容器。
Docker 容器經過 Docker 鏡像來建立。
一、用戶是使用Docker Client與Docker Daemon創建通訊,併發送請求給後者。
二、Docker Daemon做爲Docker架構中的主體部分,提供Server的功能使其能夠接受Docker Client的請求;而後Engine執行Docker內部的一系列工做,每一項工做都是以一個Job的形式的存在。
三、Job的運行過程當中,
a、當須要容器鏡像時,則從Docker Registry中下載鏡像,並經過鏡像管理驅動graphdriver將下載鏡像以Graph的形式存儲;
b、當須要爲Docker建立網絡環境時,經過網絡管理驅動networkdriver建立並配置Docker容器網絡環境;
c、當須要限制Docker容器運行資源或執行用戶指令等操做時,則經過execdriver來完成。
四、libcontainer是一項獨立的容器管理包,networkdriver以及execdriver都是經過libcontainer來實現具體對容器進行的操做。
五、當執行完運行容器的命令後,一個實際的Docker容器就處於運行狀態,該容器擁有獨立的文件系統,獨立而且安全的運行環境等。
詳細內容見Docker 架構
Docker 內部構建,須要理解如下三種部件:
Docker 鏡像 - Docker images
Docker 倉庫 - Docker registeries
Docker 容器 - Docker containers
Docker 鏡像是 Docker 容器運行時的只讀模板,每個鏡像由一系列的層 組成。Docker 使用 UnionFS 來將這些層聯合到單獨的鏡像中。
當你改變了一個 Docker 鏡像,好比升級到某個程序到新的版本,一個新的層會被建立。
所以,不用替換整個原先的鏡像或者從新創建(在使用虛擬機的時候你可能會這麼作),只是一個新的層被添加或升級了。如今你不用從新發布整個鏡像,只須要升級,層使得分發 Docker 鏡像變得簡單和快速。
Docker 倉庫用來保存鏡像,能夠理解爲代碼控制中的代碼倉庫。Docker 倉庫分爲公有和私有。公有的 Docker 倉庫名字是 Docker Hub。Docker Hub 提供了龐大的鏡像集合供使用。這些鏡像能夠是本身建立,或者在別人的鏡像基礎上建立。Docker 倉庫是 Docker 的分發部分。
Docker Hub 是一個用於分享、管理 Docker 容器的 Docker SaaS 平臺。由Docker公司負責維護的公共註冊中心,包含超過15,000個可用來下載和構建容器的鏡像,並提供認證、工做組結構、工做流工具(好比webhooks)、構建觸發器以及私有工具。
Docker 容器和文件夾很相似,一個Docker容器包含了全部的某個應用運行所須要的環境。每個 Docker 容器都是從 Docker 鏡像建立的。Docker 容器能夠運行、開始、中止、移動和刪除。每個 Docker 容器都是獨立和安全的應用平臺,Docker 容器是 Docker 的運行部分。
下面用一張圖來介紹各部件使用規則:
圖片來源google搜索
ubuntu 系列安裝Docker Engine
參考 官方安裝文檔
$ sudo apt-get install -y docker.io
驗證docker是否安裝成功
sudo docker run hello-world 顯示 Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new Container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/
建立 Docker 用戶組
調整內存和交換空間(swap accounting)
啓用防火牆的端口轉發(UFW)
爲 Docker 配置DNS服務
本文主要結合工做上的需求對docker的作簡單介紹,詳情能夠參閱下面給出的參考連接,下一章節將會介紹DockerFile 編寫,以及docker命令。
版權聲明:本文爲博主ray原創文章,未經博主容許不得轉載。
我的博客連接:http://wxinray.com/server/Docker-introduction