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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

初识docker容器(优势真的巨大,比虚拟机好用多了)

發布時間:2024/3/24 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初识docker容器(优势真的巨大,比虚拟机好用多了) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • 背景:
  • 一、名稱空間
    • Namespaces
        • Docker Engine在Linux.上使用以下名稱空間:
  • 二、docker與虛擬化
    • 2.1cgroups
    • 2.2全虛擬、半虛擬、容器技術
    • 2.3那如何區分虛擬機中的不同應用呢?
    • 2.4微服務
    • 2.5企業中——開發運維整體流程
    • 2.6docker數據流向圖
    • 2.7docker鏡像流向
    • 2.8Container和VM(虛擬機)
    • 2.9docker和虛擬化比有什么優勢
      • docker 有哪些優勢?
  • 三、Docker
    • 3.1Docker的使用場景
    • 3.2 Docker引擎( Docker Engine )
    • 3.3 Docker的架構 ( Docker architecture )
    • 3.4docker 三大組件
  • 四、安裝 Docker
  • 五、Docker 鏡像與容器命令管理
    • 5.1 鏡像命令管理
    • 5.2 容器命令管理

背景:

以linux而言,linux操作系統會有一個主進程pid=1派生出其他進程來控制不同服務
例如: pid=2 --> python pid=3–>java pid4–>php ,三個服務可能會相互影響
使用者期望將這三個不同的服務,跑在不同的運行時環境中實現相互不影響,同時不會增加服務器成本
延伸出一-》能否將這三種服務分別封裝起來一》KVM虛擬化技術,實現了一-個操作系統模擬多個操作系統/不同的運行時
環境
隨著技術發展—》虛擬化技術開銷較大( 例如:只要運行一個py腳本,想要使用虛擬化方式實現,還需要安裝一個操作系統,并不方便/合理)
延伸出容器技術
虛擬化層的抽象層(用戶層)剝離,使用docker engine
來替代(來賓操作系統去除),只要通過引擎就可以直接連接到宿主機操作系統中,極大減小了開銷
1232
2464
docker與虛擬機區別之一( 資源利用率/損耗)
###那如何實現應用A和應用B隔離
應用和應用的隔離,如何進行判斷
以操作系統維度
應用A.與應用B隔離,在操作系統中,是通過namespaces( 名稱空間、命名空間)實現的,只要實現以下6個空間隔離,才能
認為兩個應用實現了完全/完整隔離

一、名稱空間

容器隔離了6個名稱空間(namespace次元隔離-用容器化技術封裝)* * * * *

mount 文件系統,掛載點 ——》一個文件系統內,不能重復掛在一個指定目錄,例如: /mnt

user 操作進程的用戶和用戶組 .。。。。。。。。。。

pid 進程編號

uts 主機名和主機域

ipc 信號量、消息隊列,共享內存 (理解,不同的應用調用內存資源的時候應該使用不同的內存空間)

net 網絡設備、網絡協議棧、端口等

  • cgroups 管理 3.8版本

  • cgroups linux 內核態中資源管理的模塊

  • cgroups 管理一些系統資源

Namespaces

Docker使用-種稱為namespaces提供容器的隔離工作區的技術。運行容器時,Docker 會為該容器創建- -組名稱空間。這些名稱空間提供了一-層隔離。容器的每個方面都在單獨的名稱空間中運行,并且其訪問僅限于該名稱空間。

Docker Engine在Linux.上使用以下名稱空間:

該pid命名空間:進程隔離(PID:進程ID)

該net命令空間:管理網絡接口(NET:網絡)

該ipc命名空間:管理訪問IPC資源(IPC: 進程間通信)

該mnt命名空間:管理文件系統掛載點(MNT:mount)

該uts命名空間:隔離內核和版本標識符。(UTS:Unix時間共享系統)

docker 引擎 對內核版本是有要求的 (至少是3.8+)

docker 需要cgroups 的資源管理功能

最晚的一個名稱空間是3.8

使用docker有什么意義?

ECS,屬于IAAS、Docker(k8s) 屬于PAAS

IASS : 基礎設施服務

SAAS : 應用即服務

PAAS : 平臺及服務

Docker images :鏡像

Docker container:容器

Docker registry:鏡像倉庫

存儲鏡像的地方,默認在公共的Docker Hub上查找,可以搞個人倉庫

二、docker與虛擬化

2.1cgroups

Linux上的Docker引擎還依賴于另一種稱為控制組( cgroups)的技術。cgroup將應用程序限制為一組特定的資源。控制組允許Docker Engine將可用的硬件資源共享給容器,并有選擇地實施限制和約束。
例如,您可以限制特定容器可用的內存。

2.2全虛擬、半虛擬、容器技術

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SS6HlBWQ-1641814563053)(C:\Users\趙金華\Desktop\整理復習\docker圖片\1.png)]

