日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Docker简介与简单使用 | 技术头条

發(fā)布時(shí)間:2024/9/27 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker简介与简单使用 | 技术头条 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

戳藍(lán)字“CSDN云計(jì)算”關(guān)注我們哦!


技術(shù)頭條:干貨、簡潔、多維全面。更多云計(jì)算精華知識(shí)盡在眼前,get要點(diǎn)、solve難題,統(tǒng)統(tǒng)不在話下!

作者:常仕祿

轉(zhuǎn)自:Docker


前一段花了一段時(shí)間研究Log4j2的源碼,現(xiàn)在這個(gè)項(xiàng)目基本也告一段落,也算是度過了初入職場這一個(gè)階段。之前在18年總結(jié)時(shí)說過19年自己要學(xué)會(huì)C++,所以接下來一段時(shí)間,會(huì)用一些文章和大家分享下自己學(xué)習(xí)C++過程中的新的,不過在正式寫關(guān)于C++內(nèi)容前,想先介紹一下Docker,因?yàn)橛辛诉@個(gè)利器,自己搞個(gè)小開發(fā)環(huán)境會(huì)變得十分簡單。而且在云化的時(shí)代,如果連Docker都沒用過甚至沒聽說過的話確實(shí)有點(diǎn)說不過去。所以我愿意單獨(dú)拉出一篇文簡單介紹一下Docker的使用,后面的C++開發(fā)環(huán)境也會(huì)直接使用Docker進(jìn)行部署。本文主要分為3部分,什么是Docker,為什么用Docker以及Docker的基本使用方法。閑言少敘,直奔主題~


什么是Docker


至于給Docker的定義,我覺得還是直接引用吧,Docker是一個(gè)用Go語言開發(fā)的一個(gè)開源容器引擎,Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類似iPhone的App),更重要的是容器性能開銷極低。


Docker作為虛擬化分支的一項(xiàng)重要的革新,有必要將Docker和其他虛擬化技術(shù)進(jìn)行一下比較。下面是介紹虛擬化過程中最常見的一張圖,它描述了計(jì)算機(jī)從軟到硬的一個(gè)層次關(guān)系。?



這個(gè)圖看似簡單,其實(shí)它很清晰的描述了計(jì)算機(jī)資源的一種層次關(guān)系。最底層是基礎(chǔ)設(shè)施層,基本都是硬件方面的構(gòu)成,如CPU,內(nèi)存,磁盤,這些支撐了計(jì)算機(jī)的基本運(yùn)行,如果沒有這些硬件,計(jì)算機(jī)也就不存在了。在硬件層上運(yùn)行了格式的操作系統(tǒng),他能夠根據(jù)合理的將硬件資源合理的分配給上面的應(yīng)用,并保證他們有條不紊的運(yùn)行。在系統(tǒng)上自帶一些系統(tǒng)的lib和可執(zhí)行命令,這些可執(zhí)行命令就是我們常用的Linux命令(cd,cat,ls….太多了),Lib則包含了一些基本程序庫,供我們自己編寫的各種程序調(diào)用。最上面就是我們開發(fā)的各種Application了。


Docker與虛擬機(jī)


說完了基本的分層關(guān)系,下面就需要重點(diǎn)介紹兩種比較重要的虛擬化技術(shù),虛擬機(jī)和Docker,雖然感覺區(qū)別被講爛了不過為了介紹的完整性還是簡單提一句,還請(qǐng)大家耐心看完。

Hypervisor與虛擬機(jī)


從本質(zhì)上看,虛擬機(jī)和Docker屬于在不同層次上的虛擬,虛擬機(jī)則是虛擬到操作系統(tǒng)層次的,如下圖所示。?



在宿主機(jī)的操作系統(tǒng)中,抽象出了一個(gè)Hypervisor的概念,因?yàn)樽约翰]有涉獵過這個(gè)領(lǐng)域,所以扒一些現(xiàn)成的資料給我自己掃掃盲。


首先是Hypervisor的定義,根據(jù)wiki上講,Hypervisor或者Virtual Machine Monitor(VMM)是創(chuàng)造并且運(yùn)行虛擬機(jī)的軟件、固件、或者硬件,通俗的講,hypervisor是一種將操作系統(tǒng)和硬件分離的一種方式,使得宿主機(jī)的硬件上能夠同時(shí)運(yùn)行多個(gè)虛擬機(jī)。


