Docker容器化教程
Docker容器虛擬化
學(xué)習(xí)目標(biāo):
- 掌握Docker基礎(chǔ)知識,能夠理解Docker鏡像與容器的概念
- 完成Docker安裝與啟動
- 掌握Docker鏡像與容器相關(guān)命令
- 掌握Tomcat Nginx 等軟件的常用應(yīng)用的安裝
- 掌握docker遷移與備份相關(guān)命令
- 能夠運用Dockerfile編寫創(chuàng)建容器的腳本
- 能夠搭建與使用docker私有倉庫
第一章 Docker簡介
1.1 什么是虛擬化
虛擬化,是指通過虛擬化技術(shù)將一臺計算機虛擬為多臺邏輯計算機。在一臺計算機上同時運行多個邏輯計算機,每個邏輯計算機可運行不同的操作系統(tǒng),并且應(yīng)用程序都可以在相互獨立的空間內(nèi)運行而互不影響,從而顯著提高計算機的工作效率。
虛擬化技術(shù)種類很多,例如:軟件虛擬化、硬件虛擬化、內(nèi)存虛擬化、網(wǎng)絡(luò)虛擬化(vip)、桌面虛擬化、服務(wù)虛擬化、虛擬機等等。
問題:為什么會有docker出現(xiàn)?
一款產(chǎn)品從開發(fā)到上線,從操作系統(tǒng),到運行環(huán)境,再到應(yīng)用配置。作為開發(fā)+運維之間的協(xié)作我們需要關(guān)心很多東西,這也是很多互聯(lián)網(wǎng)公司都不得不面對的問題,特別是各種版本的迭代之后,不同版本環(huán)境的兼容,對運維人員都是考驗 , 這個時候 Docker 橫空出世,是因為它對此給出了一個標(biāo)準(zhǔn)化的解決方案。
環(huán)境配置如此麻煩,換一臺機器,就要重來一次,費力費時。很多人想到,能不能從根本上解決問題,軟件可以帶環(huán)境安裝?也就是說,安裝的時候,把原始環(huán)境一模一樣地復(fù)制過來。開發(fā)人員利用 Docker 可以消除協(xié)作編碼時“在我的機器上可正常工作”的問題。

之前,可以發(fā)現(xiàn),每發(fā)布一個程序,都要走一遍以上的流程:
1.2 什么是Docker
Docker 是一個開源的應(yīng)用容器引擎,基于 Go 語言開發(fā)。Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上,也可以實現(xiàn)虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
Docker的主要目標(biāo)是“Build,Ship and Run Any App,Anywhere”,也就是通過對應(yīng)用組件的封裝、分發(fā)、部署、運行等生命周期的管理,使用戶的APP(可以是一個WEB應(yīng)用或數(shù)據(jù)庫應(yīng)用等等)及其運行環(huán)境能夠做到“一次封裝,到處運行”。
總之一句話:只需要一次配置好環(huán)境,換到別的機子上就可以一鍵部署好,大大簡化了操作 。

-
為什么選擇Docker?
- Docker的鏡像提供了除內(nèi)核外完整的運行時環(huán)境,確保了應(yīng)用運行環(huán)境一致性,從而不會再出現(xiàn)“這段代碼在我機器上沒問題啊”這類問題;——一致的運行環(huán)境
- 可以做到秒級、甚至毫秒級的啟動時間。大大的節(jié)約了開發(fā)、測試、部署的時間。——更快速的啟動時間
- 避免公用的服務(wù)器,資源會容易受到其他用戶的影響。——隔離性
- 善于處理集中爆發(fā)的服務(wù)器使用壓力;——彈性伸縮,快速擴展
- 可以很輕易的將在一個平臺上運行的應(yīng)用,遷移到另一個平臺上,而不用擔(dān)心運行環(huán)境的變化導(dǎo)致應(yīng)用無法正常運行的情況。——遷移方便
- 使用Docker可以通過定制應(yīng)用鏡像來實現(xiàn)持續(xù)集成、持續(xù)交付、部署。——持續(xù)交付和部署
-
Docker應(yīng)用場景
① Web 應(yīng)用的自動化打包和發(fā)布
② 自動化測試和持續(xù)集成、發(fā)布
③ 在服務(wù)型環(huán)境中部署和調(diào)整數(shù)據(jù)庫或其他的后臺應(yīng)用
使用Docker可以實現(xiàn)開發(fā)人員的開發(fā)環(huán)境、測試人員的測試環(huán)境、運維人員的生產(chǎn)環(huán)境的一致性。

