一、Docker簡介
Docker是什麼?
Docker的英文本意是「搬運工」,在程式設計師的世界裡,Docker搬運的是貨櫃(Container),貨櫃里裝的是任意類型的App,開發者通過Docker可以將App變成一種標準化的、可移植的、自管理的組件,可以在任何主流系統中開發、調試和運行。
說白了,docker是一種用了新穎方式實現的輕量級虛擬機,類似於VM,但是在原理和應用上和VM的差別還是很大的.並且docker的專業叫法是應用容器(Application Container)。
為什麼要用容器?
應用容器是個什麼樣子呢,一個做好的應用容器長得就像一個裝好了一組特定應用的虛擬機一樣,比如我現在想用mysql,那我就找個裝好了mysql的容器就可以了,然後運行起來,我就能使用mysql了。
為什麼不能直接安裝一個mysql?安裝一個SQL Server也可以啊,可是有的時候根據每個人電腦的不同,在安裝的時候可能會報出各種各樣的錯誤,萬一你的機器中毒了,你的電腦掛了,你所有的服務都需要重新安裝.但是有了docker,或者說有了容器就不同了,你就相當於有了一個可以運行起來的虛擬機,只要你能運行容器,mysql的配置就省了.而且如果你想換個電腦,直接把容器」端過來」就可以使用容器裡面的服務.
總結Docker的優點可以分為四類:
1.多
可以通過鏡像一部署多個應用,組成完整的架構環境。
2.快
docker容器很輕!很快!容器的啟動時間是次秒級的,節約開發、測試、部署的時間。
3.好
docker容器可以在幾乎所有的環境中運行,物理機、虛擬機、公有雲、私有雲、個人電腦、伺服器等等。
docker容器之間是隔離的,如果容器出現問題,可以通過鏡像快速生成全新的容器保證正常訪問。
4.省
在容器中不用搭建系統,只需要基本的運行環境就可以了,這樣就省去了系統環境硬體的消耗。
docker容器不需要 hypervisor ,他是內核級的虛擬化。
那麼為什麼不用VM?
那麼既然容器和VM這麼類似為什麼不用VM?docker容器相對於VM還是有很多優點的:
1.啟動速度快,容器通常在一秒內可以啟動.而VM要很久.
2.資源利用率高,一台普通伺服器可以跑上千個容器,而跑VM就。。。。。。
3.性能開銷小,VM需要額外的CPU和內存來完成OS的功能,這一部分占據了額外的資源.
為什麼相似的功能在性能上會有如此巨大的差距呢?看一下他們的設計圖,先看VM的:
可見容器是在作業系統層面上實現虛擬化,直接復用本地主機的作業系統,而傳統方式則是在硬體層面實現。
Docker優勢和劣勢
作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。
首先,Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多。
其次,Docker 對系統資源的利用率很高,一台主機上可以同時運行數千個 Docker 容器。
容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而 Docker 只需要啟動 10 個隔離的應用即可。
具體說來,Docker 在如下幾個方面具有較大的優勢。
更快速的交付和部署
對開發和運維(devop)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之後,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速疊代應用程式,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程式是如何創建和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
更高效的虛擬化
Docker 容器的運行不需要額外的 hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
更輕鬆的遷移和擴展
Docker 容器幾乎可以在任意的平台上運行,包括物理機、虛擬機、公有雲、私有雲、個人電腦、伺服器等。這種兼容性可以讓用戶把一個應用程式從一個平台直接遷移到另外一個。
更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。
對比傳統虛擬機總結
特性 | 容器 | 虛擬機 |
啟動 | 秒級 | 分鐘級 |
硬碟使用 | 一般為MB | 一般為GB |
性能 | 接近原生 | 較弱 |
系統支持量 | 單機支持上千個容器 |
Docker 鏡像
Docker 鏡像是 Docker 容器運行時的只讀模板,鏡像可以用來創建 Docker 容器。每一個鏡像由一系列的層 (layers) 組成。Docker 使用UnionFS(聯合文件系統)來將這些層聯合到單獨的鏡像中。UnionFS允許獨立文件系統中的文件和文件夾(稱之為分支)被透明覆蓋,形成一個單獨連貫的文件系統。正因為有了這些層的存在,Docker 是如此的輕量。當你改變了一個 Docker 鏡像,比如升級到某個程序到新的版本,一個新的層會被創建。因此,不用替換整個原先的鏡像或者重新建立(在使用虛擬機的時候你可能會這麼做),只是一個新的層被添加或升級了。現在你不用重新發布整個鏡像,只需要升級,層使得分發 Docker 鏡像變得簡單和快速。
每個docker都有很多層次構成,docker使用 union file systems 將這些不同的層結合到一個image 中去。
例如:centos鏡像中安裝nginx,就成了nginx鏡像」,其實在此時Docker鏡像的層級概念就體現出來了。底層一個centos作業系統鏡像,上面疊加一個ngnx層,就完成了一個nginx鏡像的構建。層級概念就不難理解,此時我們一般centos作業系統鏡像稱為nginx鏡像層的父鏡像。
Docker 倉庫
Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。同樣的,Docker 倉庫也有公有和私有的概念。公有的 Docker 倉庫名字是 Docker Hub。Docker Hub 提供了龐大的鏡像集合供使用。這些鏡像可以是自己創建,或者在別人的鏡像基礎上創建。
倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫註冊伺服器(Registry)混為一談,並不嚴格區分。實際上,倉庫註冊伺服器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標籤(tag)。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是 Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括 Docker Pool等,可以提供大陸用戶更穩定快速的訪問。
當然,用戶也可以在本地網絡內創建一個私有倉庫。
當用戶創建了自己的鏡像之後就可以使用push命令將它上傳到公有或者私有倉庫,這樣下次在另外一台機器上使用這個鏡像時候,只需要從倉庫上pull下來就可以了。
*註:Docker 倉庫的概念跟Git類似,註冊伺服器可以理解為 GitHub 這樣的託管服務。
Docker 容器
Docker 利用容器來運行應用,一個Docker容器包含了所有的某個應用運行所需要的環境。每一個 Docker 容器都是從 Docker 鏡像創建的。Docker 容器可以運行、開始、停止、移動和刪除。每一個 Docker 容器都是獨立和安全的應用平台。
容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平台。
可以把容器看做是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程式。
*註:鏡像是只讀的,容器在啟動的時候創建一層可寫層作為最上層。
與虛擬機相比,容器有一個很大的差異,它們被設計用來運行"單進程",無法很好地模擬一個完整的環境。Docker設計者極力推崇「一個容器一個進程的方式」,如果你要選擇在一個容器中運行多個進程,那唯一情況是:出於調試目的。
容器是設計來運行一個應用的,而非一台機器。你可能會把容器當虛擬機用,但你將失去很多的靈活性,因為Docker提供了用於分離應用與數據的工具,使得你可以快捷地更新運行中的代碼/系統,而不影響數據。
Docker 安裝
docker官網:https://docs.docker.com
Docker值得關注的特性:
o 文件系統隔離:每個進程容器運行在一個完全獨立的根文件系統里。
o 資源隔離:系統資源,像CPU和內存等可以分配到不同的容器中,使用cgroup。
o 網絡隔離:每個進程容器運行在自己的網絡空間,虛擬接口和IP位址。
o 日誌記錄:Docker將會收集和記錄每個進程容器的標準流(stdout/stderr/stdin),用於實時檢索或批量檢索。
o 變更管理:容器文件系統的變更可以提交到新的映像中,並可重複使用以創建更多的容器。無需使用模板或手動配置。
o 交互式shell:Docker可以分配一個虛擬終端並關聯到任何容器的標準輸入上,
CentOS 系列安裝 Docker,Docker 支持 CentOS6 及以後的版本。
CentOS6:
在RedHat/CentOS環境下安裝Docker。官方文檔要求Linux kernel至少3.8以上,且docker只能運行在64位的系統中。由於RHEL6和CentOS6的內核版本為2.6,因此必須要先升級內核。
升級內核(記住一定要升級,要不然會出現很多莫名奇怪的問題,建議用yum安裝)
1、yum安裝帶aufs模塊的3.10內核
#cd /etc/yum.repos.d #wget http://www.hop5.in/yum/el6/hop5.repo #yum install kernel-ml-aufs kernel-ml-aufs-devel |
2、修改grub的主配置文件/etc/grub.conf,設置default=0,表示第一個title下的內容為默認啟動的kernel(一般新安裝的內核在第一個位置),重啟系統,這時候你的內核就成功升級了。
[root@localhost ~]# uname -r 3.10.5-3.el6.x86_64 |
查看內核是否支持aufs:
[root@localhost ~]# grep aufs /proc/filesystems nodev aufs |
對於 CentOS6,可以使用EPEL庫安裝 Docker,命令如下
#yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
#yum install docker-io
啟動docker服務
#service docker start
CentOS7:
Prerequisites(先決條件)
Docker requires a 64-bit installation regardless of your CentOS version. Also, your kernel must be 3.10 at minimum, which CentOS 7 runs.
To check your current kernel version, open a terminal and useuname -rto display your kernel version:
[root@localhost~]# uname -r
Docker 軟體包已經包括在默認的 CentOS-Extras 軟體源里。因此想要安裝docker,只需要運行下面的 yum 命令:
[root@localhost~]#yum install docker
啟動 Docker 服務:
安裝完成後,使用下面的命令來啟動docker服務,並將其設置為開機啟動:
[root@localhost~]#servicedocker start
[root@localhost~]#chkconfigdocker on
(此處採用了舊式的sysv語法,如採用CentOS 7中支持的新式systemd語法,如下:
[root@localhost~]#systemctlstartdocker.service
[root@localhost~]#systemctlenabledocker.service
查看docker版本
#docker version
安裝之前刪除這條否則無法安裝
rm -rf /var/run/yum.pid
查看docker版本:docker info
以上是使用centos7軟體源提供的docker安裝程序
附:也可以按照官方文檔安裝
1. Log into your machine as a user withsudoorrootprivileges.
2. Make sure your existing yum packages are up-to-date.
3.Add the yum repo
$ sudo tee /etc/yum.repos.d/docker.repo<<-'EOF'
[dockerrepo]
name=DockerRepositorybaseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
註:如果我們既想把輸出保存到文件中,又想在屏幕上看到輸出內容,就可以使用tee命令了。tee命令讀取標準輸入,把這些內容同時輸出到標準輸出和(多個)文件中
4.Install the Docker package
$ sudo yum installdocker-engine
5.Start the Docker daemon.
$ sudo service dockerstart
6.Verifydockeris installed correctly by running a test image in a container.
驗證docker安裝正確
$ sudodocker run hello-world
docker默認使用的是unix socket
附:直接輸入docker命令來查看所有的Options和Commands,查看某一個command的詳細使用方法:dockerCOMMAND--help