Docker簡介及基本應用
前言
1、虛擬化
在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源,如服務器、網絡、內存及存儲等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使用戶可以比原本的組態更好的方式來應用這些資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。一般所指的虛擬化資源包括計算能力和資料存儲。
在實際的生產環境中,虛擬化技術主要用來解決高性能的物理硬件產能過剩和老的舊的硬件產能過低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件 對資源充分利用
虛擬化技術種類很多,例如:軟件虛擬化、硬件虛擬化、內存虛擬化、網絡虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機等等。
解決高性能機器無法拆分的問題。
2、虛擬化種類
(1)全虛擬化架構
虛擬機的監視器(hypervisor)是類似於用戶的應用程序運行在主機的OS之上,如VMware的workstation,這種虛擬化產品提供了虛擬的硬件。
(2)OS層虛擬化架構
(3)硬件層虛擬化
硬件層的虛擬化具有高性能和隔離性,因為hypervisor直接在硬件上運行,有利於控制VM的OS訪問硬件資源,使用這種解決方案的產品有VMware ESXi 和 Xen server
Hypervisor是一種運行在物理服務器和操作系統之間的中間軟件層,可允許多個操作系統和應用共享一套基礎物理硬件,因此也可以看作是虛擬環境中的“元"操作系統,它可以協調訪問服務器上的所有物理設備和虛擬機,也叫虛擬機監視器(Virtual Machine Monitor,VMM)。
Hypervisor是所有虛擬化技術的核心。當服務器啟動並執行Hypervisor時,它會給每一臺虛擬機分配適量的內存、CPU、網絡和磁盤,並加載所有虛擬機的客戶操作系統。 宿主機
Hypervisor是所有虛擬化技術的核心,軟硬件架構和管理更高效、更靈活,硬件的效能能夠更好地發揮出來。常見的產品有:VMware、KVM、Xen等等。Openstack。
一、docker簡介
1、什麽是docker
1.1容器技術
在計算機的世界中,容器擁有一段漫長且傳奇的歷史。容器與管理程序虛擬化(hypervisor virtualization,HV)有所不同,管理程序虛擬化通過中間層將一臺或者多臺獨立的機器虛擬運行於物理硬件之上,而容器則是直接運行在操作系統內核之上的用戶空間。因此,容器虛擬化也被稱為“操作系統級虛擬化",容器技術可以讓多個獨立的用戶空間運行在同一臺宿主機上。
由於“客居"於操作系統,容器只能運行於底層宿主機相同或者相似的操作系統,這看起來並不是非常靈活。例如:可以在Ubuntu服務中運行Redhat Enterprise Linux,但無法在Ubuntu服務器上運行Microsoft Windows。
相對於徹底隔離的管理程序虛擬化,容器被認為是不安全的。而反對這一觀點的人則認為,由於虛擬容器所虛擬的是一個完整的操作系統,這無疑增大了攻擊範圍,而且還要考慮管理程序層潛在的暴露風險。
盡管有諸多局限性,容器還是被廣泛部署於各種各樣的應用場合。在超大規模的多租戶服務部署、輕量級沙盒以及對安全要求不太高的隔離環境中,容器技術非常流行。最常見的一個例子就是“權限隔離監牢"(chroot jail),它創建一個隔離的目錄環境來運行進程。如果權限隔離監牢正在運行的進程被入侵者攻破,入侵者便會發現自己“身陷囹圄",因為權限不足被困在容器所創建的目錄中,無法對宿主機進一步破壞。
最新的容器技術引入了OpenVZ、Solaris Zones以及Linux容器(LXC)。使用這些新技術,容器不在僅僅是一個單純的運行環境。在自己的權限類內,容器更像是一個完整的宿主機。對Docker來說,它得益於現代Linux特性,如控件組(control group)、命名空間(namespace)技術,容器和宿主機之間的隔離更加徹底,容器有獨立的網絡和存儲棧,還擁有自己的資源管理能力,使得同一臺宿主機中的多個容器可以友好的共存。
容器被認為是精益技術,因為容器需要的開銷有限。和傳統虛擬化以及半虛擬化相比,容器不需要模擬層(emulation layer)和管理層(hypervisor layer),而是使用操作系統的系統調用接口。這降低了運行單個容器所需的開銷,也使得宿主機中可以運行更多的容器。
盡管有著光輝的歷史,容器仍未得到廣泛的認可。一個很重要的原因就是容器技術的復雜性:容器本身就比較復雜,不易安裝,管理和自動化也很困難。而Docker就是為了改變這一切而生的。
Docker是一種輕量級的容器化技術。
1.2容器與虛擬機比較
(1)本質上的區別
(2)使用上的區別
1.3 docker特點
(1)上手快
用戶只需要幾分鐘,就可以把自己的程序“Docker化"。Docker依賴於“寫時復制"(copy-on-write)模型,使修改應用程序也非常迅速,可以說達到“隨心所致,代碼即改"的境界。
隨後,就可以創建容器來運行應用程序了。大多數Docker容器只需要不到1秒中即可啟動。由於去除了管理程序的開銷,Docker容器擁有很高的性能,同時同一臺宿主機中也可以運行更多的容器,使用戶盡可能的充分利用系統資源。
(2)職責的邏輯分類清晰
使用Docker,開發人員只需要關心容器中運行的應用程序,而運維人員只需要關心如何管理容器。Docker設計的目的就是要加強開發人員寫代碼的開發環境與應用程序要部署的生產環境一致性。從而降低那種“開發時一切正常,肯定是運維的問題(測試環境都是正常的,上線後出了問題就歸結為肯定是運維的問題)。
(3)快速高效的開發生命周期
Docker的目標之一就是縮短代碼從開發、測試到部署、上線運行的周期,讓你的應用程序具備可移植性,易於構建,並易於協作。(通俗一點說,Docker就像一個盒子,裏面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件件的取。)
(4)鼓勵使用面向服務的架構
Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只運行一個應用程序或進程,這樣就形成了一個分布式的應用程序模型,在這種模型下,應用程序或者服務都可以表示為一系列內部互聯的容器,從而使分布式部署應用程序,擴展或調試應用程序都變得非常簡單,同時也提高了程序的內省性(當然,可以在一個容器中運行多個應用程序)。
2、docker組件
2.1 docker客戶端和服務器(守護進程)
Docker是一個客戶端-服務器(C/S)架構程序。Docker客戶端只需要向Docker服務器或者守護進程發出請求,服務器或者守護進程將完成所有工作並返回結果。Docker提供了一個命令行工具Docker以及一整套RESTful API。你可以在同一臺宿主機上運行Docker守護進程和客戶端,也可以從本地的Docker客戶端連接到運行在另一臺宿主機上的遠程Docker守護進程。
2.2 Image(鏡像)
鏡像是構建Docker的基石。用戶基於鏡像來運行自己的容器。鏡像也是Docker生命周期中的“構建"部分。鏡像是基於聯合文件系統的一種層式結構,由一系列指令一步一步構建出來。例如:
添加一個文件;↓
執行一個命令;↓
打開一個窗口。↓
也可以將鏡像當作容器的“源代碼"。鏡像體積很小,非常“便攜",易於分享、存儲和更新。
2.3 Registry(註冊中心、倉庫)
Docker用Registry來保存用戶構建的鏡像。Registry分為公共和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。用戶可以在Docker Hub註冊賬號,分享並保存自己的鏡像(說明:在Docker Hub下載鏡像巨慢,可以自己構建私有的Registry)。
2.4 Containers (容器)
Docker可以幫助你構建和部署容器,你只需要把自己的應用程序或者服務打包放進容器即可。容器是基於鏡像啟動起來的,容器中可以運行一個或多個進程。我們可以認為,鏡像是Docker生命周期中的構建或者打包階段,而容器則是啟動或者執行階段。 容器基於鏡像啟動,一旦容器啟動完成後,我們就可以登錄到容器中安裝自己需要的軟件或者服務。
所以Docker容器就是:
一個鏡像格式;
一些列標準操作;
一個執行環境。
Docker借鑒了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker將這個模型運用到自己的設計中,唯一不同的是:集裝箱運輸貨物,而Docker運輸軟件。
和集裝箱一樣,Docker在執行上述操作時,並不關心容器中到底裝了什麽,它不管是web服務器,還是數據庫,或者是應用程序服務器什麽的。所有的容器都按照相同的方式將內容“裝載"進去。
Docker也不關心你要把容器運到何方:我們可以在自己的筆記本中構建容器,上傳到Registry,然後下載到一個物理的或者虛擬的服務器來測試,在把容器部署到具體的主機中。像標準集裝箱一樣,Docker容器方便替換,可以疊加,易於分發,並且盡量通用。
使用Docker,我們可以快速的構建一個應用程序服務器、一個消息總線、一套實用工具、一個持續集成(CI)測試環境或者任意一種應用程序、服務或工具。我們可以在本地構建一個完整的測試環境,也可以為生產或開發快速復制一套復雜的應用程序棧。
2.5 其他
libcontainer
namespace 命名空間
cgroups 資源配額
二、docker的安裝與啟動
1、安裝docker
yum install docker
2、查看docker的版本
docker -v
docker version
3、啟動與停止docker
systemctl status docker #查看docker的狀態
systemctl start docker #啟動docker
systemctl stop docker #停止docker
systemctl restart docker #重啟docker
systemctl enable docker #設置開機啟動
docker info #查看docker概要
docker help #查看幫助
三、docker鏡像的操作
1、什麽是docker鏡像
Docker鏡像是一個文件,裏面存儲的核心:最基本的操作系統 + 軟件運行環境
2、列出鏡像
docker images #查看本地主機上已有的鏡像
?
[root@docker_c7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest fce289e99eb9 2 weeks ago 1.84 kB
docker.io/tomcat latest 1a51cb5e3006 2 weeks ago 462 MB
docker.io/nginx latest 7042885a156a 2 weeks ago 109 MB
docker.io/mysql latest 102816b1ee7d 2 weeks ago 486 MB
docker.io/redis latest 5d2989ac9711 2 weeks ago 95 MB
docker.io/centos latest 1e1148e4cc2c 6 weeks ago 202 MB
?
REPOSITORY:鏡像所在的倉庫名稱
TAG:鏡像標簽(相當於版本號)
IMAGE ID:鏡像ID
CREATED:鏡像的創建日期(不是獲取該鏡像的日期)
SIZE:鏡像大小
這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下
3、搜索鏡像
docker search 鏡像名稱
比如
docker search tomcat
?
[root@docker_c7 ~]# docker search tomcat
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/tomcat Apache Tomcat is an... 2259 [OK]
docker.io docker.io/tomee Apache TomEE is an... 60 [OK]
?
NAME:倉庫名稱
DESCRIPTION:鏡像描述
STARS:用戶評價,反應一個鏡像的受歡迎程度
OFFICIAL:是否官方
AUTOMATED:自動構建,表示該鏡像由Docker Hub自動構建流程創建的
4、拉取鏡像
docker pull 鏡像名稱:tag
比如(不加tag:下載最新的latest)
docker pull mysql
由於國內連接國外網絡拉取鏡像較慢,可以修改配置改為從國內鏡像提供者拉取
https://docker.mirrors.ustc.edu.cn #ustc鏡像 不需要註冊 完全公共
vi /etc/docker/daemon.json
?
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
?
修改完畢後,重啟docker
systemctl restart docker
5、刪除鏡像
docker rmi 鏡像id(IMAGE ID)
比如
docker rmi fce289e99eb9
四、docker容器的操作
1、查看容器
docker ps #正在運行中的容器
docker ps –a #所有的容器(正在運行或者停止的)
2、創建與啟動容器
1、交互式容器
docker run -it --name mycentos01 centos:7 /bin/bash
命令:docker run –it –name 容器名稱 鏡像名稱:tag /bin/bash
直接進入容器裏面了,可以使用exit退出
一旦退出,這個容器就會關閉。
如果想再次登錄這個容器,可以使用如下命令:
1、先啟動這個容器
命令:docker start 容器名稱
docker start mycentos01
2、使用下面的命令登錄容器
命令:docker exec –it 容器名稱 /bin/bash
docker exec -it mycentos01 /bin/bash
?
這個時候,再次退出容器,查看容器的狀態,還是up(運行)狀態
2、守護式容器(後臺運行)
docker run -di --name mycentos02 centos:7
命令:docker run -di --name 容器名稱 鏡像名稱:tag
註意:這種方法創建的docker容器,不會直接進入容器,而是在後臺運行
?
如果想進入這個後臺運行的容器,使用如下命令:
命令:docker exec –it 容器名稱 /bin/bash
docker exec -it mycentos02 /bin/bash
參數說明
-i:表示運行容器
-t:表示容器啟動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個偽終端。
--name :為創建的容器命名。
-v:表示目錄映射關系(前者是宿主機目錄,後者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。註意:最好做目錄映射,在宿主機上做修改,然後共享到容器上。
-d:在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後不會自動登錄容器,如果只加-i -t兩個參數,創建後就會自動進去容器)。
-p:表示端口映射,前者是宿主機端口,後者是容器內的映射端口。可以使用多個-p做多個端口映射
3、停止與啟動容器
docker stop mycentos01 #停止容器
docker restart mycentos01 #重啟
docker start mycentos01 #啟動容器
4、文件拷貝
1、將文件拷貝到容器內 :docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄
本地創建準備拷貝的文件
cd /usr/local/
mkdir docker
cd docker/
vim test.txt
將文件拷貝到容器內的/usr/local/ 目錄下面
docker cp test.txt mycentos01:/usr/local/
?
2、將容器內的文件拷貝到宿主機上:docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄
在容器內部創建要拷貝的文件:
vim docker_test.txt
exit
docker cp mycentos01:/usr/local/docker_test.txt ./ 拷貝容器內的文件到當前目錄下面?
5、目錄掛載
我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器。
?
1、命令:創建容器 添加-v參數 後邊為 宿主機目錄:容器目錄
舉例:
docker run -di --name mycentos03 -v /usr/local/docker/:/usr/local/docker centos:7
將本地的/usr/local/docker 目錄映射到mycentos03容器內的/usr/local/docker目錄下
這樣,兩邊可以共享文件
?
註意:最好添加--privileged=true
docker run -di --name mycentos03 -v /usr/local/docker/:/usr/local/docker --privileged=true centos:7
這是因為CentOS7中的安全模塊selinux把權限禁掉了,我們需要添加參數 --privileged=true 來解決掛載的目錄沒有權限的問題。
6、查看容器的ip
1、查看所有的數據(包含ip)
docker inspect mycentos01
2、僅僅查看ip地址:
docker inspect --format=‘{{.NetworkSettings.IPAddress}}‘ mycentos01?
7、刪除容器
註意:只能刪除停止運行的容器
命令:docker rm mycentos01
五、使用docker部署應用
1、mysql部署
1、拉取mysql鏡像
docker pull mysql
docker images
2、創建mysql容器
docker run -di --name c7_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
?
-p 代表端口映射,格式為 宿主機映射端口:容器運行端口
-e 代表添加環境變量 MYSQL_ROOT_PASSWORD是root用戶的登陸密碼
3、進入mysql容器,登錄mysql
docker exec -it c7_mysql /bin/bash
mysql -uroot –p
4、查看mysql容器的ip
docker inspect c7_mysql
2、tomcat部署
1、拉取tomcat鏡像
docker pull tomcat
2、創建tomcat容器
docker run -di --name c7_tomcat -p 9000:8080 -v /usr/local/docker:/usr/local/tomcat/webapps --privileged=true tomcat
?
-v: 代表目錄映射
3、部署web應用
將web應用web_demo上傳到:/usr/local/docker目錄下面 修改cas系統的配置文件(deployerConfigContext.xml),修改數據庫連接的url,172.17.0.2為docker中mysql的ip ? <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" p:driverClass="com.mysql.jdbc.Driver" p:jdbcUrl="jdbc:mysql://172.17.0.2:3306/c7db?characterEncoding=utf8" p:user="root" ......
註意:重啟下tomcat容器:docker restart c7_tomcat
3、nginx部署
1、拉取nginx鏡像
docker pull nginx
2、創建nginx容器
docker run -di --name c7_nginx -p80:80 nginx
註意:映射的端口為80端口
3、測試nginx
瀏覽器地址欄輸入: http://xxx.xxx.xxx.xxx/
4、配置反向代理
1、從容器拷貝配置文件到宿主機
cd /usr/local/docker/
docker cp c7_nginx:/etc/nginx/nginx.conf ./nginx.conf
2、編輯nginx.conf 添加反向代理的配置
Vim nginx.conf
?
upstream tomcat-cas {
server 172.17.0.7:8080;
}
server {
listen 80;
server_name passport.xxx.com;
location / {
proxy_pass http://tomcat-web_demo;
index index.html index.htm;
}
}
?
3、將修改後的配置拷貝到nginx容器
docker cp nginx.conf c7_nginx:/etc/nginx/nginx.conf
4、重啟nginx容器
docker restart c7_nginx
5、修改本機的hosts文件,添加如下內容:
xxx.xxx.xxx.xxx passport.xxx.com
?
4、redis部署
1、拉取redis鏡像
docker pull redis
2、創建redis容器
docker run -di --name c7_redis -p 6379:6379 redis
3、客戶端測試
1、先在本機安裝redis,再通過redis-cli連接redis容器
yum install epel-release
yum install redis
?
2、使用redis-cli連接redis容器
redis-cli -h 192.168.44.66
六、Docker容器的備份與遷移
1、容器保存為鏡像
docker commit c7_nginx mynginx
命令:docker commit 容器名稱 新鏡像的名稱
2、鏡像的備份
docker save -o mynginx.tar mynginx
命令:將本地的mynginx鏡像備份成文件mynginx.tar
3、鏡像的恢復及遷移
1、先刪除本地的mynginx鏡像
docker rmi mynginx
2、使用docker load 恢復鏡像
docker load -i mynginx.tar
七、其他參考文章
https://blog.csdn.net/zmx729618/article/details/72930474/
https://blog.csdn.net/xiaochendefendoushi/article/details/81903980
DockerFile
https://www.cnblogs.com/lighten/p/6900556.html
https://blog.csdn.net/len9596/article/details/79767259
https://www.cnblogs.com/boshen-hzb/p/6400272.html
Docker簡介及基本應用