Docker借鑒了標(biāo)準(zhǔn)集裝箱的概念。標(biāo)準(zhǔn)集裝箱將貨物運往世界各地,Docker將這個模型運用到自己的設(shè)計中,唯一不同的是:集裝箱運輸貨物,而Docker運輸軟件。
1.3 容器與虛擬機比較
下面的圖片比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處,可見容器是在操作系統(tǒng)層面上實現(xiàn)虛擬化,直接復(fù)用本地主機的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實現(xiàn)。
- 傳統(tǒng)虛擬機

傳統(tǒng)虛擬機技術(shù)基于安裝在主操作系統(tǒng)上的虛擬機管理系統(tǒng)(如:VirtualBox和VMWare等),創(chuàng)建虛擬機(虛擬出各種硬件),在虛擬機上安裝從操作系統(tǒng),在從操作系統(tǒng)中安裝部署各種應(yīng)用。
- Docker

Docker容器是在操作系統(tǒng)層面上實現(xiàn)虛擬化,直接復(fù)用本地主機的操作系統(tǒng),而傳統(tǒng)虛擬機則是在硬件層面實現(xiàn)虛擬化。與傳統(tǒng)的虛擬機相比,Docker優(yōu)勢體現(xiàn)為啟動速度快、占用體積小。
- 使用上的區(qū)別

簡單來說: 容器和虛擬機具有相似的資源隔離和分配優(yōu)勢,但功能有所不同,因為容器虛擬化的是操作系統(tǒng),而不是硬件,因此容器更容易移植,效率也更高。
1.4 Docker 組件
1.4.1 Docker組成部分
Docker是一個客戶端-服務(wù)器(C/S)架構(gòu)程序。Docker客戶端只需要向Docker服務(wù)器或者守護進程發(fā)出請求,服務(wù)器或者守護進程將完成所有工作并返回結(jié)果。Docker提供了一個命令行工具Docker以及一整套RESTful API。你可以在同一臺宿主機上運行Docker守護進程和客戶端,也可以從本地的Docker客戶端連接到運行在另一臺宿主機上的遠程Docker守護進程。


1.4.2 Docker鏡像與容器
鏡像:類似虛擬機鏡像 , 是一個特殊的文件系統(tǒng)
操作系統(tǒng)分為內(nèi)核和用戶空間。對于Linux而言,內(nèi)核啟動后,會掛載root文件系統(tǒng)為其提供用戶空間支持。而Docker鏡像(Image),就相當(dāng)于是一個root文件系統(tǒng)。
Docker鏡像是一個特殊的文件系統(tǒng),除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。 鏡像不包含任何動態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會被改變。
容器:類似linux系統(tǒng)環(huán)境,運行和隔離應(yīng)用。是鏡像運行時的實體
鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計中的類和實例一樣,鏡像是靜態(tài)的定義,容器是鏡像運行時的實體。容器可以被創(chuàng)建、啟動、停止、刪除、暫停等 。
倉庫:集中存放鏡像文件的地方。
鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主上運行,但是, 如果需要在其它服務(wù)器上使用這個鏡像,我們就需要一個集中存儲、分發(fā)鏡像的地方,比如后面我們要學(xué)的,Docker Registry就是這樣的服務(wù)。
1.4.3 Registry(注冊中心)
Docker用Registry來保存用戶構(gòu)建的鏡像。Registry分為公共和私有兩種。Docker公司運營公共的Registry叫做Docker Hub。用戶可以在Docker Hub注冊賬號,分享并保存自己的鏡像(說明:在Docker Hub下載鏡像巨慢,可以自己構(gòu)建私有的Registry)。
第二章 Docker安裝與啟動
2.1 安裝Docker-CentOS7
Docker官方建議在Ubuntu中安裝,因為Docker是基于Ubuntu發(fā)布的,而且一般Docker出現(xiàn)的問題Ubuntu是最先更新或者打補丁的。在很多版本的CentOS中是不支持更新最新的一些補丁包的。? 由于我們學(xué)習(xí)的環(huán)境都使用的是CentOS,因此這里我們將Docker安裝到CentOS上。
注意:這里建議安裝在CentOS7.x以上的版本,在CentOS6.x的版本中,安裝前需要安裝其他很多的環(huán)境,而且Docker很多補丁不支持更新。
- 官網(wǎng)中文安裝參考手冊
https://docs.docker.com/install/linux/docker-ce/centos/
-
確定你是CentOS7及以上版本
cat /etc/redhat-release
-
yum安裝gcc相關(guān)
-
CentOS7能上外網(wǎng)
-
檢查gcc和g++是否安裝好,如果沒有安裝好,則需要安裝。
-
安裝gcc和g++
yum -y install gcc
yum -y install gcc-c++
-
-
安裝需要的軟件包
| yum install -y yum-utils device-mapper-persistent-data lvm2 |
|---|
- 設(shè)置鏡像倉庫
- 大坑(千萬不要試,網(wǎng)速慢,超時,安裝不上)
| yum-config-manager --add-repo (centos快速添加yum源)https://download.docker.com/linux/centos/docker-ce.repo 報錯:官網(wǎng)太慢,一定超時。 [Errno 14] curl#35 - TCP connection reset by peer [Errno 12] curl#35 - Timeout |
|---|
- 推薦:阿里云服務(wù)器
| yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
|---|
- 更新yum軟件包索引
| yum makecache fast |
|---|
- 安裝DOCKER CE(社區(qū)版)(DOCKER EE企業(yè)版收費)
| yum -y install docker-ce |
|---|
- 啟動docker
- 手動啟動:systemctl start docker
- 自動啟動:systemctl enable docker
- 測試
- 檢查版本:docker version
- 下載并運行HelloWorld:docker run hello-world
- 如果下載不下來,可以配置鏡像加速器
- 輸出這段提示以后,hello world就會停止運行,容器自動終止。

