html
在實際生產環境中,虛擬化技術主要解決的是高性能的物理硬件性能過生和低性能硬件產能太低的重組重用,達到最大化的利用物理硬件,充分發揮其最大的做用mysql
虛擬化技術的種類有不少,好比軟件虛擬化,內存虛擬化,服務虛擬化,虛擬機等,好比VMwarelinux
Docker是實現輕量級的操做系統虛擬化解決方案,基於Linux容器nginx
特別適用於微服務架構,咱們也知道微服務架構是將一個應用拆成十幾個微服務項目,Docker的容器就特別迎合這種部署架構; git
一臺宿主機能夠建立多個Docker容器,每一個容器互不影響,相互隔離,分別部署微服務架構的多個應用,儘量的利用系統資源github
Docker容器是在操做系統層面上實現虛擬化,複用本地主機的操做系統,至關於調用一個應用同樣,只要你有一個docker引擎,就能把本地操做系統復刻一個出來,固然系統仍是隻有一個系統web
傳統的虛擬機則是在硬件層面實現,在物理機上虛擬一個其餘的系統,佔用不少的內存,好比安裝一個管理虛擬機的軟件VMware,在Windows上經過虛擬機搭建Linux或者其餘的環境,搭建的環境和本地操做系統是沒有任何關係的redis
傳統的虛擬機的啓動和一個物理機的啓動速度一致,比較慢且佔大量內存,Docker容器技術並非構建一個新的操做系統,而是調用本地的操做系統,因此啓動速度比較快,且只佔用小量的內存空間sql
Docker是一個C/S架構程序(客服端-服務器),Docker客戶端只須要向Docker服務器或守護線程發起請求,實現對Docker容器的管理,咱們能夠在一臺機器上運行Docker的守護程序和客戶端,也能夠本地客戶端鏈接遠程Docker守護線程,實現遠程管理docker
鏡像
鏡像是構建Docker的基石,用戶基於鏡像來運行本身的容器,鏡像的體積很小,易於分享、儲存、更新,咱們這樣理解或許會好不少,鏡像就是一個面向Docker引擎的只讀模版,包含了文件系統,好比咱們在裝Windows系統時,經過鏡像來安裝的話,這個鏡像能夠只是一個乾淨的只有操做系統的鏡像,也能夠是安裝了360全家桶等程序的不乾淨鏡像,它將特定的一系列文件按照必定的格式製做成單一的文件,便於下載和使用
Docker容器
一個Docker容器簡單來講,包含三個東西:
一個鏡像
一些列標準操做
一個執行環境
經過這張圖,就能知曉容器的意義:
容器就像是一個輪船,上面裝載了不少的軟件,每個軟件當作一個集裝箱,Docker使用Registry來保存用戶構建的鏡像,Registry分爲公共和私有的兩種,Docker公司運營的是Docker Hub,就像github同樣的,咱們能夠在上面分享下載相關的鏡像(速度超級慢!),私有的Registry須要咱們本身構建
環境CentOS7.X以上版本阿里雲站點下載: http://mirrors.aliyun.com/centos/
而後再給一個CentOS7.X以上版本的網絡環境配置指南:http://www.javashuo.com/article/p-rulcduay-hw.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建立之
而後在文件中配置以下數據: vi /etc/docker/daemon.json
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}
保存後重啓便可:systemctl restart 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
剛開始建立的Docker,本地是沒有任何鏡像的,因此下面沒有數據
查看本地鏡像,就有tomcat的鏡像了
以前咱們拉取一個Tomcat鏡像到本地,如今咱們不想要它了,將其刪除便可
docker rmi 365b0a528e2e 或者 docker rmi tomcat
查看當前正在運行的容器:docker ps
查看全部的容器:docker ps -a
查看中止的容器:docker ps -f status=exited
建立容器的經常使用參數說明:
建立容器的命令: docler run
-i:表示運行容器
-t:表示容器啓動後會登陸容器進去到其命令行,至關於一個僞終端
--name:爲建立的容器命名
-v:表示目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄)
可使用多個-v作多個目錄或者文件映射,
注意:最好作目錄映射,在宿主機上作修改共享到容器中
-d:在run後跟-d,就會建立一個守護式容器在後臺運行(這樣建立容器不會自動登陸容器)
-p:表示端口映射,前者是宿主機端口,後者是容器內的映射端口,可使用多個-p作多個端口映射
建立: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數據的修改
注意事項:若是掛載的是多級目錄,可能會有權限不足的警告
咱們能夠經過下面的命令來查看容器運行的各類數據:docker inspect 容器(Name or ID)
固然上面的信息太多了,通常咱們就提取一個ip最爲經常使用:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos3
前面均爲固定格式,最後指定那個容器便可
刪除容器:docker rm 容器(Name or ID)
刪除鏡像:docker rmi 鏡像(Name or ID)
這裏說一下,當咱們的鏡像正在被某個運行着的容器使用着的時候是不能刪除的,須要關閉相關的容器才能刪除該鏡像
拉取鏡像: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 :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
到這裏我相信你們閉着眼都知道怎麼操做了吧?
首先對咱們安裝的環境進行搜索: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/試試?
循序漸進,天黑請閉眼
首先對咱們安裝的環境進行搜索:docker search redis
拉取鏡像到本地 :docker pull redis
建立運行容器對外提供服務 :docker run -di --name=myRedis -p 6379:6379 redis
就不作過測試了,這個沒什麼好說的,咱們使用客戶端鏈接一下便可:
當咱們將該容器保存爲鏡像的時候,該容器的數據仍是一五一十的所有存在的
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就是一系列命令和參數構成的腳本,在基礎鏡像建立新鏡像的時候被運用,提及來可能有點抽象,下面咱們演示一下,你就會尤爲有深入的印象
先把經常使用的命令記下來,後面在解釋:
命令 | 解釋 |
---|---|
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的鏡像
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便可完成下載