第一次接觸Docker這個東西仍是在兩年前,所在的公司主要是提供SAAS服務的,因此很早就開始使用微服務+容器化的方式進行軟件交付。對於一個前端仔來講,是徹底陌生的一個東西。因爲開發中須要使用Docker來搭建一些本地的開發環境,以後將本身的應用打包成Docker鏡像,因此開始接觸了Docker,能感覺到Docker爲整個開發生產流程提供了很大的便利。慢慢的Docker也就成了電腦上必備的一個工具。經過Docker也瞭解到了不少運維相關的技能,技術棧更加全面。前端
任何一個新技術都不是忽然出現,從石頭裏面蹦出來的,Docker也是站在巨人的肩膀上,優化了容器的體驗,讓更多的人能夠很簡單的使用這一技術。巨人就是LXC(linux container)技術,該技術主要包含Namespace實現訪問隔離,Cgroup來實現資源控制,Docker在這一技術的基礎上提供了更加簡便的控制工具,下降了開發這是用容器技術的門檻。linux
最初締造Docker的是一個作PAAS平臺叫作DotCloud的公司,後來因爲Docker太受歡迎,DotCloud公司也更名成了Docker.Inc。目前Docker已經加入了Linux基金會,遵循Apache2.0協議,其代碼託管於Github。git
一樣都是虛擬化技術的容器技術常常被拿來和虛擬機進行對比: 從虛擬化的方式來看,虛擬機是硬件級別的虛擬化,cpu、內存等都是虛擬化出來的,而容器只是基於相同的運行內核在操做系統層進行虛擬化。因此在內存使用上,容器是需宿主機共用相同的內存的。由於容器只虛擬化了操做系統,因此其啓動速度大大優於虛擬機,同時很是的輕量。 由於各自的特色容器和虛擬機也有着不一樣的應用場景:github
可是容器和虛擬機也不是那種非此即彼的關係,不少的應用場景是把虛擬機做爲宿主機,而後在裏面運行Docker容器。docker
前端在大多數人的眼中可能就是寫寫前端頁面,Docker可能更多的是運維或者後端開發才須要接觸的東西,那麼爲何一個前端工程師也須要學習使用Docker呢?數據庫
本地運行做爲一種工具快速搭建開發環境 服務器部署應用,避免生產測試環境不一致致使的問題,更容易作系統遷移 做爲工程師,須要有綜合的能力,多種方式解決問題後端
Docker大部分的操做都是圍繞着三大核心概念倉庫、容器、鏡像進行的,瞭解了這三個概念,才能順利的瞭解Docker的工做的整個生命週期。 api
鏡像倉庫顧名思義就是存放鏡像的倉庫,對於鏡像的Ship起着很是重要的做用,在網絡互通的狀況下,用戶能夠將鏡像經過docker push命令將本地打包好的鏡像存儲至鏡像倉庫,而後在目標的服務器經過docker pull命令拉取下來。目前一個最大的鏡像倉庫就是Docker Hub。固然也能夠本身搭建一個鏡像倉庫的服務,阿里雲上就支持建立一個免費的Docker鏡像倉庫。服務器
Docker鏡像就至關於咱們安裝操做系統所使用的的iso文件,能夠經過Dockerfile文件經過docker build命令建立,Docker在鏡像的存儲結構上使用的是分層的存儲方式,Dockerfile的每一行指令都會生成一層,使用這種分層的存儲方式的好處就是,多個鏡像能夠共用相同的層,從而達到節省空間的做用。markdown
容器是在鏡像的基礎上運行起來的可讀寫的一層(docker run),也是真正工做的部分,若是使用過程當中產生了對容器的修改,咱們也可使用docker commit命令將其持久化到鏡像中,可是若是鏡像用於生產通常都須要從Dockerfile從新去生成這個鏡像,由於docker commit會使鏡像生成新的一層,同時這種修改是沒法被使用者知曉的。
鏡像還有另一種存儲方式就是使用tar文件的形式,若是服務器環境離線,就只能將鏡像的tar包拷貝至目標服務器,而後在解壓出來。生成tar包有兩種方式:
Docker容器之間資源都是隔離的,因此Docker網絡對於容器之間的通訊很是重要,Docker提供以下幾種網絡模式,針對不一樣的用戶場景進行使用,固然也可使用開源社區的其餘網絡插件。
有些容器服務運行的時候會產生一些重要的數據,如數據庫、Redis等,若是不保存下來,會就形成核心數據的丟失。固然可使用commit的方式,可是commit會致使鏡像的體積變的很大。因此Docker提供了卷管理的功能。
將容器內的特定目錄掛在到宿主機上的目錄上
// 將容器內的data目錄掛載到宿主機/host/data目錄
docker run -v /host/data:/data --name test test-image
複製代碼
當文件的掛在目錄不少的時候極可能會出現誤刪,或者管理混亂的問題。因此Docker另一種數據卷容器的方式管理數據。
用戶提早建立一個數據卷容器,多個容器能夠共用一個容器數據卷,數據的管理更加方便
docker volume
命令 | 說明 |
---|---|
create | 建立一個數據卷容器 |
inspect | 查看數據卷詳情,目錄等 |
ls | 列舉全部數據卷容器 |
prune | 清除全部未被使用的數據卷 |
rm | 刪除特定數據卷 |
若是每次都是經過手動的方式啓動Docker容器,須要指定不少的參數很是麻煩,而且面對多個容器須要啓動時就更復雜了這時就須要咱們的Docker三劍客之一的Docker Compose來解決多容器編排的問題。 docker compose讓咱們經過一個配置文件的方式,管理對應的容器服務。一個簡單的配置文件結果以下:
version: '3'
services:
test-service:
container_name: test-service
image: test-service-image
ports:
- 8080:80
volumes:
- /host/data:/data
networks:
- test-network
restart: always
networks:
test-network:
driver: bridge
複製代碼
這個配置文件就至關於咱們執行了:
docker network create -d bridge test_network
docker run -it -d --name test-service -p 8080:80 -v /host/data:/data --network test-network test-service-image
複製代碼
好奇的人可能會問 Docker Compose是三劍客之一 那其餘兩劍客都是誰呢?
軟件開發沒有銀彈,任何技術也都是具備兩面性的。Docker做爲平常工做中的輔助工具,能夠爲咱們節省大量的配置環境的時間,但有些時候也會給咱們帶來額外的麻煩。
Docker的好處仍是顯而易見的,如:
這篇文章主要較爲籠統的介紹一下使用Docker中須要瞭解的概念和工具,後面再針對一些特定的模塊詳細寫一些文章來介紹。