- run干了什么
![計算機生成了可選文字: 以該鏡像為模板生產(chǎn)容器實例運行 開始 DoCker在本機中 尋找該鏡像 本機是否有該鏡像 下載該鏡像到本地 以該說像為棋板生產(chǎn)容瀚實例運行 去DockerHub上查找該鏡像 Hub能否找到 返回失敗錯誤,查不到該鏡像]
-
配置鏡像加速CentOS7版本
mkdir -p /etc/docker
vim /etc/docker/daemon.json
- #網(wǎng)易云
| { "registry-mirrors": ["http://hub-mirror.c.163.com"] } |
|---|
- #阿里云(推薦)
| { "registry-mirrors": ["https://8y2y8njn.mirror.aliyuncs.com"] } |
|---|
-
#ustc
#是老牌的linux鏡像服務(wù)提供者了,還在遙遠的ubuntu 5.04版本的時候就在用。ustc的docker鏡像加速器速度很快。
#ustc docker mirror的優(yōu)勢之一就是不需要注冊,是真正的公共服務(wù)。
#https://lug.ustc.edu.cn/wiki/mirrors/help/docker
在該文件中輸入如下內(nèi)容:
| { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] } |
|---|
systemctl daemon-reload
systemctl restart docker
- 卸載
- systemctl stop docker
- yum -y remove docker-ce
- rm -rf /var/lib/docker
- 卸載舊版本
- 2019.11英文官網(wǎng)版本
| yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine |
|---|
2.2 Docker的啟動與停止
2.2.1 命令
| 啟動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 |
2.2.2 幫助手冊:docker --help


2.2.3 指令介紹
| cp | 本地文件系統(tǒng)(OS操作系統(tǒng)|宿主機)和容器之間進行文件或者文件夾拷貝 |
|---|---|
| exec | 登錄一個容器,使用命令行操作正在運行的容器。 |
| images | 鏡像的集合查詢。 |
| ps | 容器列表 |
| pull | 下載鏡像 |
| restart | 重啟一個或多個容器 |
| rm | 刪除一個或多個容器 |
| rmi | 刪除一個或多個鏡像 |
| run | 創(chuàng)建一個容器,并運行起來 |
| save | 導(dǎo)出鏡像到一個文件(tar)中 |
| search | 搜索鏡像(從Docker Hub) |
| start | 啟動一個或多個已經(jīng)停止的容器 |
| stop | 停止一個或多個正在運行的容器 |
第三章 常用命令
鏡像:Docker鏡像是由文件系統(tǒng)疊加而成(是一種文件的存儲形式);是docker中的核心概念,可以認為鏡像就是對某些運行環(huán)境或者軟件打的包,用戶可以從docker倉庫中下載基礎(chǔ)鏡像到本地,比如,開發(fā)人員可以從docker倉庫拉取(下載)一個只包含centos7系統(tǒng)的基礎(chǔ)鏡像,然后在這個鏡像中安裝jdk、mysql、Tomcat和自己開發(fā)的應(yīng)用,最后將這些環(huán)境打成一個新的鏡像。開發(fā)人員將這個新的鏡像提交給測試人員進行測試,測試人員只需要在測試環(huán)境下運行這個鏡像就可以了,這樣就可以保證開發(fā)人員的環(huán)境和測試人員的環(huán)境完全一致。
3.1 鏡像相關(guān)命令
3.1.1 查看鏡像
查看鏡像可以使用如下命令:docker images

