Docker虛擬化實戰學習——基礎篇(轉)
Docker虛擬化實戰學習——基礎篇
2018年05月26日 02:17:24 北緯34度停留 閱讀數:773更多 個人分類: 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的使用場景
-
使用Docker容器開發、測試、部署服務。
docker本身是輕量級的,所以本地開發人員可以構建、執行並分享docker容器,容器可以在開發環境中建立,然後提交到測試,在到生產環境。
-
建立隔離的執行環境
在很多企業應用中,同一服務的不同版本可能服務於不同的使用者,使用Docker很容易建立不同的環境來執行不同版本的服務
-
搭建測試環境
有於Docker的輕量化,所以開發者很容易在本地搭建測試環境,用來測試程式在不同系統下的相容性,甚至叢集式的測試環境。
-
構建多使用者的平臺服務(PaaS)基礎設施
-
即同軟體即服務(SaaS)應用程式
-
高效能、超大規模的宿主機部署
Docker的基本組成
Docker基本組成:
Docker Client 客戶端
Docker Daemon 守護程序
Docker Image 映象
Docker Container 容器
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使用了五種名稱空間:
PID 程序隔離
NET 管理網路介面
IPC 管理程序間通訊
MNT 管理掛載點,檔案系統間的隔離
UTS 管理核心和版本標示的隔離
-
Cgroup(Control Groups)
Cgroup對隔離的資源進行管理,是一種用來限制、記錄,隔離程序組資源的機制。就是為了容器技術而生的。
Cgroup對資源的管理方式:
資源限制 如:對記憶體的分配上限
優先順序設定 如:某個程序優先使用cpu時間片
資源計量 計算程序組使用了多少系統資源,尤其時在記費系統中
資源控制 將程序組掛起或恢復
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
-
下載安裝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
-
啟動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
-
基於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 run -it IMAGE /bin/bash
ctrl+p ctrl+q
[[email protected] packages]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [[email protected] packages]# docker run -it --name=fsx1 ubuntu /bin/bash [email protected]:/# [[email protected] 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
[[email protected] packages]# docker attach fsx1 [email protected]:/#
啟動守護式容器
docker run -d IMAGE COMMAND ARG...
-d 在啟動容器時,使用後臺
這是啟動守護式容器最重要的命令
[[email protected] packages]# docker run --name=fsx2 -d ubuntu /bin/bash -c "while true;do echo hello;sleep 1;done" 529cea9c4075854083e1d025f5639055a8cde98d17fe4d6d74a208215d706427 [[email protected] 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 返回結尾出多少書量的日誌,不指定返回全部
[[email protected] 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
[[email protected] 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命令相似
[[email protected] packages]# docker exec -it fsx2 /bin/bash [email protected]:/# echo hello fsx hello fsx [email protected]:/# [[email protected] 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直接停止容器
[[email protected] 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 [[email protected] packages]# docker stop fsx1 fsx1 [[email protected] 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...)