1. 程式人生 > >Docker虛擬化實戰學習——基礎篇

Docker虛擬化實戰學習——基礎篇

Docker虛擬化實戰和企業案例演練

深入剖析虛擬化技術概念和應用場景

虛擬化,一是項技術~~,是一種資源解決方案。

虛擬化技術是將物理資源轉變為邏輯上可以管理的資源,以打破物理結構之間的壁壘,使計算元件執行在虛擬的基礎上,而不是真實的物理資源上。

通過虛擬化技術,可以將物理資源轉變為邏輯資源(虛擬機器),應用程式服務執行在虛擬資源上,而不是真實的物理機上。

VMware workstation 屬於個人版虛擬化軟體,稱為虛擬機器軟體。將物理資源轉變為多臺虛擬機器,應用軟體執行在虛擬機器中,各個虛擬機器共享物理機的資源 (CPU,硬碟,網絡卡,記憶體,IO裝置...)

虛擬化技術的落地,底層就必須有物理機支撐!

單純的物理機器是不能直接虛擬化的,都需要虛擬化軟體來實現。目前主流的虛擬化軟體有:KVM,XEN,ESXI,HP-V,Docker,Virtual BOX等

虛擬化技術的應用場景

企業需求:部署一百套Nginx WEB服務,要求對外埠為80,要求獨立伺服器部署

  • 傳統方案:採購一百臺低配硬體物理機,每臺物理機部署一套Nginx WEB服務

  • 虛擬化方案:採購10臺高配硬體物理機,每臺物理機虛擬10臺虛擬機器,每臺虛擬機器獨立部署一套Nginx WEB服務

很明顯,第二種方案,從成本、部署難度、維護等方面,第二種都是比第一種好的。

所以,虛擬化的意義:對於硬體裝置資源的最大化利用,降低企業各種費用成本,簡化後期資源部署和維護,動態滿足企業需求

,基於虛擬化資源來代替待淘汰的物理資源

雲端計算技術概念和應用場景

深入剖析Docker虛擬化概念和底層原理

Docker簡介

Docker是虛擬化技術的一種,也是目前使用比較多的一種。Go語言開發引擎

Docker利用“集裝箱”(容器)的原理,將系統、開發軟體包、依賴環境等統一打包到容器中,將整個容器部署至其他的平臺或者伺服器上。

容器技術:一種虛擬化的方案,和傳統的虛擬機器(通過中間層"guerst OS"執行服務)不同,Docker直接執行在作業系統之上。因此容器虛擬化也被稱之為作業系統虛擬化。Docker容器依賴於Linux核心特性,Namespace和Cgroups,所以只能執行在Linux之上。

官方定義:Docker是一個開元的應用容器引擎,讓開發者可以打包他們呢的應用以及依賴到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化

容器是完全使用沙箱機制,相互之間沒有任何介面(iphone的app也是這樣),幾乎沒有效能開銷;可以很容易在機器和資料中心執行。最重要的是,他們不依賴任何語言,框架甚至系統

Docker虛擬化技術比傳統虛擬化技術的優點

假設基於傳統虛擬化和Docker虛擬化部署Nginx WEB服務,兩種方案部署如下:

  • 傳統虛擬化:硬體伺服器-HostOS-VMM-GuestOS-Nginx WEB服務

  • Docker虛擬化:用劍伺服器-HostOS-VMM-Nginx WEB服務

傳統的虛擬化,不能直接啟Nginx WEB,Docker可以直接啟動Nginx WEB

如果是傳統虛擬化技術,原本只需要很少資源的服務應用,就需要很大的“guestOS“資源來支撐真正的服務

Docker目標

  • 提供簡單輕量級的建模方式(docker的啟動是毫秒級的)

  • 職責的邏輯分離:開發人員只需要關注容器中執行的程式,運維人員只需要關注對容器的管理。Docker開發提高了開發程式和部署容器的一致性

  • 快速高效的開發宣告週期:縮短程式碼從開發、測試到部署上線的生命週期

  • 鼓勵使用面向服務的架構:docker推薦單個容器只執行一個應用程式/程序,這樣就形成了一個分散式的應用程式模型,避免服務之間的互相影響。實現 高內聚 低耦合

