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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

戳藍字“CSDN云計算”關注我們哦!


技術頭條:干貨、簡潔、多維全面。更多云計算精華知識盡在眼前,get要點、solve難題,統統不在話下!

作者:常仕祿

轉自:Docker


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


什么是Docker


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


Docker作為虛擬化分支的一項重要的革新,有必要將Docker和其他虛擬化技術進行一下比較。下面是介紹虛擬化過程中最常見的一張圖,它描述了計算機從軟到硬的一個層次關系。?



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


Docker與虛擬機


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

Hypervisor與虛擬機


從本質上看,虛擬機和Docker屬于在不同層次上的虛擬,虛擬機則是虛擬到操作系統層次的,如下圖所示。?



在宿主機的操作系統中,抽象出了一個Hypervisor的概念,因為自己并沒有涉獵過這個領域,所以扒一些現成的資料給我自己掃掃盲。


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


Hypervisor具有如下的優點:


  • 提高主機硬件的使用率

  • 虛擬機移動性較強

  • 資源的隔離性,某臺虛擬機的宕機不影響其他虛擬機的使用

  • 易保護,易恢復


Hypervisor種類:?



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


  • bare-metal hypervisors 特點

    • 需要硬件支持

    • 虛擬機monitor作為主操作系統

    • 運行效率高


典型系統

  • VMware5.5+

  • Xen3.0+

  • KVM


  • hosted hypervisors 特點

    • 虛擬機監視器作為應用程序運行在主操作系統環境內

    • 效率較低


  • 典型系統

    • Virtual Box

    • early VMware5.5

    • early Xen3.0

Docker

與虛擬機不同,Docker是通過軟件層的虛擬化實現了更加輕量級的虛擬化,其架構圖如下:?



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


為什么用Docker


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


Docker簡單使用方法


Docker架構


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



  • Docker鏡像:Docker鏡像是用于創建Docker容器的模板

  • Docker容器(Container):容器是獨立運行的一個或一組應用

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

  • Docker主機(Host):一個物理或者虛擬的機器用于執行Docker守護進程和容器

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

  • Docker Machine:Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure


終于到了實戰環節,在這一小節里面,我們通過兩個具體案例介紹Docker的簡單使用方法,首先是Docker的Hello World,另一個則是按照Docker官方文檔部署一個Flask后端服務。


安裝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


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



    Docker復雜使用


    這個應用主要是一個Python的Web服務,該服務用于統計用戶訪問量,用戶訪問量存儲在Redis中。下面正式開始部署。


    首先先寫一個Flask的Python程序,主要的統計邏輯和前端展示都由這個文件提供,代碼如下:


  • 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") ##獲取計數器當前值并將其+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) ##網頁渲染


  • if __name__ == "__main__":

  • app.run(host='0.0.0.0', port=80) ## 服務的設置為80端口


  • 然后編寫Python需要的依賴文件requirements.txt。


  • Redis

  • Flask


  • 最后寫出Docker的部署文件Dockerfile:


  • # 將官方 Python 運行時用作父鏡像

  • FROM python:2.7-slim

  • # 將工作目錄設置為 /app

  • WORKDIR /app

  • # 將當前目錄內容復制到位于 /app 中的容器中

  • ADD . /app

  • # 安裝 requirements.txt 中指定的任何所需軟件包

  • RUN pip install -r requirements.txt

  • # 使端口 80 可供此容器外的環境使用

  • EXPOSE 80

  • # 定義環境變量

  • ENV NAME World

  • # 在容器啟動時運行 app.py

  • CMD ["python", "app.py"]


  • 最后的目錄結構如下:?



    完成之后開始構建,首先build鏡像:


  • docker build -t bryantchangflasktest .


  • 其中 -t 的作用是指定鏡像的名字。


    完成構建后,結果如下:

    ?


    使用docker images查看已經構建的鏡像:?



    完成構建后,接下來開始運行:


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


  • 運行結果:?



    可以看到因為沒有配置Redis所以這里面的異常是我們預期內的,為了做后面的配置方便,我們將鏡像上傳到公共鏡像,命令如下:


  • docker build -t bryantchangxy/bryantchangflasktest .

  • docker push bryantchangxy/bryantchangflasktest:latest


  • 涉及的一些常見命令:


  • docker build -t friendlyname .# 使用此目錄的 Dockerfile 創建鏡像

  • docker run -p 4001:80 friendlyname # 運行端口 4001 到 80 的“友好名稱”映射

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

  • docker ps # 查看所有正在運行的容器的列表

  • docker stop <hash> # 平穩地停止指定的容器

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

  • docker kill <hash> # 強制關閉指定的容器

  • 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 主機上所有正在運行的應用

  • docker stack deploy -c <composefile> <appname> # 運行指定的 Compose 文件

  • docker stack services <appname> # 列出與應用關聯的服務

  • docker stack ps <appname> # 列出與應用關聯的正在運行的容器

  • docker stack rm <appname> # 清除應用


  • 注意,下面我不再繼續沿用那篇文檔里面的內容,我直接將Flask和Redis集成,并使用Docker Compose部署,部署文件為docker-compose.yml,內容如下:


  • web:

  • build: .

  • command: python app.py

  • ports:

  • - "4001:80"

  • volumes:

  • - .:/app

  • links:

  • - redis

  • redis:

  • image: microbox/redis


  • 最后部署鏡像,命令如下:


  • docker-compose up -d


  • 完成后,輸入localhost:4001,終于看到了最終的結果:

    ?


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




    福利

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



    推薦閱讀:

    • 分布式架構系列: 負載均衡技術詳解 | 技術頭條

    • 00后的AI開發者進階之道:從入門到鏖戰MIT編程大賽 | 人物志

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

    • ICPC 2019國際大學生程序設計競賽,中國高校未能奪冠

    • EOS現狀: 72%應用涉賭被列為高危, 說好的詩和遠方, 你竟淪落成了這樣?

    • 涼山火災啟示錄:面對大火,AI 能做些什么?


    真香,朕在看了!

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。