-
REPOSITORY:鏡像名稱
-
TAG:鏡像標(biāo)簽(版本)
-
IMAGE ID:鏡像ID
-
CREATED:鏡像的創(chuàng)建日期(不是獲取該鏡像的日期)
-
SIZE:鏡像大小
這些鏡像都是存儲在Docker的 /var/lib/docker 目錄下
3.1.2 搜索鏡像
從網(wǎng)絡(luò)中查找需要的鏡像:docker search 鏡像名稱
例如 下載一個 nginx 鏡像

- NAME:倉庫名稱
- DESCRIPTION:鏡像描述
- STARS:用戶評價,反應(yīng)一個鏡像的受歡迎程度
- OFFICIAL:是否官方
- AUTOMATED:自動構(gòu)建,表示該鏡像由Docker Hub自動構(gòu)建流程創(chuàng)建
3.1.3 拉取鏡像
拉取鏡像就是從Docker倉庫下載鏡像到本地,鏡像名稱格式為 【名稱:版本號】,如果版本號不指定則是最新的版本
命令:docker pull 鏡像名稱
下載一個 nginx 的鏡像 , 需要注意:如果下載的時候,不指定版本,會下載最新版本

剛剛下載的鏡像通過 docker images 就可以查看

3.1.4 刪除鏡像
可以按照鏡像id刪除鏡像,命令如下:docker rmi 鏡像ID

刪除單個鏡像(-f 強制刪除):docker rmi -f 鏡像ID
刪除多個鏡像:docker rmi -f 鏡像名1:TAG 鏡像名2:TAG
刪除所有鏡像:docker rmi -f $(docker images -qa)
3.1.5 從Docker Hub拉取
Docker鏡像首頁,包括官方鏡像和其它公開鏡像。Docker Hub上最受歡迎的10大鏡像(通過Docker registry API獲取不了鏡像被pull的個數(shù),只能通過鏡像的stars數(shù)量來衡量鏡像的流行度。毫無疑問,擁有最高stars數(shù)量的庫都是官方庫)。
https://hub.docker.com/search?image_filter=official&type=image

國情的原因,國內(nèi)下載 Docker HUB 官方的相關(guān)鏡像比較慢,可以使用國內(nèi)(docker.io)的一些鏡像加速器,鏡像保持和官方一致,關(guān)鍵是速度快,推薦使用。
3.2 容器相關(guān)命令
容器也是docker中的核心概念,鏡像是創(chuàng)建容器的軟件 , 容器是由鏡像運行產(chǎn)生的運行實例。鏡像和容器的關(guān)系,就如同Java語言中類和對象的關(guān)系。
如果需要通俗的描述容器的話,我覺得容器就是一個存放東西的地方,就像書包可以裝各種文具、衣柜可以放各種衣服、鞋架可以放各種鞋子一樣。我們現(xiàn)在所說的容器存放的東西可能更偏向于應(yīng)用。比如網(wǎng)站、程序甚至是系統(tǒng)環(huán)境。

3.2.1 查看容器
| 查看正在運行的容器: | docker ps |
|---|---|
| 查看所有容器: | docker ps –a |
| 查看最后一次運行的容器: | docker ps –l |
| 查看停止的容器: | docker ps -f status=exited |
3.2.2 創(chuàng)建與啟動容器
① 什么是宿主機?
就是主機,這個概念是相對于子機而言的,比如你安裝有虛擬機的話,那么相對于虛擬機而言,你正在使用的計算機就是宿主機,虛擬機是安裝在主機上的,必須在主機上才能運行,主機就是一個“宿主”。
② 創(chuàng)建容器常用的參數(shù)說明:
創(chuàng)建容器命令:docker run
| -i:表示運行容器 -t:表示容器啟動后會進入其命令行。加入這兩個參數(shù)后,容器創(chuàng)建就能登錄進去。即分配一個偽終端。 --name :為創(chuàng)建的容器命名。 -v:表示目錄映射關(guān)系(前者是宿主機目錄,后者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然后共享到容器上。 -d:在run后面加上-d參數(shù),則會創(chuàng)建一個守護式容器在后臺運行(這樣創(chuàng)建容器后不會自動登錄容器,如果只加-i -t兩個參數(shù),創(chuàng)建后就會自動進去容器)。 -p:表示端口映射,前者是宿主機端口,后者是容器內(nèi)的映射端口。可以使用多個-p做多個端口映射 |
|---|
(1)交互式方式創(chuàng)建容器
以交互式方式創(chuàng)建并啟動容器,啟動完成后,直接進入當(dāng)前容器。使用exit命令退出容器。需要注意的是以此種方式啟動容器,如果退出容器,則容器會進入停止?fàn)顟B(tài)。可以理解成交互式容器 是前臺容器。
docker run -it --name=容器名稱 鏡像名稱:標(biāo)簽 /bin/bash
# 比如:docker run -it --name=mycentos centos:7 /bin/bash
# docker run:表示創(chuàng)建容器
# -it:表示運行容器并進入它的命令行
# --name=mycentos:給當(dāng)前的容器命名
# centos:7:使用該鏡像創(chuàng)建
# /bin/bash:放在鏡像名后的是命令,這里我們希望有個交互式 Shell,因此用的是 /bin/bash
創(chuàng)建好容器,并且已經(jīng)進入到容器內(nèi)部了,可以直接觀察前面中括號里面的內(nèi)容發(fā)現(xiàn),跟創(chuàng)建容器之前不一樣了,
并且 通過 dir 命令,會發(fā)現(xiàn),其實容器內(nèi)部也是一個 centos , 我們可以把每個容器都看成一個小電腦或者服務(wù)器

