在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各類實體資源,如服務器、網絡、內存及存儲等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使用戶能夠比本來的組態更好的方式來應用這些資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。通常所指的虛擬化資源包括計算能力和資料存儲。html
在實際的生產環境中,虛擬化技術主要用來解決高性能的物理硬件產能過剩和老的舊的硬件產能太低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件 對資源充分利用mysql
虛擬化技術種類不少,例如:軟件虛擬化、硬件虛擬化、內存虛擬化、網絡虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機等等。linux
Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘項目。它基於 Google 公司推出的 Go 語言實現。 項目後來加入了 Linux 基金會,聽從了 Apache 2.0 協議,項目代碼在 GitHub 上進行維護。nginx
Docker 自開源後受到普遍的關注和討論,以致於 dotCloud 公司後來都更名爲 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產品中普遍應用。git
重點:github
Docker 項目的目標是實現輕量級的操做系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。web
在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不須要去關心容器的管理,使得操做更爲簡便。用戶操做 Docker 的容器就像操做一個快速輕量級的虛擬機同樣簡單。redis
爲何選擇Docker?sql
(1)上手快。docker
用戶只須要幾分鐘,就能夠把本身的程序「Docker化」。Docker依賴於「寫時複製」(copy-on-write)模型,使修改應用程序也很是迅速,能夠說達到「隨心所致,代碼即改」的境界。
隨後,就能夠建立容器來運行應用程序了。大多數Docker容器只須要不到1秒中便可啓動。因爲去除了管理程序的開銷,Docker容器擁有很高的性能,同時同一臺宿主機中也能夠運行更多的容器,使用戶儘量的充分利用系統資源。
(2)職責的邏輯分類
使用Docker,開發人員只須要關心容器中運行的應用程序,而運維人員只須要關心如何管理容器。Docker設計的目的就是要增強開發人員寫代碼的開發環境與應用程序要部署的生產環境一致性。從而下降那種「開發時一切正常,確定是運維的問題(測試環境都是正常的,上線後出了問題就歸結爲確定是運維的問題)」
(3)快速高效的開發生命週期
Docker的目標之一就是縮短代碼從開發、測試到部署、上線運行的週期,讓你的應用程序具有可移植性,易於構建,並易於協做。(通俗一點說,Docker就像一個盒子,裏面能夠裝不少物件,若是須要這些物件的能夠直接將該大盒子拿走,而不須要從該盒子中一件件的取。)
(4)鼓勵使用面向服務的架構
Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只運行一個應用程序或進程,這樣就造成了一個分佈式的應用程序模型,在這種模型下,應用程序或者服務均可以表示爲一系列內部互聯的容器,從而使分佈式部署應用程序,擴展或調試應用程序都變得很是簡單,同時也提升了程序的內省性。(固然,能夠在一個容器中運行多個應用程序)
下面的圖片比較了 Docker 和傳統虛擬化方式的不一樣之處,可見容器是在操做系統層面上實現虛擬化,直接複用本地主機的操做系統,而傳統方式則是在硬件層面實現。
與傳統的虛擬機相比,Docker優點體現爲啓動速度快、佔用體積小。
Docker是一個客戶端-服務器(C/S)架構程序。Docker客戶端只須要向Docker服務器或者守護進程發出請求,服務器或者守護進程將完成全部工做並返回結果。Docker提供了一個命令行工具Docker以及一整套RESTful API。你能夠在同一臺宿主機上運行Docker守護進程和客戶端,也能夠從本地的Docker客戶端鏈接到運行在另外一臺宿主機上的遠程Docker守護進程。
鏡像是構建Docker的基石。用戶基於鏡像來運行本身的容器。鏡像也是Docker生命週期中的「構建」部分。鏡像是基於聯合文件系統的一種層式結構,由一系列指令一步一步構建出來。例如:
添加一個文件;
執行一個命令;
打開一個窗口。
也能夠將鏡像看成容器的「源代碼」。鏡像體積很小,很是「便攜」,易於分享、存儲和更新。
Docker能夠幫助你構建和部署容器,你只須要把本身的應用程序或者服務打包放進容器便可。容器是基於鏡像啓動起來的,容器中能夠運行一個或多個進程。咱們能夠認爲,鏡像是Docker生命週期中的構建或者打包階段,而容器則是啓動或者執行階段。 容器基於鏡像啓動,一旦容器啓動完成後,咱們就能夠登陸到容器中安裝本身須要的軟件或者服務。
因此Docker容器就是:
一個鏡像格式;
一些列標準操做;
一個執行環境。
Docker借鑑了標準集裝箱的概念。標準集裝箱將貨物運往世界各地,Docker將這個模型運用到本身的設計中,惟一不一樣的是:集裝箱運輸貨物,而Docker運輸軟件。
和集裝箱同樣,Docker在執行上述操做時,並不關心容器中到底裝了什麼,它不論是web服務器,仍是數據庫,或者是應用程序服務器什麼的。全部的容器都按照相同的方式將內容「裝載」進去。
Docker也不關心你要把容器運到何方:咱們能夠在本身的筆記本中構建容器,上傳到Registry,而後下載到一個物理的或者虛擬的服務器來測試,在把容器部署到具體的主機中。像標準集裝箱同樣,Docker容器方便替換,能夠疊加,易於分發,而且儘可能通用。
Docker用Registry來保存用戶構建的鏡像。Registry分爲公共和私有兩種。Docker公司運營公共的Registry叫作Docker Hub。用戶能夠在Docker Hub註冊帳號,分享並保存本身的鏡像(說明:在Docker Hub下載鏡像巨慢,能夠本身構建私有的Registry)。
Docker官方建議在Ubuntu中安裝,由於Docker是基於Ubuntu發佈的,並且通常Docker出現的問題Ubuntu是最早更新或者打補丁的。在不少版本的CentOS中是不支持更新最新的一些補丁包的。
因爲咱們學習的環境都使用的是CentOS,所以這裏咱們將Docker安裝到CentOS上。注意:這裏建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中,安裝前須要安裝其餘不少的環境並且Docker不少補丁不支持更新。
請直接掛載課程配套的Centos7.x鏡像
(1)yum 包更新到最新
# yum remove docker docker-common docker-selinux docker-engine # rm -rf /var/lib/docker sudo yum update
(2)安裝須要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(3)設置yum源爲阿里雲
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)安裝docker
sudo yum install docker-ce
(5)安裝後查看docker版本
docker -v
ustc是老牌的linux鏡像服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的docker鏡像加速器速度很快。ustc docker mirror的優點之一就是不須要註冊,是真正的公共服務。
https://lug.ustc.edu.cn/wiki/mirrors/help/docker
編輯該文件:(默認該文件沒有,直接新建保存便可)
vi /etc/docker/daemon.json
在該文件中輸入以下內容:
{ "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }
systemctl命令是系統服務管理器指令
啓動docker:
systemctl start docker
中止docker:
systemctl stop docker
重啓docker:
systemctl restart docker
查看docker狀態:
systemctl status docker
開機啓動:
systemctl enable docker
查看docker概要信息
docker info
查看docker幫助文檔
docker --help
docker images
REPOSITORY:鏡像名稱
TAG:鏡像標籤
IMAGE ID:鏡像ID
CREATED:鏡像的建立日期(不是獲取該鏡像的日期)
SIZE:鏡像大小
這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下
若是你須要從網絡中查找須要的鏡像,能夠經過如下命令搜索
docker search 鏡像名稱
NAME:倉庫名稱
DESCRIPTION:鏡像描述
STARS:用戶評價,反應一個鏡像的受歡迎程度
OFFICIAL:是否官方
AUTOMATED:自動構建,表示該鏡像由Docker Hub自動構建流程建立的
拉取鏡像就是從中央倉庫中下載鏡像到本地
docker pull 鏡像名稱
例如,我要下載centos7鏡像
docker pull centos:7
按鏡像ID刪除鏡像
docker rmi 鏡像ID
刪除全部鏡像
docker rmi `docker images -q`
查看正在運行的容器
docker ps
查看全部容器
docker ps –a
查看最後一次運行的容器
docker ps –l
查看中止的容器
docker ps -f status=exited
建立容器經常使用的參數說明:
建立容器命令:docker run
-i:表示運行容器
-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器建立就能登陸進去。即分配一個僞終端。
--name :爲建立的容器命名。
-v:表示目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄),可使用多個-v作多個目錄或文件映射。注意:最好作目錄映射,在宿主機上作修改,而後共享到容器上。
-d:在run後面加上-d參數,則會建立一個守護式容器在後臺運行(這樣建立容器後不會自動登陸容器,若是隻加-i -t兩個參數,建立後就會自動進去容器)。
-p:表示端口映射,前者是宿主機端口,後者是容器內的映射端口。可使用多個-p作多個端口映射
(1)交互式方式建立容器
docker run -it --name=容器名稱 鏡像名稱:標籤 /bin/bash
這時咱們經過ps命令查看,發現能夠看到啓動的容器,狀態爲啓動狀態
退出當前容器,容器也就中止了
exit
(2)守護式方式建立容器:
docker run -di --name=容器名稱 鏡像名稱:標籤 docker run -di --name=mycentos2 centos:centos7 不進入容器 內部
登陸守護式容器方式:
docker exec -it 容器名稱 (或者容器ID) /bin/bash
退出容器,容器不會中止,還在運行用命令docker ps
查看
exit
中止容器:
docker stop 容器名稱(或者容器ID)
啓動容器:
docker start 容器名稱(或者容器ID)
若是咱們須要將文件從宿主機拷貝到容器內可使用cp命令
docker cp 須要拷貝的文件或目錄 容器名稱:容器目錄
也能夠將文件從容器內拷貝出來
docker cp 容器名稱:容器目錄 須要拷貝的文件或目錄
咱們能夠在建立容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣咱們就能夠經過修改宿主機某個目錄的文件從而去影響容器。
建立容器 添加-v參數 後邊爲 宿主機目錄:容器目錄,例如:
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
若是你共享的是多級的目錄,可能會出現權限不足的提示。
這是由於CentOS7中的安全模塊selinux把權限禁掉了,咱們須要添加參數 --privileged=true 來解決掛載的目錄沒有權限的問題
咱們能夠經過如下命令查看容器運行的各類數據(容器詳情)
docker inspect 容器名稱(容器ID)
也能夠直接執行下面的命令直接輸出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID)
刪除指定的容器:
docker rm 容器名稱(容器ID)
(1)拉取mysql鏡像
docker pull mysql:5.6
(2)建立容器
docker run -di --name=my_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
-p 表明端口映射,格式爲 宿主機映射端口:容器運行端口
-e 表明添加環境變量 MYSQL_ROOT_PASSWORD 是root用戶的登錄密碼
(3)遠程登陸mysql
鏈接宿主機的IP ,指定端口爲33306
(1)拉取鏡像
docker pull nginx
(2)建立Nginx容器
docker run -di --name=mynginx -p 80:80 nginx
(1)拉取鏡像
docker pull redis
(2)建立容器
docker run -di --name=myredis -p 6379:6379 redis bind 0.0.0.0 daemonize NO protected-mode no requirepass 123456 docker run -p 6379:6379 --name redis_6379 -v /home/docker/reids/conf/redis.conf:/etc/redis/redis.conf -v /home/docker/reids/data:/data -d redis:alpine3.11 redis-server /etc/redis/redis.conf --appendonly yes
咱們能夠經過如下命令將容器保存爲鏡像
docker commit mynginx mynginx_img
咱們能夠經過如下命令將鏡像保存爲tar 文件
docker save -o mynginx.tar mynginx_img
首先咱們先刪除掉mynginx_img鏡像 而後執行此命令進行恢復
docker load -i mynginx.tar
-i 輸入的文件
執行後再次查看鏡像docker images
,能夠看到鏡像已經恢復
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終建立一個新的鏡像。
一、對於開發人員:能夠爲開發團隊提供一個徹底一致的開發環境;
二、對於測試人員:能夠直接拿開發時所構建的鏡像或者經過Dockerfile文件構建一個新的鏡像開始工做了;
三、對於運維人員:在部署時,能夠實現應用的無縫移植。
命令 | 做用 |
---|---|
FROM image_name:tag | 定義了使用哪一個基礎鏡像啓動構建流程 |
MAINTAINER user_name | 聲明鏡像的建立者 |
ENV key value | 設置環境變量 (能夠寫多條) |
RUN command | 是Dockerfile的核心部分(能夠寫多條) |
ADD source_dir/file dest_dir/file | 將宿主機的文件複製到容器內,若是是一個壓縮文件,將會在複製後自動解壓 |
COPY source_dir/file dest_dir/file | 和ADD類似,可是若是有壓縮文件並不能解壓 |
WORKDIR path_dir | 設置工做目錄 |
步驟:
(1)建立目錄
mkdir –p /usr/local/dockerdjango
(2)下載jdk-8u171-linux-x64.tar.gz並上傳到服務器(虛擬機)中的/usr/local/dockerjdk8目錄
(3)建立文件Dockerfile vi Dockerfile
#依賴鏡像名稱和ID FROM centos:7 #指定鏡像建立者信息 MAINTAINER TEST #切換工做目錄 WORKDIR /usr
(4)執行命令構建鏡像
docker build -t='django2.0' .
注意後邊的空格和點,不要省略
(5)查看鏡像是否創建完成
docker images
(1)拉取私有倉庫鏡像(此步省略)
docker pull registry
(2)啓動私有倉庫容器
docker run -di --name=registry -p 5000:5000 registry
(3)打開瀏覽器 輸入地址http://192.168.1.12:5000/v2/_catalog看到{"repositories":[]}
表示私有倉庫搭建成功而且內容爲空
注意: 地址ip爲宿主機的ip地址
(4)修改daemon.json
vi /etc/docker/daemon.json
添加如下內容,保存退出。
注意: 地址ip爲宿主機的ip地址
{"insecure-registries":["192.168.1.12:5000"]}
此步用於讓 docker信任私有倉庫地址
(5)重啓docker 服務
systemctl restart docker
(1)標記此鏡像爲私有倉庫的鏡像
docker tag django2.0 192.168.1.12:5000/django2.0
(2)再次啓動私服容器
docker start registry
(3)上傳標記的鏡像
docker push 192.168.1.12:5000/django2.0