初識Docker
項目部署的問題
大型項目組件較多,運行環境也較為復雜,部署時會碰到一些問題
依賴關系復雜,容易出現兼容性問題
開發、測試、生產環境有差異
Docker如何解決依賴的兼容問題的?
將應用的Libs (函數庫)、Deps (依賴)配置與應用一起打包
將每個應用放到一個隔離容器去運行,避免互相干擾
內核與硬件交互,提供操作硬件的指令,系統應用封裝內核指令為函數,便于程序員調用用戶程序基于系統函數庫實現功能
Ubuntu和Centos都是基于Linux內核,只是系統應用不同,提供的函數庫有差異
Docker如何解決不同系統環境的問題?
Docker將用戶程序與所需要調用的系統(比如Ubuntu)函數庫一起打包
Docker運行到不同操作系統時,直接基于打包的庫函數,借助于操作系統的Linux內核來運行
Docker如何解決大型項目依賴關系復雜,不同組件依賴的兼容性問題?
Docker允許開發中將應用、依賴、函數庫、配置一起打包,形成可移植鏡像
Docker應用運行在容器中,使用沙箱機制,相互隔離
Docker如何解決開發、測試、生產環境有差異的問題?
Docker鏡像中包含完整運行環境,包括系統函數庫,僅依賴系統的Linux內
核,因此可以在任意Linux操作系統上運行
總結
Docker是一個快速交付應用、運行應用的技術:
1.可以將程序及其依賴、運行環境一起打包為一個鏡像可以遷移到任意Linux操作系統
2.運行時利用沙箱機制形成隔離容器,各個應用互不干擾
3.啟動、移除都可以通過一行命令完成,方便快捷
Docker與虛擬機
虛擬機(virtual machine)是在操作系統中模擬硬件設備,然后運行另一個操作系統,比如在 Windows 系統里面運行Ubuntu 系統,這樣就可以運行任意的Ubuntu應用了
Docker和虛擬機的差異:
docker是一個系統進程;虛擬機是在操作系統中的操作系統
docker體積小、啟動速度快、性能好;虛擬機體積大、啟動速度慢、性能一般
鏡像和容器
鏡像(lmage):Docker將應用程序及其所需的依賴、函數庫、環境、配置等文件打包在一起,稱為鏡像.
容器(Container):鏡像中的應用程序運行后形成的進程就是容器,只是Docker會給容器做隔離,對外不可見。
Docker和DockerHub
DockerHub: DockerHub是一個Docker鏡像的托管平臺。這樣的平臺稱為Docker Registry。國內也有類似于DockerHub 的公開服務,比如 網易云鏡像服務、阿里云鏡像庫等
docker架構
Docker是一個CS架構的程序,由兩部分組成:
服務端(server): Docker守護進程,負責處理Docker指令,管理鏡像、容器等
客戶端(client): 通過命令或RetAPI向Docker服務端發送指令。可以在本地或遠程向服務端發送指令
安裝Docker
企業部署一般都是采用Linux操作系統,而其中又數CentOs發行版占比最多,因此我們在entOS下安裝Docker。
Docker 分為 CE和EE 兩大版本。CE 即社區版(免費,支持周期7個月),EE 即企業版強調安全,付費使用,支持周期 24 個月。
Docker CE分為 stable test 和nightly 三個更新頻道
官方網站上有各種環境下的安裝指南,這里主要介紹 Docker CE在Centos上的安裝
Docker CE 支持64 位版本 Centos7,并且要求內核版本不低于 3.10,Centos 7 滿足最低內核的要求,所以我們在Centos 7安裝Docker。
如果之前安裝過舊版本的Docker,可以使用下面命令卸載:
首先需要大家虛擬機聯網,安裝yum工具
然后更新本地鏡像源
然后輸入命令
啟動docker
Docker應用需要用到各種端口,逐一去修改防火墻設置。非常麻煩,因此建議大家直接關閉防火墻!
啟動docker前,一定要關閉防火墻后!!
啟動docker前,一定要關閉防火墻后!!
啟動docker前,一定要關閉防火墻后!!
通過命令啟動docker
然后輸入命令,可以查看docker版本:
先敲入關閉防火墻的命令,再查看防火墻狀態,確認為dead,然后敲入啟動docker命令,啟動docker
啟動docker后,可敲入查看docker狀態指令查看其狀態是否為運行狀態
配置鏡像
docker官方鏡像倉庫網速較差,我們需要設置國內鏡像
配置鏡像加速器
針對Docker客戶端版本大于 1.10.0 的用戶
您可以通過修改daemon配置文件 /etc/docker/daemon.json 來使用加速器
使用Docker
鏡像相關命令
鏡像名稱一般分兩部分組成:[repository]:[tag]
在沒有指定tag時,默認是latest,代表最新版本的鏡像
鏡像操作命令
案例:從DockerHub中拉取一個nginx鏡像并查看
1.首先去鏡像倉庫搜索nginx鏡像,比如DackerHub:
2.根據查看到的鏡像名稱,拉取自己需要的鏡像
docker pull nginx命令,從DackerHub拉取nginx鏡像,并且默認tag版本為latest
3.通過命令: docker images 查看拉取到的鏡像
案例:利用docker save將nginx鏡像導出磁盤,然后再通過load加載回來
docker save --help 查看該命令的語法,然后將nginx鏡像保存為一個名為nginx.tar的壓縮包,ll命令可查看當前目錄的文件信息,發現nginx.tar已經被創建好。
先將docker中已經存在的nginx鏡像刪除,然后再查看docker中鏡像,發現目前已經沒有nginx鏡像了
將原本的nginx鏡像刪除后,再用docker load -i nginx.tar命令,把nginx.tar壓縮包加載為nginx鏡像,再docker images命令查看docker中的鏡像,發現nginx鏡像又被創建了出來。
容器相關命令
案例:創建運行一個Nginx容器
去docker hub查看Nginx的容器運行命令
docker run --name containerName -p 80:80 -d nginx 查找到該命令后,對該命令進行解讀
運行該命令創建nginx容器并命名為mn,docker ps 查看當前所有運行中的容器及其狀態
該mn容器在啟動中,我們訪問該宿主機ip以及對應的端口
nginx可以訪問到,說明容器成功運行
docker logs mn命令,我們可以查看mn容器的運行日志
docker logs -f mn,可持續的查看日志
案例:進入Nginx容器,修改HTML文件內容,添加“傳智教育歡迎您”
1.進入容器。進入我們剛剛創建的nginx容器的命令為
在DackerHub查到nginx鏡像中,html的位置
2.進入nginx的HTML所在目錄 /usr/share/nginx/html
3.修改indexhtml的內容
修改后,再次訪問宿主機ip以及對應端口,發現頁面已經更改
數據卷
容器與數據耦合的問題
數據卷(volume)是一個虛擬目錄,指向宿主機文件系統中的某個目錄。
數據卷操作的基本語法如下:
上一個案例,我們先docker volume create html命令在docker中創建一個html的數據卷,并docker volume ls命令查看是否創建好
docker volume inspect html命令可查看該數據卷綁定的具體位置
數據卷的作用:
將容器與數據分離,解耦合,方便操作容器內數據,保證數據安全
掛載數據卷
我們在創建容器時,可以通過-v參數來掛載一個數據卷到某個容器目錄
案例:創建一個nginx容器,修改容器內的html目錄內的index.html內容
需求說明:上個案例中,我們進入nginx容器內部,已經知道nginx的html目錄所在位置usr/share/nginx/html,我們需要把這個目錄掛載到html這個數據卷上,方便操作其中的內容
1.創建容器并掛載數據卷到容器內的HTML目錄
2.進入html數據卷所在位置,并修改HTML內容
查詢html數據卷的信息,查找到該數據卷實際的位置,在宿主機直接進入到該文件目錄,使用vscode等高級的編輯器直接打開要修改的頁面文件進行修改
修改保存后,再次訪問該宿主機ip以及該容器的端口,發現以及修改成功
案例:創建并運行一個MySOL容器,將宿主機目錄直接掛載到容器
將mysql.tar壓縮文件加載為鏡像
docker images 查看所有鏡像,發現mysql鏡像已經被創建
創建data和conf目錄,并將提前準備的hmy.cnf放到conf目錄下
在DackerHub上查看配置文件conf在mysql鏡像中的位置,方便我們一會將我們本地自己創建的那個conf目錄掛載到這個位置
將我們本地自己創建的data目錄掛載和自己創建的conf目錄下的hmy.cnf文件都掛載到mysql鏡像中對應的位置,執行下面的創建mysql容器命令
執行該命令創建mysql容器
docker ps命令查看當前所有啟動的容器,發現mysql容器已經被創建
此時,我們打開我們本地自己創建的data目錄,因為其已經掛載到了mysql容器中對應位置的data目錄,所以此時容器內的data目錄內容已經出現在了我們自己本地創建的data目錄中。對這些內容操作即是對容器的的目錄內容進行操作。
數據卷掛載的方式對比
掛載數據卷我們不知道具體的本地文件位置,但是不麻煩,掛載自己創建的文件目錄與文件雖然麻煩些,但是可以自定義具體的位置。數據卷掛載耦合度低,由docker來管理目錄,但是
目錄較深,不好找。目錄掛載耦合度高,需要我們自己管理目錄,不過目錄容易尋找查看。
自定義鏡像
鏡像結構
鏡像是分層結構,每一層稱為一個Layer
什么是Dockerfile
Dockerfile就是一個文本文件,其中包含一個個的指令(Instruction),用指令來說明要執行什么操作來構建鏡像。每一個指令都會形成一層Layer。
案例:基于Ubuntu鏡像構建一個新鏡像,運行一個java項目
Dockerfile文件內容
創間一個docker-demo文件夾并進入
將提前準備好的項目jar包和jdk.tar.gz以及Dockerfile三個文件放入這個目錄中
然后再這個目錄中執行docker build -t javaweb:1.0 . 命令,自定義創建一個鏡像名為javaweb:1.0
docker images命令查看鏡像是否被創建,然后執行docker run --name web -p 8090:8090 -d javaweb:1.0命令,將該鏡像啟動為一個名字為web的容器
訪問宿主機ip以及該容器對應的端口,發現可以訪問,容器啟動成功。
如果每創建一個鏡像,都需要執行這么多命令,是很復雜的,而且可以發現基礎鏡像ubuntu和jdk這些是每個鏡像都需要配的,我們可以把這個提取出成一個單獨的鏡像,讓命令更簡單化。
案例:基于java:8-alpine鏡像,將一個Java項目構建為鏡像
將上述Dockerfile文件簡化為如下所示。
總結
1.Dockerfile的本質是一個文件,通過指令描述鏡像的構建過程
2.Dockerfile的第一行必須是FROM,從一個基礎鏡像來構建
3.基礎鏡像可以是基本操作系統,如ubuntu。也可以是其他人制作好的鏡像,例如:java:8-alpine
什么是DockerCompose
Docker Compose可以基于Compose文件幫我們快速的部署分布式應用,而無需手動一個個創建和運行容器!Compose文件是一個文本文件,通過指令定義集群中的每個容器如何運行。
上述Compose文件內容等價于執行下面的這些指令
CentOS7安裝DockerCompose
如果下載速度較慢,或者下載失敗,可以使用課前資料提供的docker-compose文件
上傳到/usr/local/bin/目錄也可以。
修改文件權限:
將下載好的docker-compose放到/usr/local/bin/目錄,進入該目錄執行上述修改權限的命令
Base自動補全命令
DockerCompose有什么作用?
幫助我們快速部署分布式應用,無需一個個微服務去構建鏡像和部署。
案例:將之前學習的cloud-demo微服務集群利用DockerCompose部署
實現思路如下:
1.查看課前資料提供的cloud-demo文件夾,里面已經編寫好了docker-compose文件
每個目錄中都有已經編寫好的Dockerfile文件
內容都是為了構建該模塊為一個鏡像
docker-compose.yml文件內容大概如下,都是為了將各個鏡像啟動為容器
?2.修改自己的cloud-demo項月,將數據庫、nacos地址都命名為docker-compose中的服務名
user-service模塊中,nacos的地址修改
user-service模塊中,連接數據庫地址修改
order-service模塊中,連接數據庫地址修改
gateway模塊中,nacos的地址修改
3.使用maven打包工具,將項目中的每個微服務都打包為app.jar
每個模塊中的maven依賴配置下,打包為app.jar
打包
4.將打包好的app.jar拷貝到cloud-demo中的每一個對應的子目錄中
5.將cloud-demo上傳至虛擬機,利用 docker-compose up -d 來部署
如果啟動有些問題,可以用下面的命令重啟這幾個容器
訪問對應的ip地址用網關對外暴露的端口10010,發現可以執行,說明項目部署完成
Docker鏡像倉庫
常見鏡像倉庫服務
鏡像倉庫( Docker Registry ) 有公共的和私有的兩種形式:
公共倉庫:例如Docker官方的 Docker Hub,國內也有一些云服務商提供類似于 Docker Hub 的公開服務,比如網易云鏡像服務、DaoCloud 鏡像服務、阿里云鏡像服務等。
除了使用公開倉庫外,用戶還可以在本地搭建私有 Docker Registry。企業自己的鏡像最好是采用私有DockerRegistry來實現
簡化版鏡像倉庫
Docker官方的Docker Registry是一個基礎版本的Docker鏡像倉庫,具備倉庫管理的完整功能,但是沒有圖形化界面。
搭建方式比較簡單,命令如下:
帶有圖形化界面版本
使用DockerCompose部署帶有圖象界面的DockerRegistry,命令如下
配置Docker信任地址
我們的私服采用的是http協議,默認不被Docker信任,所以需要做一個配置
docker-compose.yml的內容為
執行
訪問對應地址,可以訪問