Docker的使用場景

  1. 使用Docker容器開發、測試、部署服務。

    docker本身是輕量級的,所以本地開發人員可以構建、執行並分享docker容器,容器可以在開發環境中建立,然後提交到測試,在到生產環境。

  2. 建立隔離的執行環境

    在很多企業應用中,同一服務的不同版本可能服務於不同的使用者,使用Docker很容易建立不同的環境來執行不同版本的服務

  3. 搭建測試環境

    有於Docker的輕量化,所以開發者很容易在本地搭建測試環境,用來測試程式在不同系統下的相容性,甚至叢集式的測試環境。

  4. 構建多使用者的平臺服務(PaaS)基礎設施

  5. 即同軟體即服務(SaaS)應用程式

  6. 高效能、超大規模的宿主機部署

Docker的基本組成

Docker基本組成:

  1. Docker Client 客戶端

  2. Docker Daemon 守護程序

  3. Docker Image 映象

  4. Docker Container 容器

  5. Docker Registry 倉庫

  • Docker客戶端/守護程序:

    docker是C/S架構的程式,docker客戶端向服務端傳送請求,守護程序處理完所有的工作,並返回處理結果。客戶端對服務端的訪問,既可以是本地,也可以通過遠端

  • Docker映象:

    docker映象是docker容器的基石。跟ISO映象類似,靜止的模版,用於Docker容器的底層基礎檔案

    docker映象是一個層疊的只讀檔案系統:

    最低端是一個引導檔案系統 bootfs

    第二層是rootfs,位於引導檔案系統之上,可以是一種或多種作業系統(redhat/ubuntu等),在docker中,rootfs永遠是隻讀方式,並且利用聯合載入技術(union mount),載入更多的只讀檔案系統

  • Docker容器:

    docker容器通過docker映象啟動,是將Docker映象執行的實體,是活動的。

    當一個容器啟動時,會再docker映象的最頂層載入一個讀寫檔案系統,docker中執行的程式就是在該層進行執行的,第一次啟動是,初始化的讀寫層是空的,所有的寫操作都應用在該層(從只讀的底層複製到讀寫層(寫時複製技術))

    Docker映象和容器的關係,跟程式和程序的關係類似

  • Docker倉庫:

    存放Docker映象的地方,一般分為公共倉庫和私有倉庫,docker公司提供了一個自己的倉庫"Docker Hub"

Docker的相關技術

Docker依賴Linux的核心特性有:Cgroup(控制組)和Namespace(名稱空間)

  • Namespace

名稱空間是一種封裝的概念,在作業系統層面上,提供了系統資源的隔離,系統資源包括{程序、檔案系統、網路等}。Linux實現名稱空間的目的:為了實現輕量級虛擬化服務,在不同一名稱空間下的程序,彼此毫無關係。

docker使用了五種名稱空間:

  1. PID 程序隔離

  2. NET 管理網路介面

  3. IPC 管理程序間通訊

  4. MNT 管理掛載點,檔案系統間的隔離

  5. UTS 管理核心和版本標示的隔離

  • Cgroup(Control Groups)

Cgroup對隔離的資源進行管理,是一種用來限制、記錄,隔離程序組資源的機制。就是為了容器技術而生的。

Cgroup對資源的管理方式:

  1. 資源限制 如:對記憶體的分配上限

  2. 優先順序設定 如:某個程序優先使用cpu時間片

  3. 資源計量 計算程序組使用了多少系統資源,尤其時在記費系統中

  4. 資源控制 將程序組掛起或恢復

Docker容器的能力:

  • 檔案系統隔離:每隔容器都有自己的root檔案系統

  • 程序隔離:每個容器都執行在自己的程序環境中,互相不影響

  • 網路隔離:容器間的虛擬網路介面和IP地址都是分開的

  • 資源隔離和分組:使用Cgroups將CPU和記憶體之類的物理資源獨立的分配給每個Docker容器

Docker基礎命令使用

部署Docker虛擬化平臺核心要求:Linux核心版本:3.8+,推薦核心版本3.10+,對應的Linux發行版:RHEL7.x和CentOS7.x;

部署Docker虛擬化技術,對物理機配置容量沒有要求,生產環境儘量使用高配物理機。如:京東線上,64C(CPU)+256G(記憶體)+2T(分散式部署),JDOS2.0彈性雲。

Docker的安裝與配置

部署環境:

