docker入門
前言
最近BOSS讓我實現容器化部署方案,特的簡單的調研了一下,目前市面上主流的方案就是docker了。所以部署成熟方案就是docker了,畢竟阿里雲,AWS等都在用,結合現有業務,實現全部容器化部署還是不太現實,也不需要,保證大部分業務實現即可,減輕運維的壓力😓。
docker其實是雲化的一種實現,本質上是部署應用於管理應用,與具體業務無關。
1. docker engine
在實際開發中,其實我們安裝的docker是docker engine,是CS架構設計。
1.1. docker
直接看docker的架構,官方文檔其實很詳細了,複製官方架構圖:docker架構圖
可以看出docker的架構分爲client、主機、倉庫 3部分。日常我們執行的命令就是client,操作各種命令,而倉庫顧名思義就是存放鏡像文件的,核心其實是docker引擎,即docker主機:容器是鏡像運行後纔是容器,對比上圖的Containers。一句話概括:
通過client命令從倉庫把鏡像通過主機的守護進程拉取到本地並執行後的單元就是容器。
1.2. 對比虛擬機
docker之前,雲計算大多使用虛擬機,但是虛擬機比較重型化,對比發現
大部分設計都差不多,只是虛擬機是虛擬硬件,而docker只是邏輯虛擬,功能類似沙盒。
1.3. docker 安裝
目前最新版的docker有社區版與企業版,安裝社區版即可。
windows與macos直接使用安裝包就可以了,linux官方也有詳細的安裝教程:安裝教程
這裏需要說一點:由於上一章講了docker需要拉取鏡像,這個hub鏡像是國外的,網絡不容樂觀。配置ali,網易等隨意,可以加快拉取鏡像速度。macos在圖形界面可配置
安裝好後:執行docker version
可以看見版本號,docker是go語言開發的,其實docker本身是沒有管理功能的,需要輔助k8s(舵手)等管理,要對這些定製需要熟悉go語言,而且go語言依賴少天然比較適合docker部署。
docker也可以配置私倉Docker Registry,單獨放置自己的鏡像,官方建立私倉的方式
2. docker鏡像
docker鏡像是用來引擎執行的不變單元,docker容器是分層的,在製作docker鏡像與刪除就可以提現出來,比如Tomcat鏡像,運行需要linux系統,JDK,Tomcat等
這只是一個比喻圖,實際官方tomcat鏡像層數比這個多。
利用 Union FS 的技術,將一個鏡像分層,各層是可以重複利用的,比如Tomcat,只需要修改Tomcat與JDK層,其他基本上可以重複利用。
2.1. 本地鏡像列表
docker images [OPTIONS] [REPOSITORY[:TAG]]
可以查詢官方文檔:https://docs.docker.com/engine/reference/
列表包含了倉庫名、標籤、鏡像 ID、創建時間以及所佔用的空間,由於沒有鏡像,我們拉取hello-world。
2.2. 拉取鏡像
docker search [OPTIONS] TERM
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
先查找,在pull到本地
拉取2個版本tomcat,進一步說明了鏡像的層是複用的,每層有獨立的ID區分
3. docker鏡像執行
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
docker run -d -p 8080:8080 tomcat:8.5.56-jdk8-adoptopenjdk-openj9
查看剛剛運行的容器,此時有了容器ID
通過exec命令,可以進某個容器。容器在很多情況下也是虛擬系統+lib+app,本質跟虛擬機沒什麼兩樣,只是沒有虛擬硬件。
比如我們新建一個index文件
docker exec -it wonderful_jennings bash
容器本身是執行那一層層的鏡像,可以看出我在macOS上執行的容器是應用的linux鏡像,新建了index文件
訪問http://localhost:8080/index.html
其實此時我們可以把這個容器commit成新的鏡像,push進私倉重複使用。
實際的生產測試發佈是使用做好的dockfile編譯定製鏡像,然後實現測試生產發佈。
可以通過docker ps查看剛剛運行的容器進程
通過docker stop停止容器,通過docker rm刪除容器,只需記得命令的含義即可,細節可以直接查看官方文檔
總結
docker其實也是用來實現應用部署管理的,更輕量級,docker容器的管理更加複雜,這其實是容器很簡單的demo,其實很多東西沒處理,比如
- 文件系統,docker容器中的文件隨着容器的stop而消失了,對於日誌或者其他重要文件顯然必須映射在宿主機上。
- 網絡通信,容器之間、容器與宿主機等都需要處理,筆者這裏是本機,所以僅映射了端口,實際還有組網
- 容器的管理,怎麼把環境初始化環境,並管理上這些容器,目前流行的是k8s
- 容器編排,容器動態調度,實現資源的調配來實現業務性能的調配,俗稱增減機器增減性能
- 容器之間服務管控,比如負載均衡,熔斷,目前流行的是Istio