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軟件包

    [root@docker 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
    。。。
    
    [root@docker 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

    
    [root@docker mnt]# systemctl start doceker
    Failed to start doceker.service: Unit not found.
    [root@docker mnt]# systemctl start docker
    [root@docker 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
    
    [root@docker 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倉庫,具體方法:

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

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

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

Docker容器的基本操作

將本地tar包載入到本地鏡像庫使用docker load命令


[root@localhost 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
[root@localhost 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 參數


[root@localhost packages]# docker run ubuntu echo "hello world"
hello world

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

docker run -i -t IMAGE /bin/bash

-i 為容器始終打開標准輸入

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


[root@localhost packages]# docker run -it ubuntu /bin/bash
root@855833c3672f:/# echo "hello docker"
hello docker
root@855833c3672f:/# 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 列出最新創建的容器


[root@localhost 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

執行結果參數:

[root@localhost 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


[root@localhost packages]# docker run --name=fsx_docker -it ubuntu /bin/bash
root@304d46ba1c87:/# exit
exit
[root@localhost 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 以交互模式啟動

刪除容器

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


[root@localhost 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
[root@localhost packages]# docker rm 855833c3672f
855833c3672f
[root@localhost packages]# docker rm 797239db86e0
797239db86e0
[root@localhost 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 run -it IMAGE /bin/bash

ctrl+p ctrl+q


[root@localhost packages]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost packages]# docker run -it --name=fsx1 ubuntu /bin/bash
root@dcbb80e0404b:/# [root@localhost packages]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
dcbb80e0404b        ubuntu              "/bin/bash"         26 seconds ago      Up 25 seconds                           fsx1
//注意:此時的容器仍是啟動狀態,就意味着它還在運行

再次進入退出(仍在啟動中)的容器(附加到運行中的容器)

docker attach docker_name


[root@localhost packages]# docker attach fsx1
root@dcbb80e0404b:/# 

啟動守護式容器

docker run -d IMAGE COMMAND ARG...

-d 在啟動容器時,使用后台

這是啟動守護式容器最重要的命令


[root@localhost packages]# docker run --name=fsx2 -d ubuntu /bin/bash -c "while true;do echo hello;sleep 1;done"
529cea9c4075854083e1d025f5639055a8cde98d17fe4d6d74a208215d706427
[root@localhost packages]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
529cea9c4075        ubuntu              "/bin/bash -c 'whi..."   5 seconds ago       Up 3 seconds                            fsx2
//容器一直在運行

使用log命令查看容器內部運行狀況

docker logs -f -t --tail vector_name

-f 一直跟蹤logs,時時更新

-t 在返回結果上加上時間戳

--tail 返回結尾出多少書量的日志,不指定返回全部


[root@localhost packages]# docker logs -f -t --tail 5 fsx2
2018-05-24T03:35:35.642795622Z hello
2018-05-24T03:35:36.643727589Z hello
2018-05-24T03:35:37.644724326Z hello
2018-05-24T03:35:38.645707632Z hello
2018-05-24T03:35:39.646708718Z hello
2018-05-24T03:35:40.647727168Z hello
2018-05-24T03:35:41.648612161Z hello
2018-05-24T03:35:42.649668735Z hello
^C

查看容器內部進程

docker top vector_name


[root@localhost packages]# docker top fsx2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                11775               11758               0                   11:32               ?                   00:00:00            /bin/bash -c while true;do echo hello;sleep 1;done
root                13142               11775               0                   11:37               ?                   00:00:00            sleep 1

在docker運行中的容器啟動新的進程(docker的理念是一個容器運行一個服務):

docker exec -d -i -t vector_name COMMAND ARG...

與run命令相似


[root@localhost packages]# docker exec -it fsx2 /bin/bash
root@529cea9c4075:/# echo hello fsx
hello fsx
root@529cea9c4075:/# [root@localhost packages]# docker top fsx2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                11775               11758               0                   11:32               ?                   00:00:00            /bin/bash -c while true;do echo hello;sleep 1;done
root                13440               13423               0                   11:40               pts/5               00:00:00            /bin/bash
root                13475               11775               0                   11:40               ?                   00:00:00            sleep 1
//這里使用ctrl+p ctrl+q

停止守護式容器

docker stop vector_name

docker kill vector_name

stop是發送一個信號給容器,等待停止

kill直接停止容器


[root@localhost packages]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
529cea9c4075        ubuntu              "/bin/bash -c 'whi..."   9 minutes ago       Up 9 minutes                            fsx2
dcbb80e0404b        ubuntu              "/bin/bash"              18 minutes ago      Up 18 minutes                           fsx1
[root@localhost packages]# docker stop fsx1
fsx1
[root@localhost packages]# docker kill fsx2
fsx2

總結

ctrl+p ctrl+q 將交互式容器轉到后台

docker run -d 創建一個守護式容器

docker logs 查看容器日志

docker top 查看容器內部進程

docker exec 為運行中的容器啟動一個新進程

docker stop/kill 停止一個容器

這里只介紹一些常見的docker命令,及子命令使用;更多信息可以使用docker幫助文件

man docker-run(logs、stop、exec...)


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com