本文轉自楊奇龍老師的公眾號(yangyidba),他長期關注于數(shù)據(jù)庫技術以及性能優(yōu)化,故障案例分析,數(shù)據(jù)庫運維技術知識分享,個人成長和自我管理等主題
假期把之前買的幾本docker的書籍閱讀一遍,本文是docker的學習筆記,了解docker的核心概念。
一 docker 是什么
Docker是dotCloud公司(后更名為Docker)基于go語言開發(fā)的容器項目,2013年開源。該項目后來加入Linux基金會,遵從了Apache 2.0協(xié)議,項目代碼在GitHub上進行維護。
二 為什么要使用Docker
Docker項目的目標是實現(xiàn)輕量級的操作系統(tǒng)虛擬化解決方案。用戶操作Docker的容器就像操作一個快速輕量級的虛擬機一樣簡單。Docker 提出 構建一次,到處運行
Build once,Run anywhere,Configure once,Run anything
對比虛擬機,Docker具有以下優(yōu)點
快速的部署和交付:開發(fā)者可以使用一個標準的鏡像來構建一套容器,開發(fā)完成之后,運維人員可以直接使用這個容器來部署代碼。解決開發(fā)環(huán)境和生產(chǎn)環(huán)境不一致帶來的一系列問題,讓開發(fā)人員和運維人員可以更加和諧相處。
啟動速度更快:秒級啟動。
更高效的虛擬化:它是內(nèi)核級的虛擬化,因此可以實現(xiàn)更高的性能和效率。
高效的遷移:Docker可以運行在不同的平臺,用戶可以輕松的將一個應用從一個平臺遷移到另一個平臺。PS 大部分都是在Linux環(huán)境下運行,估計很少有人從linux遷移到windows平臺。
節(jié)約成本:Docker容器除了運行其中應用外,基本不消耗額外的系統(tǒng)資源,一臺設備可以運行上千個容器。
三 Docker的核心概念
Docker 是一個C/S架構的程序,Docker客戶端向Docker的服務端(Docker daemon) 發(fā)出請求,服務端處理完請求并返回結果。
從上面的架構圖上我們可以了解
Docker daemon: 運行在宿主機上,Docker的守護進程,用戶通過 docker 命令與Docker daemon交互。
Docker client: Docker命令行工具,是用戶管理運維Docker的主要方式,Docker client向Docker daemon發(fā)出請求,Docker daemon將結果返回給用戶,Docker client也可以通過socket或者RESTful api訪問Docker daemon。
image:鏡像本質上是一個文件系統(tǒng)及其參數(shù)配置的組合。Docker 會把應用程序及依賴打包進鏡像里,提供了容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等),通過這個鏡像文件可生成 Docker 容器。一個鏡像可以運行一個或者多個容器,鏡像可以通過Dockerfile創(chuàng)建,也可以從Docker hub/registry上下載。
container:容器是從鏡像創(chuàng)建的應用運行實例,啟動一個鏡像就是一個容器,多個容器之間不會相互影響,保證容器中的程序運行在一個相對安全的環(huán)境中。
registry: 倉庫,共享和管理Docker鏡像的地方,用戶可以上傳或者下載上面的鏡像,官方地址為 https://registry.hub.docker.com/,各個公司也可以搭建私有Docker registry。
鏡像就相當于打包好的代碼,鏡像啟動之后運行在容器中,倉庫就是裝存儲鏡像的地方。
從官方網(wǎng)站上拷貝另一種圖,介紹Docker Engine 緯度的架構。清晰的介紹server/client交互,容器和鏡像、數(shù)據(jù)之間的一些聯(lián)系。
四 動手實踐
省略如何在系統(tǒng)上安裝docker,不會的自行谷歌。
我們通過一個案例來在mac 上運行一個redis的容器。因為本地沒有redis鏡像,docker會從官網(wǎng)的倉庫拉取最新的redis鏡像下載到本地。
? ~ docker pull redis
Using default tag: latest
latest: Pulling from library/redis
bc51dd8edc1b: Pull complete
37d80eb324ee: Pull complete
392b7748dfaf: Pull complete
48df82c3534d: Pull complete
2ec2bb0b4b0e: Pull complete
1302bce0b2cb: Pull complete
Digest: sha256:7b84b346c01e5a8d204a5bb30d4521bcc3a8535bbf90c660b8595fad248eae82
Status: Downloaded newer image for redis:latest
查看鏡像
? ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 44d36d2c2374 13 days ago 98.2 MB
基于下載的 redis 鏡像啟動一個名稱為 myredis的容器實例。其中 -d 表示以后臺方式啟動, -p 端口映射 host_port:docker_port, 訪問本機6379端口的請求可以發(fā)送到docker實例中的端口6379 。
? ~ docker run --name myredis -d -p 6379:6379 redis
85ab24b0be6894401039e51919eed653ecdd2d066cdaef1983b9660b79a09e7a
? ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85ab24b0be68 redis "docker-entrypoint..." 18 hours ago Up 7 seconds 0.0.0.0:6379->6379/tcp myredis
通過交互命令行進入docker中,訪問redis實例。