2.3那如何區分虛擬機中的不同應用呢?

虛擬機一般不可能只跑一個應用,因為這樣確實也太浪費資源了,我們可以想想,現在手上的電腦,可以用 Vmvare 導入幾個虛擬機,所以諸如 Cloud Foundry通過引入操作系統的 CgroupsNamespace 等機制,從而來為每個應用單獨創建一個叫做「沙盒」的隔離環境,然后在這些「沙盒」中啟動應用,通過這樣的方法就讓虛擬機中應用各自互不干擾,讓其自由翱翔,至于 Cgroups 和 Namespace 的實現原理,后續我們再共同的探討

這里所謂的隔離環境就是「容器」。

2.4微服務

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ynGF9ZOG-1641814563054)(C:\Users\趙金華\Desktop\整理復習\docker圖片\2.png)]

將40G的包拆分成4組10G的包來同時進行運作,化整為零就是微服務的概念,本來需要一臺機器跑40G的包,但是微服務進行細小化,分成多個小塊,同時進行處理,極大的加快了部署的速度。

在更新的時候包的時候一般需要全部更新,這樣極度的消耗時間,而這個時候可以單獨給單拆分的模塊來進行鏡像升級,一般只有10G左右,升級時間就減少了。

2.5企業中——開發運維整體流程

①首先由開發進行代碼研發,研發好之后進行編譯、打包

PS: 打包:一般會使用maven.工具打war包或者jar包.
②打完包之后,放置對應的運行時環境中,進行試運行
PS: 這里的運行時環境指:例如tomcat ( java環境) php (php環境)等1
③中間會加.上一些測試過程,測試代碼的有效性、可用性和可執行性
④以上測試完成,運維會將這個軟件包拉過來,運行在實際生產的運行時
環境中
問題:在以上的第o點中,不同開發語言的運行時環境混淆在一起運行會有很大的隱患,以及不便
傳統中,所謂的運行時環境,例如tomcat (java環境) php ( php環境)等
容器中,所謂的運行時環境,指的試"容器”內部
在此之前,容器一》是一個運行時環境,構成容器的組件是image鏡像(一個運行時環境的模板)

2.6docker數據流向圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Q5c6mNTg-1641814563055)(C:\Users\趙金華\Desktop\整理復習\docker圖片\3.png)]

Docker守護程序(dockerd)偵聽Docker API請求并管理Docker對象,例如圖像,容器,網絡卷。守護程序還可以與其他守護程序通信以管理Docker服務。

Docker images:鏡像

Docker container:容器

Docker registry:鏡像倉庫65卻55lo’iuu

2.7docker鏡像流向

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-e9idnL4L-1641814563055)(C:\Users\趙金華\Desktop\整理復習\docker圖片\4.png)]

2.8Container和VM(虛擬機)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vQJZNElH-1641814563056)(C:\Users\趙金華\Desktop\整理復習\docker圖片\5.png)]

2.9docker和虛擬化比有什么優勢

不同點containerVM
啟動速度秒級分鐘級
運行性能接近原生(直接在內核中運行)50%左右損失
磁盤占用MBGB
數量成百上千一般十幾臺
隔離性進程級別系統級別(更徹底)
操作系統主要支持Linux幾乎所有
封裝程度只打包項目代碼和依賴關系,共享主機內核完整的操作系統,與宿主機隔離

docker 有哪些優勢?

PS: (三個統一 封裝的模式image ,運行時環境container,統一的平臺engine)

和虛擬化比有什么優勢(表格中的對比)

docker和VM之前的區別,主要就是在于資源利用率和隔離性(共享內核、獨立的造作系統)

docker 把容器化技術做成了標準化平臺CAAS ( docker統一-/指定了容器化技術的標準化平臺)使用docker有什么意思?

docker 引擎統一了基礎設施環境-docker容器環境(引擎)

docker 引擎統一了程序打包(裝箱)方式-docker鏡像

docker 引擎統一了程序部署(運行)方式-docker容器

鏡像————》封裝的某個時刻的服務/應用狀態

容器————》應用跑起來的狀態(正常提供服務的狀態-運行時)

實現了一次構建、多次、多處使用

docker-ce (社區版) docker-ee(企業版)

三、Docker

3.1Docker的使用場景

K8S image鏡像+ container容器的方式
war jar——》 github gitlab 私有倉庫(代碼倉庫) 一-》 jenkins (測試)
(應用程序封裝/構建鏡像)一-》運維下載,使用容器技術進行運行/發布
打包應用程序簡單部署
可脫離底層硬件任意遷移(實現了應用的隔離,將應用拆分并進行解耦),例如:服務器從
騰訊云遷移到阿里云
持續集成和持續交付(CI/CD):開發到測試發布
部署微服務
提供PAAS產品(平臺即服務) {OpenStack的云 主機類似于阿里云的ECS,屬于IAAS、Docker (
K8S) 屬于PAAS}