OS:RedHat7.3

  1. 下載安裝Docker軟體包

    [[email protected] mnt]# yum install docker*
    。。。
    Installing:
     docker-engine          x86_64 1.13.1-1.el7.centos /docker-engine-1.13.1-1.el7.centos.x86_64
                                                                               65 M
     docker-engine-selinux  noarch 1.13.1-1.el7.centos /docker-engine-selinux-1.13.1-1.el7.centos.noarch
                                                                               43 k
    Installing for dependencies:
     audit-libs-python      x86_64 2.6.5-3.el7         rhel7.3                 70 k
     checkpolicy            x86_64 2.5-4.el7           rhel7.3                290 k
     libcgroup              x86_64 0.41-11.el7         rhel7.3                 65 k
     libseccomp             x86_64 2.3.1-2.el7         rhel7.3                 56 k
     libsemanage-python     x86_64 2.5-4.el7           rhel7.3                103 k
     libtool-ltdl           x86_64 2.4.2-21.el7_2      rhel7.3                 49 k
     policycoreutils-python x86_64 2.5-8.el7           rhel7.3                444 k
     python-IPy             noarch 0.75-6.el7          rhel7.3                 32 k
     setools-libs           x86_64 3.3.8-1.1.el7       rhel7.3                610 k
    。。。
    
    [[email protected] mnt]# rpm -qa | grep docker
    docker-engine-1.13.1-1.el7.centos.x86_64
    docker-engine-selinux-1.13.1-1.el7.centos.noarch

  2. 啟動Docker

    [[email protected] mnt]# systemctl start doceker
    Failed to start doceker.service: Unit not found.
    [[email protected] mnt]# systemctl start docker
    [[email protected] mnt]# ps -ax | grep docker
    11435 ?        Ssl    0:00 /usr/bin/dockerd
    11438 ?        Ssl    0:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc
    11544 pts/0    R+     0:00 grep --color=auto docker
    
    [[email protected] mnt]# docker version
    Client:
     Version:      1.13.1
     API version:  1.26
     Go version:   go1.7.5
     Git commit:   092cba3
     Built:        Wed Feb  8 06:38:28 2017
     OS/Arch:      linux/amd64
    
    Server:
     Version:      1.13.1
     API version:  1.26 (minimum version 1.12)
     Go version:   go1.7.5
     Git commit:   092cba3
     Built:        Wed Feb  8 06:38:28 2017
     OS/Arch:      linux/amd64
     Experimental: false
    

  3. 基於Docker引擎啟動Nginx容器,並且實現通過物理機wget、curl實現訪問

    首先,需要從Docker官網獲取Docker映象,docker search nginx | more

    docker search nginx | more
    docker pull docker.io/nginx

    由於國外網站下載速度比較慢,所以可以替換為國內的docker倉庫,具體方法:

    [[email protected] ~]# cat >/etc/docker/daemon.json << EOF
    {
    "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    EOF
    [[email protected] ~]# cat /etc/docker/daemon.json 
    {
    "registry-mirrors": ["https://registry.docker-cn.com"]
    }
    重啟Docker服務,這樣就可以取下載Docker映象了

    為什麼要為Docker配置國內映象???在正常情況下,docker有一個預設連線的國外官方映象,在國外的網友訪問該官方映象自然不成問題,但是國內畢竟不是國外,由於國情不同,中國的網路訪問國外官方映象網速一向很慢,而且往往還會遭遇斷網的窘境,所以說我們要想正常使用docker的映象,那麼我們就不得不配置相應的國內映象。

    Docker可以配置的國內映象有很多可供選擇,比如說:阿里雲,網易蜂巢,DaoCloud,Docker中國區官方映象等,這些都是可以提供給大家隨意選擇的不錯的映象倉庫。

Docker容器的基本操作

將本地tar包載入到本地映象庫使用docker load命令

[[email protected] packages]# docker load --input ubuntu.tar 
454970bd163b: Loading layer [==================================================>] 196.8 MB/196.8 MB
38112156678d: Loading layer [==================================================>] 208.9 kB/208.9 kB
4e1f7c524148: Loading layer [==================================================>] 4.608 kB/4.608 kB
56063ad57855: Loading layer [==================================================>] 1.024 kB/1.024 kB
[[email protected] packages]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              07c86167cdc4        2 years ago         188 MB

啟動容器:

docker run IMAGE [COMMAND] [ARG...]

run 在新容器中執行命令

IMAGE 指定的映象

COMMAND 命令

ARG 引數

[[email protected] packages]# docker run ubuntu echo "hello world"
hello world

一次啟動執行一個命令的容器是docker中最基本的執行方式,docker提供了一個互動式啟動容器的方式

docker run -i -t IMAGE /bin/bash

-i 為容器始終開啟標準輸入

-t 為建立的容器的tty終端

[[email protected] packages]# docker run -it ubuntu /bin/bash
[email protected]:/# echo "hello docker"
hello docker
[email protected]:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

檢視容器:

docker ps [-a] [-l]

-a 列出所有容器

-l 列出最新建立的容器

[[email protected] packages]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS                          PORTS               NAMES
855833c3672f        ubuntu              "/bin/bash"            45 seconds ago       Exited (0) 10 seconds ago                           flamboyant_rosalind
797239db86e0        ubuntu              "echo 'hello world'"   About a minute ago   Exited (0) About a minute ago                       flamboyant_khorana
77b29f9efa08        b809f199bbb9        "/bin/bash"            6 minutes ago        Created                                             stoic_leavitt

執行結果引數:

[[email protected] packages]# docker ps -a
CONTAINER ID(docker守護程序在啟動容器時為容器分配的唯一ID)
IMAGE()
COMMAND()
CREATED()
STATUS()
PORTS()
NAMES(docekr守護程序為容器自動分配的名字)

docker inspect檢視容器後面新增容器的唯一ID或者NAMES

docker自定義容器名字

docker run --name=vector_name -i -t ubuntu /bin/bash

[[email protected] packages]# docker run --name=fsx_docker -it ubuntu /bin/bash
[email protected]:/# exit
exit
[[email protected] packages]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
304d46ba1c87        ubuntu              "/bin/bash"         11 seconds ago      Exited (0) 7 seconds ago                       fsx_docker

重新啟動已經停止的容器

docker start [-i] vector_name

-i 以互動模式啟動

刪除容器

僅僅用來刪除的容器,不能刪除正在用執行的命令

[[email protected] packages]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES
304d46ba1c87        ubuntu              "/bin/bash"            2 minutes ago       Up 39 seconds                                  fsx_docker
855833c3672f        ubuntu              "/bin/bash"            5 minutes ago       Exited (0) 4 minutes ago                       flamboyant_rosalind
797239db86e0        ubuntu              "echo 'hello world'"   5 minutes ago       Exited (0) 5 minutes ago                       flamboyant_khorana
77b29f9efa08        b809f199bbb9        "/bin/bash"            10 minutes ago      Created                                        stoic_leavitt
[[email protected] packages]# docker rm 855833c3672f
855833c3672f
[[email protected] packages]# docker rm 797239db86e0
797239db86e0
[[email protected] packages]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
304d46ba1c87        ubuntu              "/bin/bash"         3 minutes ago       Up About a minute                       fsx_docker
77b29f9efa08        b809f199bbb9        "/bin/bash"         11 minutes ago      Created                                 stoic_leavitt

總結

docker load --input 將本地容器倉庫的tar包匯入成映象

docker run -it --name 啟動一個新的容器

docker ps -a -l 檢視容器

docker inspect 檢視具體容器的資訊

docker start -i 啟動已經存在的容器

docker rm 刪除一個容器

Docker守護式容器

我們需要一個長期執行的容器提供服務,這就是守護式容器;可以長期執行

相關推薦

Docker虛擬化實戰學習——基礎(轉)

Docker虛擬化實戰學習——基礎篇 2018年05月26日 02:17:24 北緯34度停留 閱讀數:773更多 個人分類: Docker  

Docker虛擬化實戰學習——基礎

Docker虛擬化實戰和企業案例演練深入剖析虛擬化技術概念和應用場景虛擬化,一是項技術~~,是一種資源解決方案。虛擬化技術是將物理資源轉變為邏輯上可以管理的資源,以打破物理結構之間的壁壘,使計算元件執行在虛擬的基礎上,而不是真實的物理資源上。通過虛擬化技術,可以將物理資源轉變

docker學習 基礎(一)

備註:博主腦袋一熱,想做個軟體專案託管平臺,於是踏上了不歸路... 1. 前提知識    1.1 強制,熟悉linux命令和相關背景知識    1.2 建議,Git相關知識 2.docker簡介     2.1是什麼 &nb

spark學習(基礎)--(第三節)Spark幾種運行模式

一些記錄 image ica runner 1.3 函數 ive 啟動 driver h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff

python學習基礎--編寫登陸接口

-- strip() 不存在 rip 三次 輸入 for循環 循環 是否 #!/usr/bin/env python#_*_conding:utf-8_*_#-----------------------------------------------------#編寫登陸

python學習基礎——字典

log 容器 數據 都是 添加 目錄 cnblogs false seq ? 什麽是字典 字典是另一種可變容器模型,且可存儲任意類型對象。 字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中 ,格式如

python學習基礎—函數

相加 操作 實現 返回結果 arr input 我只 由於 調用 在說函數前,先說一下列表,前面已經說了,一個列表內可以嵌套多個列表,如下 軟件測試 = [‘功能測試‘,‘自動化測試‘,‘安全測試‘,[‘性能測試‘,[‘腳本開發‘,‘壓測‘,‘性能調優‘]]] 但,如何

Python學習-基礎1

什麽 final 相關 pass 所在 正常 語言 技術分享 ash 一、變量: 1)變量定義規範: #1. 變量名只能是 字母、數字或下劃線的任意組合#2. 變量名的第一個字符不能是數字#3. 關鍵字不能聲明為變量名[‘and‘, ‘as‘, ‘assert‘, ‘b

