Docker鏡像與容器
理解虛擬化
在實際生產環境中,虛擬化技術主要解決的是高性能的物理硬件性能過生和低性能硬件產能過低的重組重用,達到最大化的利用物理硬件,充分發揮其最大的作用
虛擬化技術的種類有很多,比如軟件虛擬化,內存虛擬化,服務虛擬化,虛擬機等,比如VMware
理解Docker
Docker是實現輕量級的操作系統虛擬化解決方案,基於Linux容器
特別適用於微服務架構,我們也知道微服務架構是將一個應用拆成十幾個微服務項目,Docker的容器就特別迎合這種部署架構;
一台宿主機可以創建多個Docker容器,每個容器互不影響,相互隔離,分別部署微服務架構的多個應用,盡可能的利用系統資源
虛擬化與Docker容器的比較
Docker容器是在操作系統層面上實現虛擬化,復用本地主機的操作系統,相當於調用一個應用一樣,只要你有一個docker引擎,就能把本地操作系統復刻一個出來,當然系統還是只有一個系統
傳統的虛擬機則是在硬件層面實現,在物理機上虛擬一個其他的系統,占用很多的內存,比如安裝一個管理虛擬機的軟件VMware,在Windows上通過虛擬機搭建Linux或者其他的環境,搭建的環境和本地操作系統是沒有任何關系的
傳統的虛擬機的啟動和一個物理機的啟動速度一致,比較慢且占大量內存,Docker容器技術並不是構建一個新的操作系統,而是調用本地的操作系統,所以啟動速度比較快,且只占用小量的內存空間
Docker服務器與客戶端
Docker是一個C/S架構程序(客服端-服務器),Docker客戶端只需要向Docker服務器或守護線程發起請求,實現對Docker容器的管理,我們可以在一台機器上運行Docker的守護程序和客戶端,也可以本地客戶端連接遠程Docker守護線程,實現遠程管理
Docker鏡像與容器
-
鏡像
鏡像是構建Docker的基石,用戶基於鏡像來運行自己的容器,鏡像的體積很小,易於分享、儲存、更新,我們這樣理解或許會好很多,鏡像就是一個面向Docker引擎的只讀模版,包含了文件系統,比如我們在裝Windows系統時,通過鏡像來安裝的話,這個鏡像可以只是一個干凈的只有操作系統的鏡像,也可以是安裝了360全家桶等程序的不干凈鏡像,它將特定的一系列文件按照一定的格式制作成單一的文件,便於下載和使用
-
Docker容器
一個Docker容器簡單來說,包含三個東西:
一個鏡像
一些列標准操作
一個執行環境
通過這張圖,就能知曉容器的意義:
容器就像是一個輪船,上面裝載了很多的軟件,每一個軟件看成一個集裝箱,Docker使用Registry來保存用戶構建的鏡像,Registry分為公共和私有的兩種,Docker公司運營的是Docker Hub,就像github一樣的,我們可以在上面分享下載相關的鏡像(速度超級慢!),私有的Registry需要我們自己構建
Docker的安裝與啟動
安裝
-
環境CentOS7.X以上版本阿里雲站點下載: http://mirrors.aliyun.com/centos/
-
然后再給一個CentOS7.X以上版本的網絡環境配置指南:https://www.cnblogs.com/msi-chen/p/10922168.html
-
一般Docker都是掛載在CentOS7版本以上,6版本環境補全且很多補丁不支持更新
yum包更新到最新:sudo yum update
安裝需要的軟件包:sudo yum install -y yum-utils device-mapper-persistent-data lvm2
設置yum源:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看Docker版本: yum list docker-ce --showduplicates | sort -r
默認安裝最新免費版Docker: sudo yum install docker-ce
查看安裝的docker版本:docker -v
設置鏡像源
直接去國外獲取鏡像特別慢,我們需要設置國內的源,ustc是一個Linux鏡像服務提供者,是一個不需要注冊的公共服務
我這里出了一點小問題,沒有默認的docker和daemon.json配置文件,touch daemon.json創建之
全自動方式執行:curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
手動方式:在文件中配置如下數據: vi /etc/docker/daemon.json
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}
再給大家分享幾個鏡像源吧,有時候pull不下來,就換換試試
保存后重啟即可:systemctl restart docker
Docker的啟動相關命令
systemctl命令是系統服務管理指令
啟動docker:systemctl start docker
停止docker:sysemctl stop docker
docker狀態:systemctl status docker
重啟docker:systemctl restart docker
開啟啟動docker:systemctl enable docker
docker概要信息: docker info
docker幫助文檔:docker --help
如果運行報錯,無法解決可以才去重新安裝的方式:
查詢安裝過的包
yum list installed | grep docker
本機安裝過舊版本
docker.x86_64,docker-client.x86_64,docker-common.x86_64
刪除安裝的軟件包
yum -y remove docker.x86_64
yum -y remove docker-client.x86_64
yum -y remove docker-common.x86_64
Docker鏡像相關命令
查看宿主機本地鏡像:docker images
剛開始創建的Docker,本地是沒有任何鏡像的,所以下面沒有數據
搜索鏡像:docker search 鏡像名稱
拉取鏡像:docker pull 鏡像名稱
查看本地鏡像,就有tomcat的鏡像了
刪除鏡像:docker rmi 鏡像ID或者名稱
之前我們拉取一個Tomcat鏡像到本地,現在我們不想要它了,將其刪除即可
docker rmi 365b0a528e2e 或者 docker rmi tomcat
Docker容器相關命令
-
查看容器
查看當前正在運行的容器:docker ps
查看所有的容器:docker ps -a
查看停止的容器:docker ps -f status=exited
-
容器的創建與啟動
創建容器的常用參數說明:
創建容器的命令: docker create 或者docker run
-i:表示運行容器
-t:表示容器啟動后會登錄容器進去到其命令行,相當於一個偽終端
--name:為創建的容器命名
-v:表示目錄映射關系(前者是宿主機目錄,后者是映射到宿主機上的目錄)
可以使用多個-v做多個目錄或者文件映射,
注意:最好做目錄映射,在宿主機上做修改共享到容器中
-d:在run后跟-d,就會創建一個守護式容器在后台運行(這樣創建容器不會自動登錄容器)
-p:表示端口映射,前者是宿主機端口,后者是容器內的映射端口,可以使用多個-p做多個端口映射
-e:表示設置該容器的環境變量,可以設置初始密碼等
-
交互式方式 創建容器
創建:docker run -it --name=容器名稱 鏡像名稱:標簽 /bin/bash
如果鏡像的標簽是latest,可以不用標明,寫一個鏡像名稱即可
下面我們創建一個包含了centos鏡像的容器:
另開一個Linux連接終端,查看當前正在運行的容器:發現該容器
退出當前容器,容器也會關閉:exit
-
守護式方式創建容器
創建:docker run -di --name=容器名稱 鏡像名稱:標簽
登錄:docker exec -it 容器名稱(Name or ID) /bin/bash
退出還是:exit
只不過我們知識退出了那個偽終端,容器還是運行着的,效果自測
-
容器的啟動與停止
啟動: docker start 容器(Name or ID)
停止:docker stop 容器(Name or ID)
-
文件拷貝
有時候我們需要將文件拷貝到容器里去的需求,全程無需登錄容器
docker cp 目標文件或文件夾 容器名稱:容器目錄
當然也可以從容器內拷貝數據出來
docker cp 容器名稱:容器目錄 指定資源存放路徑
目錄掛載
我們在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就尅通過修改宿主機上某個目錄的文件從而實現對容器內想映射的文件的數據
創建容器時創建文件/文件夾映射:docker run -di --name=mycentos3 -v /usr/my.txt:/usr/my.txt centos
登錄容器觀察變化docker exec -it mydentos3 /bin/bash
我們在宿主機上修改my.txt,即可實現對容器內my.txt數據的修改
注意事項:如果掛載的是多級目錄,可能會有權限不足的警告
查看容器IP地址
我們可以通過下面的命令來查看容器運行的各種數據:docker inspect 容器(Name or ID)
當然上面的信息太多了,一般我們就提取一個ip最為常用:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos3
前面均為固定格式,最后指定那個容器即可
刪除容器
刪除容器:docker rm 容器(Name or ID)
刪除鏡像:docker rmi 鏡像(Name or ID)
這里說一下,當我們的鏡像正在被某個運行着的容器使用着的時候是不能刪除的,需要關閉相關的容器才能刪除該鏡像
常用軟件的部署
MySQL部署
拉取鏡像:docker pull centos/mysql-57-centos7
創建容器:docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
-p:端口映射,位於前面的是宿主機的端口,處於后面的是容器里的端口
-e:代表添加環境變量,設置Mysql的Root用戶的登陸密碼
進入到MySQL容器: docker exec -it mysql /bin/bash
登錄到MySQL
bash-4.2$ mysql -uroot -p Enter password: (不用鍵入密碼,回車即可)
SQLYog連接MySQL試試:
Tomcat部署
還是和上面一致,首先搜索Tomcat :docker search tomcat
拉取最上面的那個tomcat鏡像到本地:docker pull tomcat
創建容器:docker run -di --name=myTomcat -p 8080:8080 -v /usr/local/wabapps:/usr/local/tomcat/webapps tomcat
這里做一個說明 -v是文件掛載,我們只需要將war包丟在宿主機下的/usr/local/wabapps目錄即可對容器內的Tomcat起作用
/usr/local/tomcat/webapps:是Docker容器Tomcat的安裝目錄
為了方便測試,我們丟一個war包到宿主機的/usr/local/wabapps下
打開瀏覽器訪問即可:OK
Nginx部署
到這里我相信大家閉着眼都知道怎么操作了吧?
首先對我們安裝的環境進行搜索:docker search nginx
拉取鏡像到本地 :docker pull nginx
創建運行容器對外提供服務 :docker run -di --name=myNginx -p 80:80 nginx
當然到這里還沒完,不然我也不會寫出來了,Nginx還有一些需要特別注意的事項
現在環境倒是安裝好了,Ngin如何對我們的靜態資源進行代理?CP拷貝?Nginx配置文件不配?
首先我們進入到Nginx容器:
看一下這個配置文件呢?
先賦值一個副本出來,以防萬一。我們在副本中動手腳
到這里我們就可以動點腦殼了,如何才能對資源進行動態代理呢?將我們的資源拷貝到/usr/share/nginx/html/下?
我們通過cp拷貝一個index.頁面到 /usr/share/nginx/html/試試?
Redis部署
按部就班,天黑請閉眼
首先對我們安裝的環境進行搜索:docker search redis
拉取鏡像到本地 :docker pull redis
創建運行容器對外提供服務 :docker run -di --name=myRedis -p 6379:6379 redis
就不做過測試了,這個沒什么好說的,我們使用客戶端連接一下即可:
Docker遷移與備份
容器保存為鏡像
-
當我們將該容器保存為鏡像的時候,該容器的數據還是一五一十的全部存在的
docker commit 容器(Name or Id) 生成的鏡像Name
鏡像備份
docker save -o mynginx.tar mynginx_i
鏡像遷移與恢復
為了做測試,我們就想myNginx這個容器和與之相關的鏡像都刪掉,然后通過mynginx.tar 去創建新的鏡像和容器
再補上一步,刪除我們容器保存下來的鏡像:docker rmi mynginx_i
然后我們通過之前備份的鏡像文件 mynginx.tar試圖恢復:docker load -i mynginx.tar
鏡像已經恢復,我們創建容器用它創建容器,再次提供服務試試:
docker run -di --name=myNginx -p 888:80 mynginx_i
Dockerfile腳本
Dockerfile簡單介紹
Dockerfile就是一系列命令和參數構成的腳本,在基礎鏡像創建新鏡像的時候被運用,說起來可能有點抽象,下面我們演示一下,你就會尤其有深刻的印象
先把常用的命令記下來,后面在解釋:
| 命令 | 解釋 |
|---|---|
| FROM 鏡像:tag | 定義了使用那個基礎鏡像構建新的鏡像 |
| MAINTAINER user_name | 聲明鏡像的創建者 |
| ENV key value | 設置環境變量,可以寫多條 |
| RUN command | 是Dockerfile和核心部分,可以寫多條,在容器內會被執行 |
| ADD file file | 將宿主機上的文件復制到容器內,如果是壓縮文件,會自動解壓 |
| COPY file file | 和ADD相似,區別在於如果是壓縮文件,不會自動解壓 |
| WORKDIR pathDir | 設置工作目錄 |
| EXPOSE port1 port2 | 指定端口,使容器內的應用可以和外界進行交互 |
| CMD argument | 在構建容器時,會被docker run 后的argument覆蓋 |
| ENTRYPOINT argument | 和CMD相似,但不會被docker run后指定的參數覆蓋 |
| VOLUME | 將本地文件夾或者其他容器的文件掛在到容器中 |
使用腳本創建鏡像
首先我們上傳我們的jdk8到Linux上,我把它上傳到:/usr/local/jdk8/ 下
然后我們對其進行解壓,獲得它解壓后的名稱后即可刪掉解壓了得文件,留下壓縮包即可
創建一個固定文件名的Dockerfile文件,作為腳本文件,並鍵入數據:
保存退出,執行以下命令,通過這個腳本創建
新的鏡像: docker build -t='jdk1.8' .
docker build :構建命令
-t=' ' :給創建的新鏡像命名
. :指定Dockerfile的路徑, .表示在當前路徑下
然后就報錯了:沒有這個文件或者文件夾?然后我又試着修改了一下
再次構建試試:構建成功了一個基於Centos環境基礎的帶有jdk的鏡像
Docker私有倉庫
私有倉庫的搭建和配置
dockerhub用於托管一些共同的鏡像,就想github一樣,一般在企業中都是不會將代碼托管到開放到公共的平台上,這個時候,我們都會搭建一個私服,用於存放我們自己自定義的一些數據,一方面是為了安全,另一方面是想完成小范圍的共享;
在docker容器中運行原生的私有倉庫:
docker pull registry
運行倉庫:
docker run -di --name=regirstry -p 5000:5000 regirstry
私有倉庫就算是搭建完成了,我們可以啟動瀏覽器測試一番:看到這里私有倉庫就算搭建完成了
修改daemon.json。讓docker信任私有倉庫地址
vi /etc/docker/daemon.json,上一條數據是我們的的鏡像源地址
重啟Docker服務即可完成
私庫鏡像的上傳與下載
在本地鏡像的上傳之前,我們需要將registry服務開起來:
docker start registry
上傳第一步:打標簽,標記此鏡像為私有倉庫的鏡像
docker tag jdk1.8 192.168.159.189:5000/jdk1.8
上傳第二部:推送到私服
docker push 192.168.159.189:5000/jdk1.8
通過瀏覽器,查看:鏡像推送成功
當我們想要下載該鏡像的時候,記得修改daemon.json對該私服的信任,重啟docker
docker pull 192.168.159.189:5000/jdk1.8即可完成下載



















