docker 三要素

鏡像——》模板

容器——》基于鏡像,運行狀態/運行時狀態

倉庫——》存放鏡像模板

3.2 Docker引擎( Docker Engine )

Docker Engine 是具有以下主要組件的C/S客戶端-服務器應用程序:
server端:服務器是一種長期運行的程序,稱為守護程序進程(dockerd命令)。
CLIENT端:RESTAPI,它指定程序可以用來與守護程序進行通信并指示其操作的接口。
命令行界面(CLI) 客戶端(docker命令)。
docker run
docker start
docker rm

客戶端傳入——》通過restAPI——》進入內核中的docker-server端

——》由server端進行處理

——》通過rest API 返回給docker-client 端進行展示

3.3 Docker的架構 ( Docker architecture )

Docker使用客戶端-服務器架構。Docker 客戶端與Docker
守護進程進行對話,該守護進程完成了構建,運行和分發Docker容器的繁重工作。

Docker區別于傳統的虛擬化,不需要虛擬硬件資源,直接使用容器引擎,所以速度快

Docker Client: 客戶端/提供一個與用戶交互,展示的平臺+
管理、控制docker服務端(功能)的工具docker

Docker客戶端(docker) 是許多Docker用戶與Docker交互的主要方式。當您使用諸如之類的
命令時docker
run,客戶端會將這些命令發送到dockerd,以執行這些命令。該docker命令使用Docker
API。Docker客戶 端可以與多個守護程序通信。
Docker daemon:守護進程

Docker守護程序( dockerd)偵聽Docker
API請求并管理Docker對象,例如圖像,容器,網絡和卷。守護程序還可以與其他守護程序通信以管理Docker服務。
Docker images: 鏡像

cgroups namespace

3.4docker 三大組件

容器可以被打包成鏡像

  • Docker container: 容器

  • Docker registry:鏡像倉庫(yum倉庫)

組件:

  • 鏡像:–組資源集合,包含了應用程序軟件包、應用程序相關的依賴包、運行應用程序所需要的基礎環境(泛指操作系統環境),可以理解為容器的模板
  • 容器:基于鏡像的一-種運行時狀態
  • 倉庫:存放image鏡像,倉庫大類: 1、公共倉庫一-》 docker hub 2、私有倉庫registry
    harbor

四、安裝 Docker

#環境配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0#安裝依賴包 yum -y install yum-utils device-mapper-persistemt-data lvm2#設置阿里云鏡像源 cd /etc/yum.repos.d/ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安裝 docker-ce 社區版(企業版叫 docker-ee,收費) yum -y install docker-ce#啟動 systemctl enable docker && systemctl start docker 12345678910111213141516 配置阿里云鏡像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://4iv7219l.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 12345678 網絡優化 cat >> /etc/sysctl.conf <<EOF net.ipv4.ip_forward=1 EOFsysctl -p systemctl restart network systemctl restart docker 1234567 一鍵安裝 [root@c7-1 ~]#cat docker.sh #!/bin/bash#環境配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0#安裝依賴包 yum -y install yum-utils device-mapper-persistemt-data lvm2#設置阿里云鏡像源 cd /etc/yum.repos.d/ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安裝 docker-ce 社區版(企業版叫 docker-ee,收費) yum -y install docker-ce#配置阿里云鏡像加速(盡量使用自己的) #地址 https://help.aliyun.com/document_detail/60750.html sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://4iv7219l.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload#網絡優化 cat >> /etc/sysctl.conf <<EOF net.ipv4.ip_forward=1 EOFsysctl -p systemctl restart network systemctl enable docker && systemctl restart docker 1234567891011121314151617181920212223242526272829303132333435

PS
docker-server 端配置文件 daemon.json

#生產配置示例,在 daemon.json 中定義 {"graph": "/data/docker","storage-driver": "overlay2","insecure-registries": ["registry.access.redhat.com","quary.io"]"registry-mirrors": ["https://q"]"bip": "172.7.5.1/24","exec-opts": ["native.cgroupdriver=systemd"],"live-restore": true }#參數說明 "graph": "/data/docker", #指定數據目錄 "storage-driver": "overlay2", #指定存儲引擎 "insecure-registries": ["registry.access.redhat.com","quary.io"] #私有倉庫 "registry-mirrors": ["https://q"] #配置鏡像加速 "bip": "172.7.5.1/24", #docker 網絡,中間兩位建議和宿主機一樣,容器有問題好定位在哪個宿主機 "exec-opts": ["native.cgroupdriver=systemd"], #啟動時候的額外參數(驅動,k8s使用) "live-restore": true #當docker容器引擎掛掉的時候,使用docker跑起來的容器還能運行(分離) 12345678910111213141516171819