重新開一個新的會話,查看剛剛創(chuàng)建的容器是否已經(jīng)有了。

查看正在運行的容器:docker ps
退出當(dāng)前容器:exit
退出之后,容器也退出了,沒有刪除
(2) 創(chuàng)建后臺容器
docker run -id --name=mycentos2 centos:7
查看 docker 容器已經(jīng)運行
(3) 守護式方式創(chuàng)建容器:
創(chuàng)建一個守護式容器;如果對于一個需要長期運行的容器來說,我們可以創(chuàng)建一個守護式容器。
命令如下(容器名稱不能重復(fù)):守護容器可以理解成在后臺運行的容器
# 守護式容器和交互式容器的創(chuàng)建方式區(qū)別:
# ① -it 換成 -di
# ② 去掉后面的 /bin/bash
docker run -di --name=容器名稱 鏡像名稱:標(biāo)簽
# 比如:docker run -di --name=mycentos10 centos:7
通過 docker ps 查看容器已經(jīng)是運行狀態(tài)
進入守護式容器方式:
docker exec -it 容器名稱 (或者容器ID) /bin/bash
# 比如 docker exec -it mycentos10 /bin/bash
已經(jīng)進入到容器內(nèi)部了,如果現(xiàn)在退出exit,然后查看容器docker ps是否還在后臺運行(仍在運行)
3.2.3 停止與啟動容器
- 先通過 docker ps 查看正在運行的容器
- 停止容器:
| docker stop 容器名稱(或者容器ID) 例如: docker stop mycentos2 |
|---|
- 創(chuàng)建完容器之后,停止容器

- 查看容器是否已經(jīng)停止
- 啟動容器:
| docker start 容器名稱(或者容器ID) 例如: docker start mycentos2 (以交互式運行的容器,只是第一次exit退出的時候會關(guān)閉容器,當(dāng)用start啟動的時候,就相當(dāng)于后臺啟動了,exec進去之后再exit退出不會關(guān)閉容器) |
|---|
- 查看容器是否已經(jīng)啟動
3.2.4 文件拷貝
我們需要在容器內(nèi)安裝一個軟件,軟件首先需要有安裝包,我們就需要把安裝包拷貝到容器內(nèi)。我們通常的操作是先把文件上傳到宿主機,然后我們在將文件從宿主機拷貝到容器內(nèi)的某個目錄下面進行安裝。
將linux宿主機中的文件拷貝到容器內(nèi)可以使用命令:

如果我們需要將文件拷貝到容器內(nèi)可以使用cp命令
| docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄 例如: docker cp anaconda-ks.cfg mycentos2:/usr/local/ |
|---|
拷貝一個文件到 mycentos2 的 /urs/local/ 文件下面 ,拷貝完成之后,刪除文件,然后在mycentos2拷貝過來

登錄容器查看拷貝之后的結(jié)果
| docker exec -it mycentos2 /bin/bash docker exec:表示登陸正在運行的容器 -it:進入命令行 mycentos2:進入到該容器 |
|---|

也可以將文件從容器內(nèi)拷貝出來
| docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄 例如:docker cp mycentos2:/usr/local/anaconda-ks.cfg ./ |
|---|
我們先通過 exit 退出容器,然后在把文件從容器拷貝到當(dāng)前目錄

