一. docker介紹:
是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
1.一個完整的docker組成部分:1.dockerClient客戶端,2.docker Daemon守護進程,3.docker Image鏡像,4.dockerContainer容器
2.Docker和KVM的對比
kvm: 1.虛擬機;2.使用復雜;3.啟動過程慢(分鍾);4.模板文件大;5.和物理機完全隔離;6.模擬的是一個完成系統,可以登入並實現管理。
docker:1.直接虛擬出一個用戶空間;2.使用簡單;3.啟動非常快(秒級);4.模板文件小;5.在一定程度上和物理機隔離;6.僅僅是模擬一部分用戶空間,不方便管理。
3.docker使用理由
1.快速部署服務;2.實現隔離;3.讓一個主機運行多個容器;4.提高開發效率;5.實現軟件的跨平台。
二.docker鏡像的操作命令
1.docker search nginx 查看注冊表中是否有nginx鏡像 2.docker image pull nginx 下載nginx鏡像 3.docker image ls 查看本地鏡像 4.docker image load < redis-img.tar.gz 導入redis鏡像 5.docker image save nginx > nginx.tar.gz 導出nginx鏡像 6.dcker inspect nginx 顯示nginx鏡像的詳細信息 7.docker image rm nginx 刪除鏡像 8.docker push ip/nginx:v1 推送鏡像nginx到本地倉庫 9.docker tag nginx nginx:v1 給鏡像nginx標記標簽v1 10.docker history nginx 查看鏡像nginx的歷史構建信息
三.docker容器的操作命令
1.docker run -d redis 后台啟動容器 2.docker ps 查看啟動的容器 3.docker stop/start redis 停止/啟動容器 4.docker exec -it redis bash 登入容器(常用用法) 5.docker rm -f redis 刪除容器 6.docker rm $(docker ps -aq) 刪除全部已退出的容器
四.docker端口映射的四種方法(外網訪問容器服務)
1.將容器中的一個端口映射成宿主機中的一個隨機端口
命令:docker run -d -P httpd (P大寫)
2. 將容器中的一個端口映射成宿主機中的一個端口
命令:docker run -d -p 1234:80 httpd
3. 將容器中的一個端口映射成宿主機中的一個特定網卡上的隨機端口
命令:docker run -d -p 10.220.5.13: :80 httpd
4. 將容器中的一個端口映射成宿主機中的一個特定網卡上的一個端口
命令:docker run -d -p 10.220.5.13:80:80 httpd
五.數據卷Volume
1.功能和特性:
容器中數據的持久存儲;容器間資源共享;容器的遷移;
對數據卷的修改會立馬生效;對數據卷的更新,不會影響鏡像;
2.數據卷Volume共享方式(3種)
(1).Bind mount volume:用戶需要明確指定容器中的目錄和宿主機中的哪個目錄進行綁定
主要實現命令:docker run -it -v /ken:/data/ busybox
(2).Docker Management Volume:docker daemon自行管理將容器中的目錄和宿主機中的哪個目錄進行綁定
主要實現命令:docker run -it -v /data/ busybox
(3).基於一個現有容器實現多個容器之間文件共享
主要實現命令:docker run -it --volume-from ken1(啟動的容器) busybox [提前啟動一個容器]
3.volume生命周期管理
(1).備份
因為volume 實際上是 host 文件系統中的目錄和文件,所以 volume 的備份實際上是對文件系統的備份
(2).恢復
volume 的恢復也很簡單,如果數據損壞了,直接用之前備份的數據拷貝到 /ken 就可以了。
(3).遷移
如果我們想使用httpd,那就涉及到數據遷移,方法是:
1.docker stop 當前容器;
2.啟動新版本容器並mount原有volume(docker run -d -v /ken:/var/www/html httpd) 這里要確認新版本的默認數據路徑是否發生改變
(4).銷毀
對於 docker managed volume,在執行 docker rm 刪除容器時可以帶上 -v 參數,docker 會將容器使用到的 volume 一並刪除,但前提是沒有其他容器 mount 該 volume,目的是保護數據,非常合理。
如果刪除容器時沒有帶 -v 呢?這樣就會產生孤兒 volume。可用docker volume ls 查看。如果想批量刪除孤兒 volume,可以執行:docker volume rm $(docker volume ls -q)
六.實現容器的底層技術
cgroup:實現資源限額;namespace實現資源隔
1.對內存限制:docker run -it -m 512 busybox
2.對cpu限制:docker run -c 1024 httpd
Namespace:主要有六種資源:Mount,UTS,IPC,PID,Network和User
Mount namespace:讓容器看上去擁有整個文件系統;
UST namespace:讓容器有自己的hostname
IPC namespace:讓容器擁有自己的共享內存和信號量來實現進程間通信,而不會與host和其他容器的IPC混在一起
PID namespace:容器在host中以進程形式運行。容器擁有自己獨立的一套PID。
Network namespace:讓容器擁有自己獨立的網卡,IP,路由等資源。
User namespace:讓容器能夠管理自己的用戶,host不能看到容器創建的用戶。
七.docker鏡像構建的兩種方式:
1.docker commit構建鏡像
三步:運行容器,修改容器,將容器保存為新的容器
如:docker run -it centos(進入容器)>yum install vim -y(容器里下載)>docker commit container id centos-vim(推出容器運行,使用commit存為新的鏡像)
注意:但是docker不建議使用這種方式創建鏡像,原因如下:
這是一種手工創建鏡像的方式,容器出錯,而且效率低且可重復性弱
更重要的是。使用者並不知道鏡像是如何創建出來的。里面是否有惡意程序
2.Dockerfile構建鏡像
(1).Dockerfile常用命令:
FROM:指定base鏡像
COPY:將文件從build context復制到鏡像
ADD:與copy類似,不同的是,如果復制的是歸檔文件(tar,zip,tgz,xz),文件會被自動解壓到dest.
ENV:設置環境變量,環境變量可被后面的指令使用
EXPOSE:指定容器中的進程監聽某個端口,docker可以將該端口暴露出來
VOLUME:將文件或目錄聲明為volume
WORKDIR:為后面的run,entpypint,add,copy指令設置鏡像中的當前工作目錄(容器目錄)
RUN:在容器中運行指定的命令
CMD:容器啟動時運行指定的命令。Dockerfile中可以有多個CMD指令,但只有最后一個生效。CMD可以被docker run 之后的參數替換。
ENTRYPOINT:設置容器啟動時的命令。Dockerfile中可以有多個ENTRYPOINT,但只有最后一個生效,CMD或者docker run之后的參數會被當作參數傳遞給ENTRYPOINT.
(2)Dockerfile演示
3.RUN,CMD,ENTRYPOINT區別
RUN:執行命令創建新的鏡像層,RUN經常用於安裝軟件包
CMD:設置容器啟動后默認執行的命令及參數,但CMD能夠被docker run后面跟的命令行參數替換
ENTRYPOINT:配置容器啟動時運行的命令
(1).使用 RUN 指令安裝應用和軟件包,構建鏡像。
(2).如果 Docker 鏡像的用途是運行應用程序或服務,比如運行一個 MySQL,應該優先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可為 ENTRYPOINT 提供額外的默認參數,同時可利用 docker run 命令行替換默認參數。
(3).如果想為容器設置默認的啟動命令,可使用 CMD 指令。用戶可在 docker run 命令行中替換此默認命令。
八.Docker網絡
1.docker的四種網絡模式
(1).bridge模式:docker網絡隔離基於網絡命名空間,在物理機上創建docker容器時會為每一個docker容器分配網絡命名空間,並且把容器IP橋接到物理機的虛擬網橋上。
(2).none模式:此模式下創建容器是不會為容器配置任何網絡參數的,如:容器網卡、IP、通信路由等,全部需要自己去配置。
(3).host模式:此模式創建的容器沒有自己獨立的網絡命名空間,是和物理機共享一個Network Namespace,並且共享物理機的所有端口與IP,並且這個模式認為是不安全的。
(4).container模式:此模式和host模式很類似,只是此模式創建容器共享的是其他容器的IP和端口而不是物理機,此模式容器自身是不會配置網絡和端口,創建此模式容器進去后,你會發現里邊的IP是你所指定的那個容器IP並且端口也是共享的,而且其它還是互相隔離的,如進程等。
2.自定義網絡
除了none,host,bridge這三個自動創建的網絡,用戶也可以根據業務需要創建user-defined 網絡。
創建命令:docker network create --driver bridge ken
創建網段時指定—subset和—gateway參數:docker network create –driver bridge –subnet 172.21.0.0/16 --gateway 172.21.0.1 ken1
容器使用新定義的網絡:docker run –it –network=ken1 busybox
指定分配IP: docker run -it –network=ken1 –ip=172.121.0.7 busybox
3.容器間通信
容器之間可通過 IP,Docker DNS Server 或 joined 容器三種方式通信。
(1)通過IP通信:處於同一網段的容器間可以通信;如果兩個容器處於不同網段,可以通過給一個容器添加另一個容器所處網段的網卡,命令為:docker network connect ken1 container1(現有容器)
(2)Docker DNS server通信:通過 IP 訪問容器雖然滿足了通信的需求,但還是不夠靈活。因為我們在部署應用之前可能無法確定 IP,部署之后再指定要訪問的 IP 會比較麻煩。對於這個問題,可以通過 docker 自帶的 DNS 服務解決。方法很很簡單,在啟動容器時給容器命名就可以,訪問直接ping
容器名即可。但要注意:使用 docker DNS 有個限制:只能在 user-defined 網絡中使用
(3)joined容器:joined 容器非常特別,它可以使兩個或多個容器共享一個網絡棧,共享網卡和配置信息。實現如下:先啟動一個名為web1的容器,然后再創建busybox容器並通過—network=container:web1 指定jointed容器為web1。這時busybox和web1的網卡mac地址與IP完全一樣。
joined 容器非常適合以下場景:
1.不同容器中的程序希望通過 loopback 高效快速地通信,比如 web server 與 app server。
2.希望監控其他容器的網絡流量,比如運行在獨立容器中的網絡監控程序。
4.容器與外界交互
(1).容器訪問外部世界:只要宿主機可以訪問外網,默認容器時可以訪問外網的;
(2).外部世界訪問容器:通過端口映射來。
九.docker公共&本地鏡像倉庫
1.公共鏡像倉庫—Docker Hub
2.搭建本地的registry
(1) 運行registry容器 docker run -d -p 5000:5000 -v /test:/var/lib/registry registry:2
(2) 通過docker tag重命名鏡像,使之與registry匹配
Docker tag httpd 172.20.10.2:5000/httpd:v1
(3) 修改damon.json文件
在文件中添加:”insecure-registries”:[“172.20.10.2:5000”]
(4) 重啟docker和容器
(5) 上傳鏡像
Docker push 172.20.10.2:5000/httpd:v1
(6) 從其他主機進行下載鏡像
Docker pull 172.20.10.2:5000/httpd:v1
十.docker容器監控
1.自帶的監控命令:ps,top,stats
2.weave scope監控:Weave Scope 的最大特點是會自動生成一張 Docker 容器地圖,讓我們能夠直觀地理解、監控和控制容器。還可以監控多主機,只需在主機上安裝weave scope。
十一.docker日志管理
1.docker logs
2.ELK:開源的日志管理方案。
Elasticsearch:一個近乎實時查詢的全文搜索引擎。Elasticsearch 的設計目標就是要能夠處理和搜索巨量的日志數據。
Logstash:讀取原始日志,並對其進行分析和過濾,然后將其轉發給其他組件(比如 Elasticsearch)進行索引或存儲。Logstash 支持豐富的 Input和Output 類型,能夠處理各種應用的日志。Kibana:一個基於 JavaScript 的 Web 圖形界面程序,專門用於可視化 Elasticsearch 的數據。Kibana 能夠查詢 Elasticsearch 並通過豐富的圖表展示結果。用戶可以創建 Dashboard 來監控系統的日志
3.ELK日志處理流程:
Logstash 負責從各個 Docker 容器中提取日志,Logstash將日志轉發到Elasticsearch 進行索引和保存,Kibana 分析和可視化數據。
4.Filebeat
ELK 提供了一個配套小工具 Filebeat,它能將指定路徑下的日志文件轉發給 ELK。同時 Filebeat 很聰明,它會監控日志文件,當日志更新時,Filebeat 會將新的內容發送給 ELK。
在配置filebeat時,配置文件/etc/filebeat/filebeat.yml中需告訴filebeat兩件事:1.監控哪些日志?2.將日志發送到哪?