起因
之前的幾篇博客,需要一定的docker知識(雖然可以直接上手),但是對於沒有docker基礎的人來說是不知道為什么要這樣做的。
我把之前學習docker的步驟整理出來,希望可以幫助更多的人去學習docker。
目錄:
1. Docker 基礎
1.1 Docker 歷史
1.2 Docker 組成部分
1.3 Docker 核心概念
1.4 Docker 命令
1.5 Dockerfile
2. CI(持續集成)
2.1 Jenkins
3. CD(持續部署)
3.1 Mesos
3.2 Kubernetes(K8S)
4. 服務發現
4.1 etcd
4.2 SkyDNS
4.3 Consul
5. 管理平台
6. 總結
一、Docker 基礎
1. Docker 歷史
摘自《Docker開發指南》
航運的比喻
Docker 的哲學經常用航運集裝箱的比喻來解釋,這或許能解釋Docker 名字的由來。
這個比喻大概是這樣的。
運輸貨物時,要用到多種不同的運輸工具,可能包括貨車、叉車、起重機、火車和輪船。這意味着這些工具必須能夠處理大小不一、
運輸需求各異的貨物(例如袋裝的咖啡、桶裝的有毒化學品、盒裝的電子產品、成隊的豪華轎車、冷凍羊排)。以往這是一道復雜且成本高
昂的工序,需要付出大量人力物力。如圖1-3 所示,碼頭工人在每個中轉站手動裝卸貨物。
聯運集裝箱的誕生為運輸產業帶來了一場革命。集裝箱的大小有了統一標准,並且設計的出發點是能以最少的人力在不同的運輸方式之
間搬運。所有的運輸機械,無論是叉車和起重機,還是貨車、火車和輪船,都為搬運這些集裝箱而設計。運輸對溫度敏感的貨物(如食品和
葯物)時,可以使用具有冷凍及保溫功能的集裝箱。標准化的好處甚至延伸到其他支撐體系,如集裝箱的標簽及鉛封方式。因此,運輸產業
只需專注於處理集裝箱本身的搬運以及儲存的問題,而集裝箱內的東西則完全由貨物生產商負責。
Docker的目標是把集裝箱的標准化流程運用到IT行業中去。近年來,軟件系統的多樣性激增。在單一機器中運行LAMP4組合的日子已
一去不復返。如今典型的系統可能包含JavaScript框架、NoSQL數據庫、消息隊列、REST API,以及由各種不同編程語言所寫的后端。
而這個組合的全部或部分都需要能夠在各種不同的硬件上運行——從開發者的筆記本電腦,到公司內部的測試集群,再到雲端的生產環境。每
個環境都存在差異,它們在不一樣的硬件上運行着不一樣的操作系統和不同版本的程序庫。簡而言之,我們的問題與當時運輸產業遇到的極
為相似——我們正不斷付出巨大人力,在不同環境之間移動程序。Docker容器簡化了移動應用程序的工作,好比聯運集裝箱簡化了貨物運輸
一樣。開發者只需專注於程序開發,再也不用擔心測試與正式發布時環境及依賴關系的差異所帶來的問題。運維部門則只需專心處理與運行
容器相關的核心問題,例如分配資源、啟動和停止容器,以及在服務器間的遷移工作。
docker(原本是指在船只停靠港口之后將商品移進或移出的工人)的工作內容(一圖勝千言,摘自《Docker 實踐》)
看完上面的介紹之后,再去閱讀官方對於Docker的介紹,會更容易理解。
官方介紹:查看
個人理解:
Docker 可以理解為一個容器(當然本質是一個軟件),將應用(要發布的網站程序文件)和應用的依賴打包,在任意環境(服務器、雲等等)進行部署。
1.2 Docker 組成部分
Docker 邏輯上由三部分組成:Daemon(守護進程)、Rest API(API,所有客戶端都通過API進行操作)、Client(客戶端)
官方介紹:查看
1.3 Docker 核心概念
核心概念:層、鏡像、容器。
三者之間的關系:
層可以理解為一些文件的集合,鏡像由不同的層構成(只有最上面的層可以寫,其他層都是只讀的)
鏡像和容器之間的關系:
個人理解:
面向對象理解方式:鏡像可以比作類,容器可以比作類的對象(具體的一個實例),想要刪除鏡像,需要將所有使用鏡像運行的容器停止並刪除。
擴展閱讀:
docker 底層技術:cgroups(負責管理容器使用的資源,例如CPU、內存)、Namespaces(負責容器之間的隔離)、UFS(Union File System, 聯合文件系統)
如果想深入理解docker的原理,可以看一下UFS原理。
1.4 Docker 命令
官方介紹:查看
舉例子:
搜索鏡像:docker search 要搜索的鏡像
docker search redis
下載鏡像:doucker pull 要下載的鏡像:標簽(如果不寫,默認為latest)
docker pull redis:latest
運行容器:docker run 參數 redis(鏡像名稱),具體參數代表含義可以參考(查看)
docker run -d -p 6379:6379 --restart=on-failure:10 --name myredis redis
Docker 命令可以分為以下幾類:
run命令、鏡像信息、鏡像管理、容器信息、容器管理、docker信息
說明:具體每一個分類有哪些命令,可以查看文章最后的總結
1.5 Dockerfile
Dockerfile 一般用於創建鏡像,具體使用請查看
官方介紹:查看
說明:
Docker Compose、Docker Machine 之前已經寫文章說明,這里就不再描述了。
官網介紹:查看Compose命令 查看Machine命令
二、CI(持續集成)
Jenkins是最流行的持續集成工具。Jenkins可以使用docker進行發布。
Jenkins使用docker進行安裝步驟,請查看。也可以直接執行以下命令下載鏡像和運行容器
#下載Jenkins鏡像,並運行容器 docker run -d -p 8090:8080 -p 50000:50000 -v jenkins:/var/jenkins_home -v /etc/localtime:/etc/localtime --name myjenkins docker.io/jenkins/jenkins
然后在瀏覽器輸入http://*:8090 (*為docker所在宿主機的ip地址),如下圖:
密碼可以通過以下命令查看
#myredis 是容器的名稱(docker run命令的--name參數)
docker logs myredis
復制密碼粘貼到輸入框,然后點擊“繼續”,然后進行Jenkins的相關配置即可(很方便吧)。
三、CD(持續部署)
3.1 Mesos
官網:查看
目前國內有一些公司在使用,可以了解一下。
3.2 Kubernetes(K8S)
官網文檔:查看
目前正在學習。。。
四、服務發現
4.1 etcd
etcd是一個分布式一致性鍵值存儲系統,用於共享配置和服務發現。
使用方式:查看
4.2 SkyDNS
官網:查看
4.3 Consul
Consul主要包含三部分功能:服務配置(類似於etcd和zookeeper)、服務發現(類似於SkyDNS)、服務監控。
使用介紹:查看
五、管理平台
用過幾個平台(DockerUI、Portainer、Rancher等等),感覺還是Portainer更好用一些。
Portainer 官網:查看
使用以下命令下載和運行容器
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --name myportainer docker.io/portainer/portainer
使用以下地址訪問:http://*:9000(*是docker所在宿主機的ip地址)
六、總結
我的學習路線圖,如下圖(從左至右)。
學習方法:精讀(基礎知識)、泛讀(關聯知識)