3.2.5 目錄掛載
我們可以在創(chuàng)建容器的時候,將宿主機的目錄與容器內(nèi)的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器。
創(chuàng)建容器 添加-v參數(shù) 后邊為 宿主機目錄:容器目錄,例如:
| # 創(chuàng)建并啟動容器mycentos3,并掛載linux中的/usr/local/myhtml目錄到容器的/usr/local/myhtml;也就是在linux中的/usr/local/myhtml中操作相當(dāng)于對容器相應(yīng)目錄操作 docker run -di --name=容器的名字 -v /usr/local/myhtml:/usr/local/myhtml centos:7 比如:docker run -di --name=mycentos3 -v /usr/local/myhtml:/usr/local/myhtml centos:7 |
|---|
通過 docker ps 查看正在運行的容器,在創(chuàng)建容器并且進行目錄掛載,然后在通過 docker ps 查看剛剛創(chuàng)建的容器是否已經(jīng)創(chuàng)建

進入到 myhtml 目錄 ,通過dir查看是否有文件,通過vi test2 ,創(chuàng)建一個文件,進入test2文件,隨便輸入一些數(shù)據(jù)

進入目錄隨便輸入一些東西 , 退出保存
登錄容器,查看剛剛輸入的內(nèi)容
| # 進入容器 docker exec -it mycentos11 /bin/bash # 進入容器中查看目錄 cd /usr/local/myhtml # 查看myhtml目錄中,是否有對應(yīng)文件test2.txt ls cat test2 # 退出容器 exit |
|---|

如果你共享的是多級的目錄,可能會出現(xiàn)權(quán)限不足的提示。
這是因為CentOS7中的安全模塊selinux把權(quán)限禁掉了,我們需要添加參數(shù)
--privileged=true 來解決掛載的目錄沒有權(quán)限的問題
docker run -id --privileged=true --name=mycentos5 -v /usr/local/myhtml:/usr/local/myhtml centos:7
3.2.6 查看容器IP地址
我們可以通過以下命令查看容器運行的各種數(shù)據(jù)
| docker inspect 容器名稱(容器ID) # 在linux宿主機下查看 mycentos3 的ip |
|---|

IP 地址

通過inspect 可以查看的信息太多,如果想單純有針對性的查看某個信息,也可以直接執(zhí)行下面的命令直接輸出IP地址
| docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID) # 例如:docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos11 |
|---|

3.2.7 刪除容器
- 刪除指定的容器:
| docker rm 容器名稱(容器ID) 例如:docker rm mycentos11 |
|---|
- 刪除容器的時候,如果容器在運行,會報錯,必須先停止容器
| # 查看正在運行的容器 docker ps # 刪除正在運行的容器 docker rm mycentos11 # 停止容器 docker stop mycentos11 |
|---|

| # 查看所有的容器,看看是否有mycentos11 docker ps -a # 刪除centos11容器 docker rm mycentos11 # 刪除完成之后,在查看mycentos11容器是否還存在 docker ps -a |
|---|

也可以使用-f參數(shù)進行強制刪除:docker rm -f 容器名稱或id
第四章 應(yīng)用部署
4.1 MySQL部署

(1)拉取mysql鏡像
| docker pull centos/mysql-57-centos7 |
|---|

(2)創(chuàng)建容器
| # 創(chuàng)建mysql5.7容器 # docker run -di --name=容器名字 -p 宿主機端口:容器端口 -e MYSQL_ROOT_PASSWORD=mysql密碼 容器名稱 docker run -di --name=mysql5.7 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7 |
|---|
-p 代表端口映射,格式為 宿主機映射端口:容器運行端口
-e 代表添加環(huán)境變量 MYSQL_ROOT_PASSWORD 是root用戶遠程登陸密碼
創(chuàng)建守護式容器 ,并且通過 docker ps 查看是否映射成功,

(3)遠程登錄mysql
連接宿主機的IP ,指定端口為33306
使用 windows上面的小海豚進行連接

navicat 測試連接

創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)庫里面的表
| CREATE DATABASE vue; USE vue; CREATE TABLE USER( id INT PRIMARY KEY AUTO_INCREMENT, age INT, username VARCHAR(20), password VARCHAR(50), email VARCHAR(50), sex VARCHAR(20) ) |
|---|

4.2 Tomcat部署
(1)拉取鏡像
| docker pull tomcat:7-jre7 |
|---|
(2)創(chuàng)建容器
創(chuàng)建容器 -p表示地址映射 -v 表示目錄掛載
| # 創(chuàng)建tomcat容器;并掛載了webapps目錄 docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7 |
|---|
創(chuàng)建完成容器之后,在通過 docker ps 查看容器是否正在運行