Hypervisor具有如下的優(yōu)點(diǎn):


  • 提高主機(jī)硬件的使用率

  • 虛擬機(jī)移動(dòng)性較強(qiáng)

  • 資源的隔離性,某臺(tái)虛擬機(jī)的宕機(jī)不影響其他虛擬機(jī)的使用

  • 易保護(hù),易恢復(fù)


Hypervisor種類:?



如上面兩張圖所示,Hypervisor分為兩類,一類是直接部署在硬件層面上(bare-metal hypervisors),另一類則是部署在宿主機(jī)的操作系統(tǒng)上,算是一種軟件(hosted hypervisors)。兩種方式的特點(diǎn)與典型系統(tǒng)如下:


  • bare-metal hypervisors 特點(diǎn)

    • 需要硬件支持

    • 虛擬機(jī)monitor作為主操作系統(tǒng)

    • 運(yùn)行效率高


典型系統(tǒng)

  • VMware5.5+

  • Xen3.0+

  • KVM


  • hosted hypervisors 特點(diǎn)

    • 虛擬機(jī)監(jiān)視器作為應(yīng)用程序運(yùn)行在主操作系統(tǒng)環(huán)境內(nèi)

    • 效率較低


  • 典型系統(tǒng)

    • Virtual Box

    • early VMware5.5

    • early Xen3.0

Docker

與虛擬機(jī)不同,Docker是通過軟件層的虛擬化實(shí)現(xiàn)了更加輕量級(jí)的虛擬化,其架構(gòu)圖如下:?



初步看來,Docker所在的層級(jí)與虛擬機(jī)所在的層次相同,都是在宿主機(jī)的操作系統(tǒng)上部署,但是Docker完全是軟件,不需要硬件進(jìn)行支持,它利用的是操作系統(tǒng)自帶的資源隔離機(jī)制對(duì)硬件資源進(jìn)行隔離,例如Win中的Hyper-v,Linux中的cgroup等,由Docker的后端程序Docker Engine調(diào)用這些接口完成資源隔離。Docker在創(chuàng)建容器時(shí)并不運(yùn)行完整的操作系統(tǒng),使用的資源更少,部署,啟動(dòng)更快。但提供的隔離粒度不足,所以Docker更加適合單個(gè)用戶使用,而虛擬機(jī)則更適合在多個(gè)用戶混合的多租戶類型的場景中執(zhí)行。


為什么用Docker


其實(shí)這個(gè)問題我在介紹虛擬機(jī)與Docker的區(qū)別時(shí)已經(jīng)提到,Docker由于其使用了更加輕量級(jí)的隔離機(jī)制,不論是在部署,啟動(dòng)恢復(fù)上均比虛擬機(jī)要快上數(shù)個(gè)數(shù)量級(jí),因此,如果是個(gè)人用戶想要快速構(gòu)建某個(gè)特定的環(huán)境,比如想要測試某個(gè)代碼在linux的運(yùn)行情況,而使用的是mac系統(tǒng)或win系統(tǒng),或者練習(xí)搭建環(huán)境等,通過Docker可以快速滿足需求。


Docker簡單使用方法


Docker架構(gòu)


介紹使用方法前,先明確Docker中的幾個(gè)基本組件以及這些組件的交互關(guān)系。?



  • Docker鏡像:Docker鏡像是用于創(chuàng)建Docker容器的模板

  • Docker容器(Container):容器是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用

  • Docker客戶端(Client):Docker客戶端通過命令行或者其他工具使用Docker API與Docker的守護(hù)進(jìn)程通信。

  • Docker主機(jī)(Host):一個(gè)物理或者虛擬的機(jī)器用于執(zhí)行Docker守護(hù)進(jìn)程和容器

  • Docker倉庫(Registry):Docker倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。Docker Hub提供了龐大的鏡像集合供使用。

  • Docker Machine:Docker Machine是一個(gè)簡化Docker安裝的命令行工具,通過一個(gè)簡單的命令行即可在相應(yīng)的平臺(tái)上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure


終于到了實(shí)戰(zhàn)環(huán)節(jié),在這一小節(jié)里面,我們通過兩個(gè)具體案例介紹Docker的簡單使用方法,首先是Docker的Hello World,另一個(gè)則是按照Docker官方文檔部署一個(gè)Flask后端服務(wù)。


