Docker简介与简单使用 | 技术头条
戳藍字“CSDN云計算”關(guān)注我們哦!
技術(shù)頭條:干貨、簡潔、多維全面。更多云計算精華知識盡在眼前,get要點、solve難題,統(tǒng)統(tǒng)不在話下!
作者:常仕祿
轉(zhuǎn)自:Docker
前一段花了一段時間研究Log4j2的源碼,現(xiàn)在這個項目基本也告一段落,也算是度過了初入職場這一個階段。之前在18年總結(jié)時說過19年自己要學(xué)會C++,所以接下來一段時間,會用一些文章和大家分享下自己學(xué)習(xí)C++過程中的新的,不過在正式寫關(guān)于C++內(nèi)容前,想先介紹一下Docker,因為有了這個利器,自己搞個小開發(fā)環(huán)境會變得十分簡單。而且在云化的時代,如果連Docker都沒用過甚至沒聽說過的話確實有點說不過去。所以我愿意單獨拉出一篇文簡單介紹一下Docker的使用,后面的C++開發(fā)環(huán)境也會直接使用Docker進行部署。本文主要分為3部分,什么是Docker,為什么用Docker以及Docker的基本使用方法。閑言少敘,直奔主題~
什么是Docker
至于給Docker的定義,我覺得還是直接引用吧,Docker是一個用Go語言開發(fā)的一個開源容器引擎,Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上,也可以實現(xiàn)虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似iPhone的App),更重要的是容器性能開銷極低。
Docker作為虛擬化分支的一項重要的革新,有必要將Docker和其他虛擬化技術(shù)進行一下比較。下面是介紹虛擬化過程中最常見的一張圖,它描述了計算機從軟到硬的一個層次關(guān)系。?
這個圖看似簡單,其實它很清晰的描述了計算機資源的一種層次關(guān)系。最底層是基礎(chǔ)設(shè)施層,基本都是硬件方面的構(gòu)成,如CPU,內(nèi)存,磁盤,這些支撐了計算機的基本運行,如果沒有這些硬件,計算機也就不存在了。在硬件層上運行了格式的操作系統(tǒng),他能夠根據(jù)合理的將硬件資源合理的分配給上面的應(yīng)用,并保證他們有條不紊的運行。在系統(tǒng)上自帶一些系統(tǒng)的lib和可執(zhí)行命令,這些可執(zhí)行命令就是我們常用的Linux命令(cd,cat,ls….太多了),Lib則包含了一些基本程序庫,供我們自己編寫的各種程序調(diào)用。最上面就是我們開發(fā)的各種Application了。
Docker與虛擬機
說完了基本的分層關(guān)系,下面就需要重點介紹兩種比較重要的虛擬化技術(shù),虛擬機和Docker,雖然感覺區(qū)別被講爛了不過為了介紹的完整性還是簡單提一句,還請大家耐心看完。
Hypervisor與虛擬機
從本質(zhì)上看,虛擬機和Docker屬于在不同層次上的虛擬,虛擬機則是虛擬到操作系統(tǒng)層次的,如下圖所示。?
在宿主機的操作系統(tǒng)中,抽象出了一個Hypervisor的概念,因為自己并沒有涉獵過這個領(lǐng)域,所以扒一些現(xiàn)成的資料給我自己掃掃盲。
首先是Hypervisor的定義,根據(jù)wiki上講,Hypervisor或者Virtual Machine Monitor(VMM)是創(chuàng)造并且運行虛擬機的軟件、固件、或者硬件,通俗的講,hypervisor是一種將操作系統(tǒng)和硬件分離的一種方式,使得宿主機的硬件上能夠同時運行多個虛擬機。
Hypervisor具有如下的優(yōu)點:
提高主機硬件的使用率
虛擬機移動性較強
資源的隔離性,某臺虛擬機的宕機不影響其他虛擬機的使用
易保護,易恢復(fù)
Hypervisor種類:?
如上面兩張圖所示,Hypervisor分為兩類,一類是直接部署在硬件層面上(bare-metal hypervisors),另一類則是部署在宿主機的操作系統(tǒng)上,算是一種軟件(hosted hypervisors)。兩種方式的特點與典型系統(tǒng)如下:
bare-metal hypervisors 特點
需要硬件支持
虛擬機monitor作為主操作系統(tǒng)
運行效率高
典型系統(tǒng)
VMware5.5+
Xen3.0+
KVM
hosted hypervisors 特點
虛擬機監(jiān)視器作為應(yīng)用程序運行在主操作系統(tǒng)環(huán)境內(nèi)
效率較低
典型系統(tǒng)
Virtual Box
early VMware5.5
early Xen3.0
Docker
與虛擬機不同,Docker是通過軟件層的虛擬化實現(xiàn)了更加輕量級的虛擬化,其架構(gòu)圖如下:?
初步看來,Docker所在的層級與虛擬機所在的層次相同,都是在宿主機的操作系統(tǒng)上部署,但是Docker完全是軟件,不需要硬件進行支持,它利用的是操作系統(tǒng)自帶的資源隔離機制對硬件資源進行隔離,例如Win中的Hyper-v,Linux中的cgroup等,由Docker的后端程序Docker Engine調(diào)用這些接口完成資源隔離。Docker在創(chuàng)建容器時并不運行完整的操作系統(tǒng),使用的資源更少,部署,啟動更快。但提供的隔離粒度不足,所以Docker更加適合單個用戶使用,而虛擬機則更適合在多個用戶混合的多租戶類型的場景中執(zhí)行。
為什么用Docker
其實這個問題我在介紹虛擬機與Docker的區(qū)別時已經(jīng)提到,Docker由于其使用了更加輕量級的隔離機制,不論是在部署,啟動恢復(fù)上均比虛擬機要快上數(shù)個數(shù)量級,因此,如果是個人用戶想要快速構(gòu)建某個特定的環(huán)境,比如想要測試某個代碼在linux的運行情況,而使用的是mac系統(tǒng)或win系統(tǒng),或者練習(xí)搭建環(huán)境等,通過Docker可以快速滿足需求。
Docker簡單使用方法
Docker架構(gòu)
介紹使用方法前,先明確Docker中的幾個基本組件以及這些組件的交互關(guān)系。?
Docker鏡像:Docker鏡像是用于創(chuàng)建Docker容器的模板
Docker容器(Container):容器是獨立運行的一個或一組應(yīng)用
Docker客戶端(Client):Docker客戶端通過命令行或者其他工具使用Docker API與Docker的守護進程通信。
Docker主機(Host):一個物理或者虛擬的機器用于執(zhí)行Docker守護進程和容器
Docker倉庫(Registry):Docker倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。Docker Hub提供了龐大的鏡像集合供使用。
Docker Machine:Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應(yīng)的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure
終于到了實戰(zhàn)環(huán)節(jié),在這一小節(jié)里面,我們通過兩個具體案例介紹Docker的簡單使用方法,首先是Docker的Hello World,另一個則是按照Docker官方文檔部署一個Flask后端服務(wù)。
安裝Docker
Mac && Windows:直接下載安裝文件進行安裝
Linux:
yum install -y epel-release ##安裝倉庫
yum install docker-io ##安裝Docker
chkconfig docker on ## 加入開機自動啟動
service docker start ## 啟動Docker
Docker Hello World
這個案例非常簡單,只有一個命令:
docker run hello-world
如果看到下圖中的結(jié)果則說明成功。?
Docker復(fù)雜使用
這個應(yīng)用主要是一個Python的Web服務(wù),該服務(wù)用于統(tǒng)計用戶訪問量,用戶訪問量存儲在Redis中。下面正式開始部署。
首先先寫一個Flask的Python程序,主要的統(tǒng)計邏輯和前端展示都由這個文件提供,代碼如下:
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)## 連接redis
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter") ##獲取計數(shù)器當(dāng)前值并將其+1
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) ##網(wǎng)頁渲染
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80) ## 服務(wù)的設(shè)置為80端口
然后編寫Python需要的依賴文件requirements.txt。
Redis
Flask
最后寫出Docker的部署文件Dockerfile:
# 將官方 Python 運行時用作父鏡像
FROM python:2.7-slim
# 將工作目錄設(shè)置為 /app
WORKDIR /app
# 將當(dāng)前目錄內(nèi)容復(fù)制到位于 /app 中的容器中
ADD . /app
# 安裝 requirements.txt 中指定的任何所需軟件包
RUN pip install -r requirements.txt
# 使端口 80 可供此容器外的環(huán)境使用
EXPOSE 80
# 定義環(huán)境變量
ENV NAME World
# 在容器啟動時運行 app.py
CMD ["python", "app.py"]
最后的目錄結(jié)構(gòu)如下:?
完成之后開始構(gòu)建,首先build鏡像:
docker build -t bryantchangflasktest .
其中 -t 的作用是指定鏡像的名字。
完成構(gòu)建后,結(jié)果如下:
?
使用docker images查看已經(jīng)構(gòu)建的鏡像:?
完成構(gòu)建后,接下來開始運行:
docker run -p 4001:80 bryantchangflasktest ##將4001端口映射到80端口
運行結(jié)果:?
可以看到因為沒有配置Redis所以這里面的異常是我們預(yù)期內(nèi)的,為了做后面的配置方便,我們將鏡像上傳到公共鏡像,命令如下:
docker build -t bryantchangxy/bryantchangflasktest .
docker push bryantchangxy/bryantchangflasktest:latest
涉及的一些常見命令:
docker build -t friendlyname .# 使用此目錄的 Dockerfile 創(chuàng)建鏡像
docker run -p 4001:80 friendlyname # 運行端口 4001 到 80 的“友好名稱”映射
docker run -d -p 4001:80 friendlyname # 內(nèi)容相同,但在分離模式下
docker ps # 查看所有正在運行的容器的列表
docker stop <hash> # 平穩(wěn)地停止指定的容器
docker ps -a # 查看所有容器的列表,甚至包含未運行的容器
docker kill <hash> # 強制關(guān)閉指定的容器
docker rm <hash> # 從此機器中刪除指定的容器
docker rm $(docker ps -a -q) # 從此機器中刪除所有容器
docker images -a # 顯示此機器上的所有鏡像
docker rmi <imagename> # 從此機器中刪除指定的鏡像
docker rmi $(docker images -q) # 從此機器中刪除所有鏡像
docker login # 使用您的 Docker 憑證登錄此 CLI 會話
docker tag <image> username/repository:tag # 標記 <image> 以上傳到鏡像庫
docker push username/repository:tag # 將已標記的鏡像上傳到鏡像庫
docker run username/repository:tag
docker stack ls # 列出此 Docker 主機上所有正在運行的應(yīng)用
docker stack deploy -c <composefile> <appname> # 運行指定的 Compose 文件
docker stack services <appname> # 列出與應(yīng)用關(guān)聯(lián)的服務(wù)
docker stack ps <appname> # 列出與應(yīng)用關(guān)聯(lián)的正在運行的容器
docker stack rm <appname> # 清除應(yīng)用
注意,下面我不再繼續(xù)沿用那篇文檔里面的內(nèi)容,我直接將Flask和Redis集成,并使用Docker Compose部署,部署文件為docker-compose.yml,內(nèi)容如下:
web:
build: .
command: python app.py
ports:
- "4001:80"
volumes:
- .:/app
links:
- redis
redis:
image: microbox/redis
最后部署鏡像,命令如下:
docker-compose up -d
完成后,輸入localhost:4001,終于看到了最終的結(jié)果:
?
對于Docker Compose的使用,參見博客:https://blog.csdn.net/u011781521/article/details/80464826。
福利
掃描添加小編微信,備注“姓名+公司職位”,加入【云計算學(xué)習(xí)交流群】,和志同道合的朋友們共同打卡學(xué)習(xí)!
推薦閱讀:
分布式架構(gòu)系列: 負載均衡技術(shù)詳解 | 技術(shù)頭條
00后的AI開發(fā)者進階之道:從入門到鏖戰(zhàn)MIT編程大賽 | 人物志
吃了公司零食被指“偷吃”,外包怎么了?
ICPC 2019國際大學(xué)生程序設(shè)計競賽,中國高校未能奪冠
EOS現(xiàn)狀: 72%應(yīng)用涉賭被列為高危, 說好的詩和遠方, 你竟淪落成了這樣?
涼山火災(zāi)啟示錄:面對大火,AI 能做些什么?
真香,朕在看了!
總結(jié)
以上是生活随笔為你收集整理的Docker简介与简单使用 | 技术头条的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信阳至昌吉回族自治州车师古道路线规划
- 下一篇: Boost:使用accumulator_