[Python]學習基礎:常見的Python內置函數及模塊

快樂學習python內置函數常見的Python內置函數詳解函數列表進制轉換函數函數名稱及參數功能用例bin(x)將數值x轉化為二進制>>> x=10 >>> bin(10) 10hex(x)將數值x轉化為十六進制>>> x=10 >>>

[Python]學習基礎:列表(List)的淺解

python中list的一身鞏固列表首先先說明中python中數組下標的使用,在java,c或者c++中,每個數組的下標必須是正數,不能出現負數,如在java,c或者c++中使用a[-1],編輯器會報錯,而在python中數組的訪問時可以出現負數下標,表示倒數第幾個元素。list列表的定義 Python中列表

[Python]學習基礎:字符串的處理

sring的那些事字符串在每個編程語言中都有對於字符串的處理,字符串是每個編程語言必不可少的存在,對於字符串我們經常會對字符串進行合並,刪除,轉換,判斷等操作的處理。字符串的格式化 字符串的格式化在編程中我們經常會遇到,在java中有很多類的方法會提供我們我們使用,但對於格式化我們經常要把字符串轉化為相應的數

[Python]學習基礎:函數

函數的那些事函數函數是一段特定功能的,被封裝的,可重用的程序代碼段。給這段程序一個名稱,然後就可以在其他程序的任何地方通過這個名稱任意地運行這個斷碼塊。函數的定義及調用 對於Python函數的定義,不同於大家熟知的c,java等編程語言的定義,以java為例,在定義函數時,要指明函數的返回值類型,要麽為voi

