前言
最近在使用Docker中,深刻感受到Docker在工作中帶來的優(yōu)勢,所有對Docker進行一些常用的總結。作為一名Java開發(fā)攻城獅,Docker這個技術是必須要掌握的!為什么這樣說呢?在實際開發(fā)中,Docker可以提高我們的開發(fā)效率以及項目環(huán)境搭建。在未使用Docker之前,都是在本地搭若干個虛擬機進行項目的部署,這樣的方式占據(jù)可大量的磁盤空間以及內存,操作比較繁瑣;但是,如果使用Docker,那就大大的減少磁盤空間與內存的開銷,而且Docker啟動速度更快、使用更方便。這就是帶來的益處!本篇博客前面是一些網(wǎng)絡上專業(yè)釋義的摘抄,后面介紹Docker
- 主要內容有:
- 什么是虛擬化
- 什么是Docker
- 為什么使用Docker
- Docker組件
- Docker的安裝與啟動
- 鏡像與容器的基本指令使用
什么是虛擬化
在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種實體資源,如服務器、網(wǎng)絡、內存及存儲等,予以抽象、轉換后呈現(xiàn)出來,打破實體結構間的不可切割的障礙,使用戶可以比原本的組態(tài)更好的方式來應用這些資源。這些資源的新虛擬部份是不受現(xiàn)有資源的架設方式,地域或物理組態(tài)所限制。一般所指的虛擬化資源包括計算能力和資料存儲。
在實際的生產環(huán)境中,虛擬化技術主要用來解決高性能的物理硬件產能過剩和老的舊的硬件產能過低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件對資源充分利用。虛擬化技術種類很多,例如:軟件虛擬化、硬件虛擬化、內存虛擬化、網(wǎng)絡虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機等等。
什么是Docker
摘抄:Docker 是一個開源項目,誕生于 2013 年初,最初是 dotCloud 公司內部的一個業(yè)余項目。它基于 Google 公司推出的 Go 語言實現(xiàn)。 項目后來加入了 Linux 基金會,遵從了 Apache 2.0 協(xié)議,項目代碼在 GitHub 上進行維護。

- Docker 自開源后受到廣泛的關注和討論,以至于 dotCloud 公司后來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 產品中廣泛應用。
- Docker 項目的目標是實現(xiàn)輕量級的操作系統(tǒng)虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。
- 在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
- 說白了,Docker就是可以看作是一個容器
為什么選擇Docker
(1)上手快
- 用戶只需要幾分鐘,就可以把自己的程序“Docker化”。Docker依賴于“寫時復制”(copy-on-write)模型,使修改應用程序也非常迅速,可以說達到“隨心所致,代碼即改”的境界。
- 隨后,就可以創(chuàng)建容器來運行應用程序了。大多數(shù)Docker容器只需要不到1秒中即可啟動。由于去除了管理程序的開銷,Docker容器擁有很高的性能,同時同一臺宿主機中也可以運行更多的容器,使用戶盡可能的充分利用系統(tǒng)資源。
(2)職責的邏輯分類
- 使用Docker,開發(fā)人員只需要關心容器中運行的應用程序,而運維人員只需要關心如何管理容器。Docker設計的目的就是要加強開發(fā)人員寫代碼的開發(fā)環(huán)境與應用程序要部署的生產環(huán)境一致性。從而降低那種“開發(fā)時一切正常,肯定是運維的問題(測試環(huán)境都是正常的,上線后出了問題就歸結為肯定是運維的問題)”
(3)快速高效的開發(fā)生命周期
- Docker的目標之一就是縮短代碼從開發(fā)、測試到部署、上線運行的周期,讓你的應用程序具備可移植性,易于構建,并易于協(xié)作。(通俗一點說,Docker就像一個盒子,里面可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件件的取。)
(4)鼓勵使用面向服務的架構
- Docker還鼓勵面向服務的體系結構和微服務架構。Docker推薦單個容器只運行一個應用程序或進程,這樣就形成了一個分布式的應用程序模型,在這種模型下,應用程序或者服務都可以表示為一系列內部互聯(lián)的容器,從而使分布式部署應用程序,擴展或調試應用程序都變得非常簡單,同時也提高了程序的內省性。(當然,可以在一個容器中運行多個應用程序)
容器與虛擬機比較
- 下面的圖片比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處,可見容器是在操作系統(tǒng)層面上實現(xiàn)虛擬化,直接復用本地主機的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實現(xiàn)。

