Docker虛擬化技術
什麼是Docker?
它是Linux裏運行的應用的開源軟件,它跟KVM的區別更像是Docker是運行在Linux系統中的一個軟件,以應用的形式來模擬成虛擬機使用(想象一下再Windows上運行VMware和QQ),既可以是一個應用,也可以是一臺服務,甚至是一個完整的操作系統
Docker與傳統虛擬化比較
啓動速度更快、計算能力損耗幾乎無、性能接近原生超過虛擬機、系統支持量也遠遠超過虛擬機、隔離性資源限制,而虛擬機完全隔離
Docker的核心概念
鏡像:Docker的鏡像是創建容器的基礎,可以理解是一個安裝系統環境的鏡像,也可以理解爲是安裝一個應用程序的鏡像
容器:Docker的容器是從鏡像創建來的運行實例,可以創建、啓動、停止和刪除,所創建的每個容器都是相互隔離、互不可見的,可以保證平臺安全
倉庫:Docker的倉庫是用來存儲鏡像的地方可以把創建的鏡像使用push命令上傳上去,其他容器使用可以直接pull下來
安裝Docker
安裝Docker的兩種方式|:curl獲得安裝腳本安裝和yum倉庫進行安裝
注意:這裏是在CentOS7.2下yum進行安裝,目前Docker只支持64位系統
1.下載安裝docker
yum -y install docker
2.啓動docker服務
systemctl start docker
查看docker版本信息:docker version
一、Docker的鏡像和容器的操作
搜索鏡像:docker search 關鍵字
比如:docker search nginx
下載鏡像:docker pull docker.io/linuxserver/nginx
查看鏡像信息:docker images
REPOSITORY:鏡像屬於的倉庫
TAG:鏡像的標籤信息
IMAGE ID:鏡像的唯一ID號
CREATED:鏡像的創建時間
VIRTUAL SIZE:鏡像的大小
可以通過紅線圈起來的ID號查看該鏡像的詳細信息:docker inspect fb5ca9bbaab4
本地鏡像添加新的標籤:docker tag 名稱 新名稱:新標籤
比如:docker tag docker.io/linuxserver/nginx nginx:nginx
刪除鏡像:docker rmi nginx:nginx
注意:當鏡像擁有多個標籤時,該命令只是刪除該鏡像的一個標籤而已,刪除命令後面跟ID時,確保該鏡像沒有被容器使用,會先刪除所有標籤,再刪除該鏡像本身,如果該鏡像被容器使用,正確做法是先刪除依賴該鏡像的所有容器再刪除該鏡像
鏡像的導出和載入(從一臺機器上導出鏡像,然後複製鏡像文件可以載入到其他機器上使用該鏡像)
導出鏡像:docker save -o 存儲文件名 存儲的鏡像
比如:docker save -o nginx docker.io/linuxserver/nginx
載入鏡像:docker load < nginx 或者 docker --input nginx
上傳鏡像:在公共倉庫成功註冊一個賬號,登錄使用push命令上傳
比如這個賬號爲admin:
docker tag docker.io/linuxserver/nginx admin/nginx:nginx
docker login
docker push admin/nginx:nginx
創建容器:docker create 【選項】鏡像 運行的程序環境
-i:讓容器輸入保持打開
-t:讓Docker分配一個僞終端
比如:docker create -it docker.io/linuxserver/nginx /bin/bash
查看所有容器的運行狀態:docker ps -a
-a:列出系統最近一次啓動的容器
啓動容器(通過上圖紅線的ID號啓動):docker start ba7a5dc88d29
補充:創建並啓動容器:docker run = docker create + docker start
持續在後臺運行容器:docker run -d centos /usr/bin/bash -c "while true;do echo hello;done"
停止容器:docker stop ba7a5dc88d29
進入容器(可以理解爲進入虛擬機的shell環境):docker exec -it ba7a5dc88d29 /bin/bash
導出容器:docker export 容器ID/容器名稱 > 文件名
比如:docker export ba7a5dc88d29 > nginxtar
導入容器:cat 文件名 | docker import - 生成的鏡像名:標籤
比如:cat nginxtar | docker import - nginx:nginx
刪除容器:docker rm ba7a5dc88d29
-f:強制刪除一個正在運行的容器
補充:Docker資源控制
限制CPU使用速率(CPU的百分比以1000位單位)
CPU使用率限定爲20%:docker run --cpu-quota 20000 容器名
也可以修改Cgroup配置文件(通過echo命令導入)
echo 20000 > /sys/fs/cgroup/cpu/docker/容器編號/cpu.cfs_quota_us
多任務按比例分享CPU
比如:有A、B、C三個容器運行,佔用比例分配1:1:2
docker run --cpu-shares 1024 容器A
docker run --cpu-shares 1024 容器B
docker run --cpu-shares 2048 容器C
限制CPU內核使用
限制該容器內的進程只會在編號1、2、3、4的CPU上運行(第一個內核用0開始表示)
docker run --cpuset-cpus 0,1,2,3 容器名
對內存使用的限制:docker run -m 512m 容器名
對blkio的限制:docker run --device-write-bps /dev/sda1:1mb 容器名
二、Docker的數據管理
數據卷:數據卷是一個供容器使用的目錄,位於容器中,可以在容器之間掛載,可將宿主機的目錄掛載到數據捲上,實現數據的遷移
docker run -it -d -v /date1 -v /date2 -p 8888:80 --name my-nginx docker.io/linuxserver/nginx
掛載主機目錄作爲數據卷
比如:使用httpd:centos鏡像創建一個名爲web的容器,將宿主機的/var/www/html目錄掛載到/date1目錄上
docker run -d -v /var/www/html:/date1 --name web httpd:centos
三、Docker網絡通信
端口映射
-P:實現隨機映射,Docker會把容器自身的80端口隨機映射在宿主機的隨機端口上
-p:實現指定把容器的哪個端口映射在宿主機的哪個端口上
docker run -d -P httpd:centos
docker run -d -p 8888:80 httpd:centos
容器網絡互連
--link name:alias
nme:要連接的容器名稱,alias是這個連接的別名
創建源容器:docker run -d -P --name web1 httpd:centos
創建接收容器:docker run -d -P --name web2 --link web1:web1 httpd:centos
測試:(只能接收容器ping通源容器的網絡)
四、Docker鏡像的創建方法
已有鏡像創建
docker commit 【選項】容器ID/名稱 倉庫名稱:標籤
-m:顯示說明信息
-a:顯示作者信息
-p:生成過程中停止容器運行
例:查看到你要創建已有鏡像的id,然後執行命令docker commit -m "new" -a "myname" bf249d1747a7 docker:new
下載模板使用模板創建
下載地址爲:http://openvz.org/Download/template/precreated
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:new
Docerfile創建鏡像
1.創建工作目錄
mkdir apache
cd apache
2.創建編寫Dockerfile文件
vim Dockerfile
#基於的基礎鏡像
FROM centos
#維護該鏡像的用戶信息
MAINTAINER The CentOS Project<[email protected]>
#編寫鏡像操作指令安裝apache的軟件包
RUN yum -y update
RUN yum -y install httpd
#開啓80端口
EXPOSE 80
#複製網站首頁文件
ADD index.html /var/www/html/index.html
#將執行腳本複製到鏡像中
ADD run.sh /run.sh
RUN chmod 775 /run.sh
#啓動容器時執行腳本
CMD ["/run.sh"]
3.編寫執行腳本
vim run.sh
#!/bin/bash
#清理httpd的緩存
rm-rf /run/httpd*
#啓動apache服務
exec /usr/sbin/apachectl -D FOREGROUND
4.創建apache的測試網頁
vim index.html
<html><h1>this is docker test!!!</h1></html>
5.使用Dockerfile文件生成鏡像
-t:指定鏡像的標籤信息
docker build -t httpd:centos
6.使用新生成的鏡像文件運行容器
docker run -d -p 8888:80 httpd:centos
該命令-p選項實現從本地的8888端口到容器中80端口的映射
7.測試訪問該主機ip的8888端口訪問網頁
補充:構建私有倉庫
1.在需要構建私有倉庫的服務器上下載registry鏡像
docker pull registry
2.在/etc/docker/目錄下創建json文件
vim /etc/docker/daemon.json
{"insecure-registries":["192.168.0.101:5000"]}
systemctl restart docker
3.使用下載好的registry鏡像啓動一個容器(默認倉庫存放於容器內的/tmp/registry目錄下)
docker run -d -p 5000:5000 -v /date/registry:/tmp/registry registry
4.就可以上傳鏡像
docker tag nginx 192.168.0.101:5000/nginx(修改標籤)
docker push 192.168.0.101:5000/nginx