1)簡介
1.1)什么是Docker
Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部項目,它是基於 dotCloud 公司多年雲服務技術的一次革新,並於 2013 年 3 月以 Apache 2.0 授權協議開源,主要項目代碼在 GitHub 上進行維護。Docker 項目后來還加入了 Linux 基金會,並成立推動 開放容器聯盟(OCI)。
Docker 自開源后受到廣泛的關注和討論,至今其 GitHub 項目已經超過 4 萬 6 千個星標和一萬多個 fork。甚至由於 Docker 項目的火爆,在 2013 年底,dotCloud 公司決定改名為 Docker。Docker 最初是在 Ubuntu 12.04 上開發實現的;Red Hat 則從 RHEL 6.5 開始對 Docker 進行支持;Google 也在其 PaaS 產品中廣泛應用 Docker。
Docker 使用 Google 公司推出的 Go 語言 進行開發實現,基於 Linux 內核的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對進程進行封裝隔離,屬於 操作系統層面的虛擬化技術。由於隔離的進程獨立於宿主和其它的隔離的進程,因此也稱其為容器。最初實現是基於 LXC,從 0.7 版本以后開始去除 LXC,轉而使用自行開發的 libcontainer,從 1.11 開始,則進一步演進為使用 runC 和 containerd。
Docker 在容器的基礎上,進行了進一步的封裝,從文件系統、網絡互聯到進程隔離等等,極大的簡化了容器的創建和維護。使得 Docker 技術比虛擬機技術更為輕便、快捷。
1.2)為什么要用Docker.
- 更高效的利用系統資源
由於容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker對系統資源的利用率更高,無論是應用執行速度,內存損耗或文件存儲速度,都要比傳統虛擬化技術更高效。因此,相比虛擬化技術,一個相同配置的主機,往往可以運行更多數量的應用
- 更快速的啟動時間
傳統的虛擬機技術啟動應用服務往往需要數分鍾,而Docker容器應用,由於直接運行於宿主機內核,無法啟動完整的操作系統,因此可以做到秒級,甚至毫秒級的啟動時間,大大的節約了開發,測試,部署的時間
- 一致的運行環境
開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一致,導致有些 bug 並未在開發過程中被發現。而 Docker 的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 「這段代碼在我機器上沒問題啊」 這類問題。
- 持續交付和部署
對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。使用 Docker 可以通過定制應用鏡像來實現持續集成、持續交付、部署。開發人員可以通過 Dockerfile 來進行鏡像構建,並結合 持續集成(Continuous Integration) 系統進行集成測試,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。
- 更輕松的遷移
由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在很多平台上運行,無論是物理機、虛擬機、公有雲、私有雲,甚至是筆記本,其運行結果是一致的。因此用戶可以很輕易的將在一個平台上運行的應用,遷移到另一個平台上,而不用擔心運行環境的變化導致應用無法正常運行的情況。
- 更輕松的維護和擴展
Docker 使用的分層存儲以及鏡像的技術,使得應用重復部分的復用更為容易,也使得應用的維護更新更加簡單,基於基礎鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高質量的 官方鏡像,既可以直接在生產環境使用,又可以作為基礎進一步定制,大大的降低了應用服務的鏡像制作成本。
2)基本概念
2.1)Docker鏡像
我們都知道,操作系統分別為內核和用戶空間。對於Linux而言,內核啟動后,會掛載root文件系統為其提供用戶空間的支持。而Docker鏡像(image),就相當於是一個root文件系統。比如官方鏡像
ubuntu:16:04
就包含了完整的一套Ubuntu 16.04
就包含了完整的一套Ubuntu 16.04最小系統的root
文件系統;Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序,庫,資源,配置等文件外,還包含了一些為運行時准備的一些參數(如匿名卷,環境變量,用戶等)。鏡像不包含任何動態數據,其內容在創建之后也不會被改變。
分層存儲
因為鏡像包含操作系統完整的 root 文件系統,其體積往往是龐大的,因此在 Docker 設計時,就充分利用 Union FS 的技術,將其設計為分層存儲的架構。所以嚴格來說,鏡像並非是像一個 ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現並非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。
鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記為該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
分層存儲的特征還使得鏡像的復用、定制變的更為容易。甚至可以用之前構建好的鏡像作為基礎層,然后進一步添加新的層,以定制自己所需的內容,構建新的鏡像。
Docker容器
鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建,啟動,停止,刪除,暫停等。
容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的命名空間。因此容器可以擁有自己的
root
文件系統,自己的網絡配置,自己的進程空間,甚至自己的用戶ID空間。容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也因為這種隔離的特性,很多人初學 Docker 時常常會混淆容器和虛擬機。前面講過鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個為容器運行時讀寫而准備的存儲層為容器存儲層。
容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存於容器存儲層的信息都會隨容器刪除而丟失。
按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。
數據卷的生存周期獨立於容器,容器消亡,數據卷不會消亡。因此,使用數據卷后,容器刪除或者重新運行之后,數據卻不會丟失。
Docker Registry
鏡像構建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。
一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像。
通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標簽就常用於對應該軟件的各個版本。我們可以通過 <倉庫名>:<標簽> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽。
以 Ubuntu 鏡像 為例,ubuntu 是倉庫的名字,其內包含有不同的版本標簽,如,14.04, 16.04。我們可以通過 ubuntu:14.04,或者 ubuntu:16.04 來具體指定所需哪個版本的鏡像。如果忽略了標簽,比如 ubuntu,那將視為 ubuntu:latest。
倉庫名經常以 兩段式路徑 形式出現,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用戶環境下的用戶名,后者則往往是對應的軟件名。但這並非絕對,取決於所使用的具體 Docker Registry 的軟件或服務。
Docker Registry 公開服務
Docker Registry 公開服務是開放給用戶使用、允許用戶管理鏡像的 Registry 服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。
最常使用的 Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry,並擁有大量的高質量的官方鏡像。除此以外,還有 CoreOS 的 Quay.io,CoreOS 相關的鏡像存儲在這里;Google 的 Google Container Registry,Kubernetes 的鏡像使用的就是這個服務。
由於某些原因,在國內訪問這些服務可能會比較慢。國內的一些雲服務商提供了針對 Docker Hub 的鏡像服務(Registry Mirror),這些鏡像服務被稱為加速器。常見的有 阿里雲加速器、DaoCloud 加速器 等。使用加速器會直接從國內的地址下載 Docker Hub 的鏡像,比直接從 Docker Hub 下載速度會提高很多。在 安裝 Dcoekr 一節中有詳細的配置方法。
國內也有一些雲服務商提供類似於 Docker Hub 的公開服務。比如 時速雲鏡像倉庫、網易雲鏡像服務、DaoCloud 鏡像市場、阿里雲鏡像庫 等。
私有 Docker Registry
除了使用公開服務外,用戶還可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 鏡像,可以直接使用做為私有 Registry 服務。在 私有倉庫 一節中,會有進一步的搭建私有 Registry 服務的講解。
開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現,足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。在官方的商業化版本 Docker Trusted Registry 中,提供了這些高級功能。除了官方的 Docker Registry 外,還有第三方軟件實現了 Docker Registry API,甚至提供了用戶界面以及一些高級功能。比如,VMWare Harbor 和 Sonatype Nexus。
3)安裝Docker
3.1)環境准備
Docker CE 支持 64 位版本 CentOS 7,並且要求內核版本不低於 3.10。 CentOS 7 滿足最低內核的要求,但由於內核版本比較低,部分功能(如 overlay2 存儲層驅動)無法使用,並且部分功能可能不太穩定。
1 Linux slave_lamp 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 2 [root@slave_lamp ~]# cat /etc/redhat-release 3 CentOS Linux release 7.5.1804 (Core) 4 [root@slave_lamp ~]#
3.2)移除Docker
1 [root@slave_lamp ~]# yum remove docker 2 Loaded plugins: fastestmirror 3 Resolving Dependencies 4 There are unfinished transactions remaining. You might consider running yum-complete-transaction, or "yum-complete-transaction --cleanup-only" and "yum history redo last", first to finish them. If those don't work you'll have to try removing/installing packages by hand (maybe package-cleanup can help). 5 The program yum-complete-transaction is found in the yum-utils package. 6 --> Running transaction check 7 ---> Package docker.x86_64 2:1.13.1-96.gitb2f74b2.el7.centos will be erased 8 --> Finished Dependency Resolution 9 10 Dependencies Resolved 11 12 ================================================================================================================== 13 Package Arch Version Repository Size 14 ================================================================================================================== 15 Removing: 16 docker x86_64 2:1.13.1-96.gitb2f74b2.el7.centos @extras 65 M 17 18 Transaction Summary 19 ================================================================================================================== 20 Remove 1 Package 21 22 Installed size: 65 M 23 Is this ok [y/N]: y 24 Downloading packages: 25 Running transaction check 26 Running transaction test 27 Transaction test succeeded 28 Running transaction 29 Warning: RPMDB altered outside of yum. 30 ** Found 4 pre-existing rpmdb problem(s), 'yum check' output follows: 31 libgcc-4.8.5-36.el7_6.2.x86_64 is a duplicate with libgcc-4.8.5-28.el7.x86_64 32 libgfortran-4.8.5-36.el7_6.2.x86_64 is a duplicate with libgfortran-4.8.5-28.el7.x86_64 33 libquadmath-4.8.5-36.el7_6.2.x86_64 is a duplicate with libquadmath-4.8.5-28.el7.x86_64 34 libstdc++-4.8.5-36.el7_6.2.x86_64 is a duplicate with libstdc++-4.8.5-28.el7.x86_64 35 Erasing : 2:docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64 1/1 36 warning: /etc/sysconfig/docker-storage saved as /etc/sysconfig/docker-storage.rpmsave 37 warning: /etc/docker/daemon.json saved as /etc/docker/daemon.json.rpmsave 38 Verifying : 2:docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64 1/1 39 40 Removed: 41 docker.x86_64 2:1.13.1-96.gitb2f74b2.el7.centos 42 43 Complete! 44 [root@slave_lamp ~]#
3.3)安裝Docker
3.3.1)安裝系統必要的工具
1 [root@master_lnmp /]# yum install -y yum-utils device-mapper-persistent-data lvm2 2 Loaded plugins: fastestmirror 3 Loading mirror speeds from cached hostfile 4 * base: mirrors.aliyun.com 5 * extras: mirrors.aliyun.com 6 * updates: mirrors.aliyun.com 7 base | 3.6 kB 00:00:00 8 epel | 5.3 kB 00:00:00 9 extras | 3.4 kB 00:00:00 10 Dependency Updated: 11 device-mapper.x86_64 7:1.02.149-10.el7_6.7 device-mapper-event.x86_64 7:1.02.149-10.el7_6.7 12 device-mapper-event-libs.x86_64 7:1.02.149-10.el7_6.7 device-mapper-libs.x86_64 7:1.02.149-10.el7_6.7 13 lvm2-libs.x86_64 7:2.02.180-10.el7_6.7 14 省略若干 15 Complete! 16 [root@master_lnmp /]#
3.3.2)添加軟件源信息
1 [root@master_lnmp /]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 2 Loaded plugins: fastestmirror 3 adding repo from: https://download.docker.com/linux/centos/docker-ce.repo 4 grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo 5 repo saved to /etc/yum.repos.d/docker-ce.repo 6 [root@master_lnmp /]#
3.3.3更新yum源緩存
1 [root@master_lnmp /]# yum makecache fast 2 Loaded plugins: fastestmirror 3 Loading mirror speeds from cached hostfile 4 * base: mirrors.aliyun.com 5 * extras: mirrors.aliyun.com 6 * updates: mirrors.aliyun.com 7 base | 3.6 kB 00:00:00 8 docker-ce-stable | 3.5 kB 00:00:00 9 epel | 5.3 kB 00:00:00 10 extras | 3.4 kB 00:00:00 11 updates | 3.4 kB 00:00:00 12 (1/2): docker-ce-stable/x86_64/updateinfo | 55 B 00:00:01 13 (2/2): docker-ce-stable/x86_64/primary_db | 28 kB 00:00:00 14 Metadata Cache Created 15 [root@master_lnmp /]#
3.3.4)安裝 Docker-ce
1 [root@master_lnmp /]# yum -y install docker-ce 2 Loaded plugins: fastestmirror 3 Loading mirror speeds from cached hostfile 4 * base: mirrors.aliyun.com 5 * extras: mirrors.aliyun.com 6 * updates: mirrors.aliyun.com 7 省略若干。。。 8 Installed: 9 docker-ce.x86_64 3:18.09.6-3.el7 10 Dependency Installed: 11 container-selinux.noarch 2:2.95-2.el7_6 containerd.io.x86_64 0:1.2.5-3.1.el7 12 docker-ce-cli.x86_64 1:18.09.6-3.el7 13 Complete! 14 [root@master_lnmp /]#
3.3.5)啟動 Docker CE
1 [root@slave_lamp ~]# systemctl start docker 2 [root@slave_lamp ~]# systemctl enable docker 3 Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
3.4)腳本安裝Docker
899 yum update #更新yum 源 900 curl -fsSL https://get.docker.com -o get-docker.sh #獲取腳本 901 sh get-docker.sh #執行這個腳本會添加deocker.repo,並安裝Docker 902 ls 903 sh get-docker.sh 904 systemctl start docker #啟動Docker進程 905 docker run hello-world #可能你們沒有hello-world這個鏡像,我開始本地也沒有這個是下載下來的鏡像 906 docker ps 907 history [root@slave_lamp /]#
4)下載Docker鏡像
4.1)下載images鏡像,現在下載基礎的contos鏡像
1 [root@slave_lamp /]# cd /etc/docker 2 [root@slave_lamp docker]# ls 3 daemon.json.rpmsave key.json 4 [root@slave_lamp docker]# vim daemon.json 5 [root@slave_lamp docker]# service docker restart 6 Redirecting to /bin/systemctl restart docker.service 7 [root@slave_lamp docker]# /bin/systemctl restart docker.service #以上操作是因為Docker pull 啦取慢的解決方法 8 [root@slave_lamp docker]# 9 [root@slave_lamp docker]# docker pull centos:7 10 7: Pulling from library/centos 11 8ba884070f61: Pull complete 12 Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475 13 Status: Downloaded newer image for centos:7 14 [root@slave_lamp docker]#
1 { 2 "registry-mirrors": ["https://mj9kvemk.mirror.aliyuncs.com"] #在vim daemon.json添加這內容 3 }
4.2)查看centos鏡像是否安裝成功
1 [root@slave_lamp docker]# sudo docker images centos 2 REPOSITORY TAG IMAGE ID CREATED SIZE 3 centos 7 9f38484d220f 3 months ago 202MB 4 [root@slave_lamp docker]#
如果你需要鏡像,可以點擊https://hub.docker.com/。
https://download.docker.com/linux/centos/docker-ce.repo