本地的war包 ,上傳到docker容器里面

ls 查看 dubbo的war 是否已經(jīng)上傳到docker容器,上傳成功之后,在通過mv 命令 把dubbo移動到 /usr/local/webapps 目錄下面,然后請求 http://192.168.211.144:9000/dubbo-admin-2.6.0/

請求地址:http://192.168.211.144:9000/dubbo-admin-2.6.0/ 說明咱的tomcat已經(jīng)部署成功

4.3 Nginx部署
(1)拉取鏡像
| docker pull nginx |
|---|
(2)創(chuàng)建Nginx容器
| docker run -di --name=mynginx -p 80:80 nginx |
|---|
安裝完成之后,請求nginx頁面

4.4 Redis部署
(1)拉取鏡像
| docker pull redis |
|---|
(2)創(chuàng)建容器
| docker run -di --name=myredis -p 6379:6379 redis |
|---|
創(chuàng)建 redis 容器

(3)通過客戶端工具連接測試。或者通過java代碼用Jedis客戶端進行測試。

第五章 遷移與備份

其中涉及到的命令有:
- docker commit 將容器保存為鏡像
- docker save 將鏡像備份為tar文件
- docker load 根據(jù)tar文件恢復(fù)為鏡像
5.1 容器保存為鏡像
我們可以通過以下命令將容器保存為鏡像
| # 保存nginx容器為鏡像 docker commit 容器名稱 鏡像名稱 例如:docker commit mynginx mynginx_i |
|---|
使用 docker ps -a 查看所有的容器

看到有一個mynginx 容器 , 將容器保存為一個鏡像:

查看鏡像是否保存成功

使用剛剛保存的鏡像 ,重新創(chuàng)建一個容器

創(chuàng)建完成之后 , 直接 通過 docker ps查看正在運行的容器,可以找到剛剛創(chuàng)建的容器mynginx2

5.2 鏡像備份
我們可以通過以下命令將鏡像保存為tar 文件
| # 命令形式:docker save –o tar文件名 鏡像名 # 保存鏡像為文件 -o:表示output 輸出的意思,后跟輸出路徑+輸出保存的文件名 docker save -o mynginx.tar mynginx_i |
|---|
通過 save 保存成文件之后,在通過 ls 命令進行查看當(dāng)前目錄是否有 tar文件

5.3 鏡像恢復(fù)與遷移
首先我們先刪除掉mynginx_img鏡像 然后執(zhí)行此命令進行恢復(fù)
| # 命令形式:docker load -i tar文件名 docker load -i mynginx.tar |
|---|
-i 表示input輸入的文件
執(zhí)行后再次查看鏡像,可以看到鏡像已經(jīng)恢復(fù)
我們需要直接恢復(fù)剛剛的 tar 文件 ,就需要先刪除 mynginx_i 鏡像,才能恢復(fù), 直接刪除 mynginx_i 鏡像 ,發(fā)現(xiàn)會報錯,因為當(dāng)前鏡像的容器正在運行,需要先停止容器,刪除容器 , 在刪除鏡像

刪除完成之后 , 在查看鏡像是否還存在 ,發(fā)現(xiàn)mynginx_i 鏡像已經(jīng)被刪除

恢復(fù)鏡像

第六章 Dockerfile
6.1 什么是Dockerfile
前面的課程中已經(jīng)知道了,要獲得鏡像,可以從Docker倉庫中進行下載。那如果我們想自己開發(fā)一個鏡像,那該如何做呢?答案是:Dockerfile
Dockerfile其實就是一個文本文件,由一系列命令和參數(shù)構(gòu)成,Docker可以讀取Dockerfile文件并根據(jù)Dockerfile文件的描述來構(gòu)建鏡像。
1、對于開發(fā)人員:可以為開發(fā)團隊提供一個完全一致的開發(fā)環(huán)境;
2、對于測試人員:可以直接拿開發(fā)時所構(gòu)建的鏡像或者通過Dockerfile文件構(gòu)建一個新的鏡像開始工作了;
3、對于運維人員:在部署時,可以實現(xiàn)應(yīng)用的無縫移植。
6.2 常用命令
| 命令 | 作用 |
|---|---|
| FROM image_name:tag | 定義了使用哪個基礎(chǔ)鏡像啟動構(gòu)建流程 |
| MAINTAINER user_name | 聲明鏡像的創(chuàng)建者 |
| ENV key value | 設(shè)置環(huán)境變量 (可以寫多條) |
| RUN command | 是Dockerfile的核心部分(可以寫多條) |
| ADD source_dir/file dest_dir/file | 將宿主機的文件復(fù)制到容器內(nèi),如果是一個壓縮文件,將會在復(fù)制后自動解壓 |
| COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有壓縮文件并不能解壓 |
| WORKDIR path_dir | 設(shè)置工作目錄(就是登錄容器后所在的目錄) |
6.3 使用腳本創(chuàng)建鏡像
步驟:
(1)創(chuàng)建目錄
| mkdir –p /usr/local/dockerjdk8 |
|---|
(2)下載jdk-8u144-linux-x64.tar.gz并上傳到服務(wù)器(虛擬機)中的/usr/local/dockerjdk8目錄
(3)移動目錄剛剛上傳的 jdk 到 /usr/local/dockerjdk8 目錄下面
| mv jdk-8u144-linux-x64.tar.gz /usr/local/dockerjdk8 |
|---|