[Python]學習基礎:文件和目錄

python中文件的那點事文件文件是數據在外部介質上的數據的集合,對於文件在Linux系統上包括普通文件,目錄文件,二進制文件,設備文件等。文件的打開或者創建 方法:open(‘file_name’,’打開方式’[,buf_size]) buf_size:參數指的是文件緩存區的大小,0代表不緩存,1代表緩存,

[Python]學習基礎:字典

創建 clas over code ini normal 占用空間 trace 增加 字典字典這個數據結構的功能和它的名字一樣,根據key得到value值。字典的定義 方法: dict={‘key1’:value1,’key2’:value2……..} 對於字典,key值在

Python學習-基礎4 模塊與包與常用模塊

邏輯 zip 了解 mon get() 測試結果 python程序 rec rac 一 模塊介紹 1、什麽是模塊?#常見的場景:一個模塊就是一個包含了一組功能的python文件,比如spam.py,模塊名為spam,可以通過import spam使用。 #在python中

[Python]學習基礎:面向對象編程

必須 outline func pad order ola 項目設計 tom return 面向對象編程是種具有對象概念的程序編程典範,同時也是一種程序開發的抽象方針。它可能包含數據、屬性、代碼與方法。對象則指的是類的實例。它將對象作為程序的基本單元,將程序和數據封裝其中,

Linux學習——基礎

ubunt process 網絡上傳 備份 8bit open 格式 社區 linux內核 學習Linux之前,需要首先了解計算機的基礎知識。1、二進制、十進制相互轉換。156轉換為二進制的方法:逐一減去2的次冪方法。(需要自己提前記住:`27=128;26=64;25=3

深度學習---基礎

一、入門學習資源 1、首推:Keras中文文件:https://keras-cn.readthedocs.io/en/latest/ 神經網路的大結構: 一個網路結構首先需要的是 第一階段:輸入,Note:這裡的輸入是一個向量。 第二階段:特徵提取,其實就是我們常見的VGG

numpy學習基礎(二)

影象操作 SciPy提供了一些處理影象的函式。它可以將影象從磁碟讀入numpy陣列,將numpy陣列作為影象寫入磁碟以及調整影象大小的功能。 from scipy.misc import imread,imsave,imresize img=imread("E:\\Desktop\\894

numpy學習基礎(一)

安裝好Numpy模組後,開始在jupyter上執行沒有問題,後來我開了一個pycharm,建立numpy.py這個檔案後,執行開始報如下錯誤:AttributeError: module ‘numpy‘ has no attribute ‘array‘  由於下載的模組名也為numpy.p