Docker簡介
什么是虛擬化
在計算機中,虛擬化(英語:Virtualization)是一種資源管理技術,是將計算機的各種物體資源,如服務器、網路、記憶體及存盤等,予以抽象、轉換后呈現出來,打破物體結構間的不可切割的障礙,使用戶可以比原本的組態更好的方式來應用這些資源,這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制,一般所指的虛擬化資源包括計算能力和資料存盤,
在實際的生產環境中,虛擬化技術主要用來解決高性能的物理硬體產能過剩和老的舊的硬體產能過低的重組重用,透明化底層物理硬體,從而最大化的利用物理硬體對資源充分利用,
虛擬化技術種類很多,例如:軟體虛擬化、硬體虛擬化、記憶體虛擬化、網路虛擬化(vip)、桌面虛擬化、服務虛擬化、虛擬機等等,
什么是Docker
Docker 是一個開源專案,誕生于 2013 年初,最初是 dotCloud 公司內部的一個業余專案,它基于 Google 公司推出的 Go 語言實作, 專案后來加入了 Linux 基金會,遵從了 Apache 2.0 協議,專案代碼在GitHub上進行維護,

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

與傳統的虛擬機相比,Docker又是體現為啟動速度快、占用體積小,
使用上的區別如下圖:
Docker組件
Docker是一個客戶端-服務器(C/S)架構程式,Docker客戶端只需要向Docker服務器或者守護行程發出請求,服務器或者守護行程將完成所有作業并回傳結果,Docker提供了一個命令列工具Docker以及一整套RESTful API,你可以在同一臺宿主機上運行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運輸軟體,
和集裝箱一樣,Docker在執行上述操作時,并不關心容器中到底裝了什么,它不管是web服務器,還是資料庫,或者是應用程式服務器什么的,所有的容器都按照相同的方式將內容“裝載”進去,
Docker也不關心你要把容器運到何方:我們可以在自己的筆記本中構建容器,上傳到Registry,然后下載到一個物理的或者虛擬的服務器來測驗,在把容器部署到具體的主機中,像標準集裝箱一樣,Docker容器方便替換,可以疊加,易于分發,并且盡量通用,
Registry(注冊中心)
Docker用Registry來保存用戶構建的鏡像,Registry分為公共和私有兩種,Docker公司運營公共的Registry叫做Docker Hub,用戶可以在Docker Hub注冊賬號,分享并保存自己的鏡像(說明:在Docker Hub下載鏡像巨慢,可以自己構建私有的Registry),
Docker安裝與啟動
安裝Docker
Docker官方建議在Ubuntu中安裝,因為Docker是基于Ubuntu發布的,而且一般Docker出現的問題Ubuntu是最先更新或者打補丁的,在很多版本的CentOS中是不支持更新最新的一些補丁包的,
由于我服務器環境都使用的是CentOS,因此這里我們將Docker安裝到CentOS上,注意:這里建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中,安裝前需要安裝其他很多的環境而且Docker很多補丁不支持更新,
- yum包更新到最新,
1 sudo yum update
- 安裝需要的軟體包, yum-util提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的,
1 sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 設定yum源為阿里云,
1 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安裝Docker,
1 sudo yum install docker-ce
- 安裝后查看docker版本,
1 docker -v
設定ustc的鏡像
ustc是老牌的linux鏡像服務提供者了,還在遙遠的ubuntu 5.04版本的時候就在用,ustc的Docker鏡像加速器速度很快,ustc docker mirror的優勢之一就是不需要注冊,是真正的公共服務,
- 編輯檔案,
1 vim /etc/docker/daemon.json
- 在該檔案中輸入如下內容,
1 { 2 "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] 3 }
Docker的啟動與停止
systemctl命令是系統服務管理器指令,
- 啟動Docker,
1 systemctl start docker - 停止Docker,
1 systemctl stop docker - 重啟Docker,
1 systemctl restart docker - 查看Docker狀態,
1 systemctl status docker - 開機啟動Docker,
1 systemctl enable docker - 查看Docker概要資訊,
1 docker info
- 查看Docker幫助檔案,
1 docker --help
常用命令
鏡像相關命令
查看鏡像
1 docker images
| 結果列名 | 說明 |
|---|---|
| REPOSITORY | 鏡像名稱 |
| TAG | 鏡像標簽 |
| IMAGE ID | 鏡像ID |
| CREATED | 鏡像的創建日期(不是獲取該鏡像的日期) |
| SIZE | 鏡像大小 |
這些鏡像都是存盤在Docker宿主機的/var/lib/docker目錄下,
搜索鏡像
如果你需要從網路中查找需要的鏡像,可以通過以下命令搜索,
1 docker search 鏡像名稱
| 結果列名 | 說明 |
|---|---|
| NAME | 倉庫名稱 |
| DESCRIOTION | 鏡像描述 |
| STARS | 用戶評價,反應一個鏡像的受歡迎程度 |
| OFFCIAL | 是否官方 |
| AUTOMATED | 自動構建,表示該鏡像由Docker Hub自動構建流程創建的 |
拉取鏡像
拉取鏡像就是從中央倉庫中下載鏡像到本地,
1 docker pull 鏡像名稱
例如,我要下載centos7鏡像
1 docker pull centos:7
洗掉鏡像
按鏡像ID洗掉鏡像,
1 docker rmi 鏡像ID
洗掉所有鏡像,
1 docker rmi `docker images -q`
容器相關命令
查看容器
查看正在運行的容器,
1 docker ps
查看所有容器,
1 docker ps –a
查看最后一次運行的容器,
1 docker ps –l
查看停止的容器
1 docker ps -f status=exited
創建與啟動容器
創建容器命令,
1 docker run
創建容器常用的引數說明,
| 引數 | 說明 |
|---|---|
| -i | 表示運行容器 |
| -t | 表示容器啟動后會進入其命令列,加入這兩個引數后,容器創建就能登錄進去,即分配一個偽終端, |
| --name | 表示給創建的容器命名 |
| -v | 表示目錄映射關系(前者是宿主機目錄,后者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或檔案映射,注意:最好做目錄映射,在宿主機上做修改,然后共享到容器上, |
| -d | 在run后面加上-d引數,則會創建一個守護式容器在后臺運行(這樣創建容器后不會自動登錄容器,如果只加-i -t兩個引數,創建后就會自動進去容器) |
| -p | 表示埠映射,前者是宿主機埠,后者是容器內的映射埠,可以使用多個-p做多個埠映射 |
互動式方式創建容器
1 docker run -it --name=容器名稱 鏡像名稱:標簽 /bin/bash
退出當前容器,
1 exit
守護式方式創建容器
1 docker run -di --name=容器名稱 鏡像名稱:標簽
登錄守護式容器,
1 docker exec -it 容器名稱 (或者容器ID) /bin/bash
停止與啟動容器
停止容器,
1 docker stop 容器名稱或者容器ID
啟動容器,
1 docker start 容器名稱或者容器ID
檔案拷貝
將宿主機的檔案拷貝到容器內,
1 docker cp 需要拷貝的檔案或目錄 容器名稱:容器目錄
將容器內的檔案拷貝到宿主機,
1 docker cp 容器名稱:容器目錄 需要拷貝的檔案或目錄
目錄掛載
我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的檔案從而去影響容器,
創建容器時,添加-v引數,后邊為宿主機目錄:容器目錄,
例如:
1 docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果你共享的是多級的目錄,可能會出現權限不足的提示,
這是因為CentOS7中的安全模塊selinux把權限禁掉了,我們需要添加引數--privileged=true來解決掛載的目錄沒有權限的問題,
查看容器IP地址
我們可以通過以下命令查看容器運行的各種資料,
1 docker inspect 容器名稱或容器ID
也可以直接執行下面的命令直接輸出IP地址,
1 docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱或容器ID
洗掉容器
洗掉指定的容器,
1 docker rm 容器名稱或容器ID
應用部署
MySQL部署
- 拉取MySQL鏡像,
1 docker pull mysql:5.7 - 創建容器,
1 # docker run -di --name=容器名字 -p 宿主機埠:容器埠 -e MYSQL_ROOT_PASSWORD=mysql密碼 容器名稱 2 docker run -di --name=mymysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
-
遠程登錄mysql:連接宿主機的IP ,指定埠為3306,
Tomcat部署
- 拉取Tomcat鏡像,
1 docker pull tomcat:7-jre7
- 創建容器,
1 # 創建tomcat容器,并掛載了webapps目錄 2 # -p表示地址映射 -v 表示目錄掛載 3 docker run -di --name=mytomcat -p 8080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
Nginx部署
- 拉取Nginx鏡像,
1 docker pull nginx - 創建容器,
1 docker run -di --name=mynginx -p 80:80 nginx
Redis部署
- 拉取Redis鏡像,
1 docker pull redis
- 創建容器,
1 docker run -di --name=myredis -p 6379:6379 redis
遷移與備份

其中涉及到的命令有:
- docker commit:將容器保存為鏡像
- docker save:將鏡像備份為tar檔案
- docker load:根據tar檔案恢復為鏡像
容器保存為鏡像
格式:
1 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
如:
1 [root@a ~]# docker ps 2 CONTAINER ID IMAGE 3 5d9b684c8c64 nginx:latest 4 [root@a ~]# docker commit 5d9b684c8c64 my-nginx-image 5 sha256:32a0031127bc12826c0bc8e4292b8a38b98c5ab0158fd0189d59dbc27dadceec 6 [root@a ~]# docker images 7 REPOSITORY TAG IMAGE ID CREATED SIZE 8 my-nginx-image latest 32a0031127bc 4 seconds ago 133MB
鏡像備份(將鏡像保存為tar檔案)
格式:
1 docker save [OPTIONS] IMAGE [IMAGE...] -o, --output string Write to a file, instead of STDOUT
如:
1 [root@a ~]# docker save -o my-nginx-image.tar my-nginx-image:latest 2 [root@a ~]# ll 3 總用量 133708 4 -rw-------. 1 root root 136857088 9月 15 11:13 my-nginx-image.tar
鏡像恢復與遷移(將tar檔案恢復為鏡像)
格式:
1 docker load [OPTIONS] -i, --input string Read from tar archive file, instead of STDIN
如:
1 docker load -i my-nginx-image-3.tar
Dockerfile自定義鏡像
什么是Dockerfile
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/docker-jdk
- 下載jdk-8u171-linux-x64.tar.gz并上傳到服務器(虛擬機)中的/usr/local/dockerjdk8目錄,
- 創建Dockerfile檔案,
1 vim /usr/local/docker-jdk/Dockerfile - 將以下內容寫入Dockerfile檔案,
1 # 指定來源鏡像 2 FROM centos:7 3 ? 4 # 指定鏡像作者姓名 5 MAINTAINER tankang 6 ? 7 # 指定作業目錄:容器作業時相對路徑的基準 8 WORKDIR /usr 9 ? 10 # 創建鏡像時執行指令創建/usr/local/java目錄 11 RUN mkdir /usr/local/java 12 ? 13 # 將壓縮檔案添加到鏡像中,是相對路徑jar,會自動解壓 14 ADD jdk-8u121-linux-x64.tar.gz /usr/local/java 15 ? 16 # 設定Java環境變數 17 ENV JAVA_HOME=/usr/local/java/jdk1.8.0_121 18 ENV PATH=$JAVA_HOME:$PATH
- 構建鏡像,
1 # 格式 2 docker build [OPTIONS] PATH | URL | - 3 # 例如 4 docker build -t='jdk1.8' . 5 # -t后面指定的是鏡像的名字,當然也可以在后面用冒號附加tag,最后的點表示宿主機中的當前目錄,讓構建程式在當前目錄下找到Dockerfile,
- 查看鏡像是否建立完成,
1 docker images
Docker私有倉庫
簡介
Docker官方的Docker hub是一個用于管理公共鏡像的倉庫,我們可以從上面拉取鏡像到本地,也可以把我們自己的鏡像推送上去,但是,有時候我們的服務器無法訪問互聯網,或者你不希望將自己的鏡像放到公網當中,那么我們就需要搭建自己的私有倉庫來存盤和管理自己的鏡像,
私有倉庫搭建與配置
- 拉取私有倉庫鏡像,
1 docker pull registry - 啟動私有倉庫容器,
1 docker run -di --name=registry -p 5000:5000 registry
- 打開瀏覽器,輸入地址http://宿主機IP:5000/v2/_catalog,如果頁面輸出{"repositories":[]},表示私有倉庫搭建成功并且內容為空,
- 修改daemon.json,
1 vim /etc/docker/daemon.json - 添加以下內容(此步用于讓Docker信任私有倉庫地址),
1 {"insecure-registries":["宿主機IP:5000"]}
- 重啟Docker服務,
1 systemctl restart docker
鏡像上傳至私有倉庫
- 標記此鏡像為私有倉庫的鏡像,
1 docker tag jdk1.8 宿主機IP:5000/jdk1.8
- 再次啟動私服容器,
1 docker start registry - 上傳標記的鏡像,
1 docker push 宿主機IP:5000/jdk1.8
- 打開瀏覽器,輸入地址http://宿主機IP:5000/v2/_catalog,如果頁面輸出{"repositories":["jdk1.8"]},表示上傳成功,
從私有倉庫拉取鏡像
大多數情況下,都是某臺服務器部署了私有鏡像倉庫之后,到其它服務器上從私有倉庫中拉取鏡像,若要拉取私有倉庫鏡像需要去修改docker的組態檔,設定啟動時候的倉庫地址,
1 # 打開組態檔 2 vi /usr/lib/systemd/system/docker.service 3 # 在打開的上述檔案中按照下面的圖,添加如下的內容;注意修改下面內容中的ip地址 4 --add-registry=宿主機IP:5000 --insecure-registry=宿主機IP:5000 \ 5 # 修改完后需要重新加載docker組態檔并重啟docker 6 systemctl daemon-reload 7 systemctl restart docker

配置完成之后,需要重啟docker服務,重啟后就可以從私有倉庫拉取鏡像,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/50439.html
標籤:Java