(4)創(chuàng)建文件Dockerfile 并vi Dockerfile
| # Dockerfile 名字不要改 vi Dockerfile |
|---|

設(shè)置環(huán)境變量 ,設(shè)置完成之后 先按下esc , 然后在 :wq 保存退出
#依賴鏡像名稱和ID
FROM centos:7
#指定鏡像創(chuàng)建者信息
MAINTAINER zhangsan
#切換工作目錄
WORKDIR /usr
#RUN yum install -y glibc.i686 ,下邊的路徑是在centos容器里創(chuàng)建的路徑
RUN mkdir /usr/local/java
#ADD 是相對路徑j(luò)ar,把java添加到容器中
ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/
#配置java環(huán)境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
(5)執(zhí)行命令構(gòu)建鏡像
| docker build -t='jdk1.8' . |
|---|
注意后邊的空格和點,不要省略

(6)查看鏡像是否建立完成
| docker images |
|---|

(7)運行容器測試
報錯:

解決:缺少依賴插件,安裝即可。
yum install glibc.i686
第七章 Docker私有倉庫
Docker官方的Docker hub(https://hub.docker.com)是一個用于管理公共鏡像的倉庫,我們可以從上面拉取鏡像到本地,也可以把我們自己的鏡像推送上去。但是,有時候我們的服務(wù)器無法訪問互聯(lián)網(wǎng),或者你不希望將自己的鏡像放到公網(wǎng)當(dāng)中,那么我們就需要搭建自己的私有倉庫來存儲和管理自己的鏡像。
7.1 私有倉庫搭建與配置
(1)拉取私有倉庫鏡像(此步省略,私有倉庫也是一個容器,也需要鏡像)
| docker pull registry |
|---|
(2)啟動私有倉庫容器
| docker run -di --name=registry -p 5000:5000 registry |
|---|
創(chuàng)建私有倉庫容器
通過 docker ps 查看容器是否創(chuàng)建成功
(3)打開瀏覽器 輸入地址 http://192.168.211.144:5000/v2/_catalog 看到{"repositories":[]} 表示私有倉庫搭建成功并且內(nèi)容為空

(4)修改daemon.json
| vi /etc/docker/daemon.json |
|---|
添加以下內(nèi)容,保存退出。目的是讓容器信任下面的地址
| "insecure-registries":["192.168.211.144:5000"] |
|---|
此步用于讓 docker信任私有倉庫地址 ,然后退出保存

(5)重啟docker 服務(wù)
| systemctl restart docker |
|---|
7.2 鏡像上傳至私有倉庫
(1)標(biāo)記此鏡像為私有倉庫的鏡像
| # 標(biāo)記鏡像為私有倉庫的鏡像 # docker tag jdk1.8 宿主機IP:5000/jdk1.8 docker tag jdk1.8 192.168.184.141:5000/jdk1.8 |
|---|

(2)再次啟動私服容器
| # 再次啟動私有倉庫容器 docker start registry |
|---|
(3)上傳標(biāo)記的鏡像
| # 上傳標(biāo)記的鏡像 # docker push 宿主機IP:5000/jdk1.8 docker push 192.168.211.144:5000/jdk1.8 |
|---|
重新刷新,發(fā)現(xiàn)jdk 1.8 已經(jīng)上傳到私服

7.3 從私有倉庫拉取鏡像
| # 執(zhí)行拉取鏡像命令并查看 docker pull 192.168.211.144:5000/jdk1.8 docker images |
|---|

浙公網(wǎng)安備 33010602011771號