五、Docker 鏡像與容器命令管理

5.1 鏡像命令管理

PS:

  • docker client 客戶端連接到了服務端(服務端是以一個守護進程的形式跑在操作系統里面的)restful api 典型的 C/S 架構
  • 由 docker 服務端的守護進程從 docker hub 上下載了鏡像(PS:服務端會先檢查本地系統是否有這個鏡像)
  • 服務端創建了一個新的容器,然后從拉去的這個鏡像啟動了一個容器,容器執行了腳本/可執行程序讓我們可以查看/使用
  • docker 服務端把這些信息流(傳遞)返回到客戶端并展示出來(展示在終端上)
#查詢 docker 版本和信息 docker version docker info#搜索鏡像(可以自己制作鏡像上傳本地或官網倉庫 dockerfile) docker search <鏡像名>#下載鏡像 docker pull <鏡像名>#查看鏡像列表 docker images#查看鏡像詳細信息 docker inspect <鏡像 ID>#給鏡像打標簽 docker tag <鏡像名>:<原標簽> <鏡像名>:<新標簽> #docker tag nginx:latest nginx:lnmp#刪除鏡像 docker rmi <鏡像名> docker rmi <鏡像標簽> docker rmi <鏡像 ID> docker rmi `docker images -aq` #刪除所有鏡像 docker images | awk 'NR>=2{print "docker rmi -f "$3}' | bash#鏡像導出 docker save -o <導出的文件名> <鏡像名> #docker save -o nginx_v1 nginx:latest#鏡像導入 docker load < [鏡像文件] #docker load < nginx_v1 12345678910111213141516171819202122232425262728293031323334

5.2 容器命令管理


#查詢容器 docker ps -a#查看容器占用系統資源信息 docker stats#創建容器 docker create -it nginx:latest /bin/bash #常用參數說明 > -i 讓容器的標準輸入保持打開 > -t 分配一個偽終端 > -d 以后臺守護進程的方式運行#開啟/停止/重啟 容器 docker start <容器 ID> docker stop <容器 ID> docker restart <容器 ID>#后臺運行,指定容器名稱為 test docker run -itd --name test nginx:latest /bin/bash#進入容器 docker exec -it <容器 ID> /bin/bash #exit 退出#容器 導出/導入 docker export [容器 ID] > [文件名] docker import [容器文件名] [指定鏡像名稱] #導入的是鏡像#批量停止容器 docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop#批量刪除容器 docker rm -f `docker ps -aq` docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f#批量刪除 "exit" 狀態(指定狀態)的容器 for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done#查看容器進程號 docker inspect -f '{{.State.Pid}}' <容器名> docker inspect -f '{{.State.Pid}}' <容器 ID> 12345678910111213141516171819202122232425262728293031323334353637383940414243

容器與宿主機之間文件的復制

docker run -itd --name nginx_test nginx:latest /bin/bash#主機復制到容器 [root@tengxun-02 ~]#touch testfile [root@tengxun-02 ~]#ls testfile [root@tengxun-02 ~]#docker cp testfile nginx_test:/opt [root@tengxun-02 ~]#docker exec -it nginx_test bash root@2ca07b152329:/# cd /opt root@2ca07b152329:/opt# ls testfile#容器復制到主機 root@2ca07b152329:/opt# ls testfile root@2ca07b152329:/opt# touch haha root@2ca07b152329:/opt# ls haha testfile root@2ca07b152329:/opt# exit exit [root@tengxun-02 ~]#docker cp nginx_test:/opt/haha . [root@tengxun-02 ~]#ls haha testfile 1234567891011121314151617181920212223 進入容器沒有 systemctl 命令解決 添加 --privileged=true(指定此容器是否為特權容器),使用此參數,則不能用 attach。 > 示例: docker run -itd --name test3 --privileged=true centos /sbin/init`/sbin/init 內核啟動時主動呼叫的第一個進程`可以使用 docker inspect <容器ID> docker ps -a docker exec -it <容器ID> /bin/bash yum install httpd -y systemctl status httpd 1234567891011

docker 在后臺的標準運行過程:
(1)檢查本地是否存在指定的鏡像。當鏡像不存在時,會從公有倉庫下載;
(2)利用鏡像創建并啟動一個容器;
(3)分配一個文件系統給容器,在只讀的鏡像層外面掛載一層可讀寫層;
(4)從宿主主機配置的網橋接口中橋接一個虛擬機接口到容器中;
(5)分配一個地址池中的IP地址給容器;
(6)執行用戶指定的應用程序,執行完畢后容器被終止運行。

總結

以上是生活随笔為你收集整理的初识docker容器(优势真的巨大,比虚拟机好用多了)的全部內容,希望文章能夠幫你解決所遇到的問題。

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