- 與傳統(tǒng)的虛擬機相比,Docker優(yōu)勢體現(xiàn)為啟動速度快、占用體積小。
Docker組件
Docker服務器與客戶端
- Docker是一個客戶端-服務器(C/S)架構程序。Docker客戶端只需要向Docker服務器或者守護進程發(fā)出請求,服務器或者守護進程將完成所有工作并返回結果。Docker提供了一個命令行工具Docker以及一整套RESTful API。你可以在同一臺宿主機上運行Docker守護進程和客戶端,也可以從本地的Docker客戶端連接到運行在另一臺宿主機上的遠程Docker守護進程。

Docker鏡像與容器
- 鏡像是構建Docker的基石。用戶基于鏡像來運行自己的容器。鏡像也是Docker生命周期中的“構建”部分。鏡像是基于聯(lián)合文件系統(tǒng)的一種層式結構,由一系列指令一步一步構建出來
- Docker可以幫助你構建和部署容器,你只需要把自己的應用程序或者服務打包放進容器即可。容器是基于鏡像啟動起來的,容器中可以運行一個或多個進程。我們可以認為,鏡像是Docker生命周期中的構建或者打包階段,而容器則是啟動或者執(zhí)行階段。 容器基于鏡像啟動,一旦容器啟動完成后,我們就可以登錄到容器中安裝自己需要的軟件或者服務。
Docker安裝與啟動
安裝Docker
Docker官方建議在Ubuntu中安裝,因為Docker是基于Ubuntu發(fā)布的,而且一般Docker出現(xiàn)的問題Ubuntu是最先更新或者打補丁的。在很多版本的CentOS中是不支持更新最新的一些補丁包的。
這里將在CentOS 7.x以上版本安裝
- (1)yum 包更新到最新
# 更新yum 包
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的鏡像
ustc是老牌的linux鏡像服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的docker鏡像加速器速度很快。ustc docker mirror的優(yōu)勢之一就是不需要注冊,是真正的公共服務。ustc鏡像
- 在/etc/docker/下默認是沒有daemon.json文件,使用Vim編輯文件,在文件中加入以下內容
# vim 編輯
vi /etc/docker/daemon.json
# 加入以下內容
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

Docker的啟動與停止
- 在CentOS7.x以上,systemctl命令是系統(tǒng)服務管理器指令
- 啟動docker
systemctl start docker
- 停止docker
systemctl stop docker
- 重啟docker
systemctl restart docker
- 查看docker狀態(tài)
systemctl status docker
- 開機啟動
systemctl enable docker
- 查看docker概要信息
docker info
- 查看docker幫助文檔
docker --help
常用命令
查看鏡像
docker images

- REPOSITORY:鏡像名稱
- TAG:鏡像標簽
- IMAGE ID:鏡像ID
- CREATED:鏡像的創(chuàng)建日期(不是獲取該鏡像的日期)
- SIZE:鏡像大小
搜索鏡像
如果你需要從網(wǎng)絡中查找需要的鏡像,可以通過以下命令搜索
docker search 鏡像名稱

拉取鏡像
拉取鏡像就是從中央倉庫中下載鏡像到本地
docker pull 鏡像名稱

刪除鏡像
# 按鏡像ID刪除鏡像
docker rmi 鏡像ID
# 刪除所有鏡像
docker rmi `docker images -q`
創(chuàng)建與啟動容器
創(chuàng)建容器有 兩種方式:交互式方式創(chuàng)建容器和守護式方式創(chuàng)建容器
下面是創(chuàng)建容器常用的參數(shù)說明:
- 創(chuàng)建容器命令:docker run
- -i:表示運行容器
- -t:表示容器啟動后會進入其命令行。加入這兩個參數(shù)后,容器創(chuàng)建就能登錄進去。即分配一個偽終端。
- --name :為創(chuàng)建的容器命名。
- -v:表示目錄映射關系(前者是宿主機目錄,后者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然后共享到容器上。
- -d:在run后面加上-d參數(shù),則會創(chuàng)建一個守護式容器在后臺運行(這樣創(chuàng)建容器后不會自動登錄容器,如果只加-i -t兩個參數(shù),創(chuàng)建后就會自動進去容器)。
- -p:表示端口映射,前者是宿主機端口,后者是容器內的映射端口??梢允褂枚鄠€-p做多個端口映射
(1)交互式方式創(chuàng)建容器
docker run -it --name=容器名稱 鏡像名稱:標簽 /bin/bash

(2)守護式方式創(chuàng)建容器
docker run -di --name=容器名稱 鏡像名稱:標簽
- 登錄守護式容器方式
docker exec -it 容器名稱 (或者容器ID) /bin/bash

容器相關指令
- 停止容器
docker stop 容器名稱
- 啟動容器
docker start 容器名稱
- 刪除容器
docker rm 容器名稱