安裝Docker


Mac && Windows:直接下載安裝文件進(jìn)行安裝


Linux:


  • yum install -y epel-release ##安裝倉庫

  • yum install docker-io ##安裝Docker

  • chkconfig docker on ## 加入開機(jī)自動(dòng)啟動(dòng)

  • service docker start ## 啟動(dòng)Docker


  • Docker Hello World


    這個(gè)案例非常簡單,只有一個(gè)命令:


  • docker run hello-world


  • 如果看到下圖中的結(jié)果則說明成功。?



    Docker復(fù)雜使用


    這個(gè)應(yīng)用主要是一個(gè)Python的Web服務(wù),該服務(wù)用于統(tǒng)計(jì)用戶訪問量,用戶訪問量存儲(chǔ)在Redis中。下面正式開始部署。


    首先先寫一個(gè)Flask的Python程序,主要的統(tǒng)計(jì)邏輯和前端展示都由這個(gè)文件提供,代碼如下:


  • 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") ##獲取計(jì)數(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 運(yùn)行時(shí)用作父鏡像

  • 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

  • # 在容器啟動(dòng)時(shí)運(yùn)行 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)建后,接下來開始運(yùn)行:


  • docker run -p 4001:80 bryantchangflasktest ##將4001端口映射到80端口


  • 運(yùn)行結(jié)果:?



    可以看到因?yàn)闆]有配置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 # 運(yùn)行端口 4001 到 80 的“友好名稱”映射

  • docker run -d -p 4001:80 friendlyname # 內(nèi)容相同,但在分離模式下

  • docker ps # 查看所有正在運(yùn)行的容器的列表

  • docker stop <hash> # 平穩(wěn)地停止指定的容器

  • docker ps -a # 查看所有容器的列表,甚至包含未運(yùn)行的容器

  • docker kill <hash> # 強(qiáng)制關(guān)閉指定的容器

  • docker rm <hash> # 從此機(jī)器中刪除指定的容器

  • docker rm $(docker ps -a -q) # 從此機(jī)器中刪除所有容器

  • docker images -a # 顯示此機(jī)器上的所有鏡像

  • docker rmi <imagename> # 從此機(jī)器中刪除指定的鏡像

  • docker rmi $(docker images -q) # 從此機(jī)器中刪除所有鏡像

  • docker login # 使用您的 Docker 憑證登錄此 CLI 會(huì)話

  • docker tag <image> username/repository:tag # 標(biāo)記 <image> 以上傳到鏡像庫

  • docker push username/repository:tag # 將已標(biāo)記的鏡像上傳到鏡像庫

  • docker run username/repository:tag

  • docker stack ls # 列出此 Docker 主機(jī)上所有正在運(yùn)行的應(yīng)用

  • docker stack deploy -c <composefile> <appname> # 運(yùn)行指定的 Compose 文件

  • docker stack services <appname> # 列出與應(yīng)用關(guān)聯(lián)的服務(wù)

  • docker stack ps <appname> # 列出與應(yīng)用關(guān)聯(lián)的正在運(yù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é)果:

    ?


    對(duì)于Docker Compose的使用,參見博客:https://blog.csdn.net/u011781521/article/details/80464826。




    福利

    掃描添加小編微信,備注“姓名+公司職位”,加入【云計(jì)算學(xué)習(xí)交流群】,和志同道合的朋友們共同打卡學(xué)習(xí)!



    推薦閱讀:

    • 分布式架構(gòu)系列: 負(fù)載均衡技術(shù)詳解 | 技術(shù)頭條

    • 00后的AI開發(fā)者進(jìn)階之道:從入門到鏖戰(zhàn)MIT編程大賽 | 人物志

    • 吃了公司零食被指“偷吃”,外包怎么了?

    • ICPC 2019國際大學(xué)生程序設(shè)計(jì)競賽,中國高校未能奪冠

    • EOS現(xiàn)狀: 72%應(yīng)用涉賭被列為高危, 說好的詩和遠(yuǎn)方, 你竟淪落成了這樣?

    • 涼山火災(zāi)啟示錄:面對(duì)大火,AI 能做些什么?


    真香,朕在看了!

    總結(jié)

    以上是生活随笔為你收集整理的Docker简介与简单使用 | 技术头条的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。