一. docker介紹:html
是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的Linux機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。nginx
1.一個完整的docker組成部分:1.dockerClient客戶端,2.docker Daemon守護進程,3.docker Image鏡像,4.dockerContainer容器web
2.Docker和KVM的對比redis
kvm: 1.虛擬機;2.使用複雜;3.啓動過程慢(分鐘);4.模板文件大;5.和物理機徹底隔離;6.模擬的是一個完成系統,能夠登入並實現管理。docker
docker:1.直接虛擬出一個用戶空間;2.使用簡單;3.啓動很是快(秒級);4.模板文件小;5.在必定程度上和物理機隔離;6.僅僅是模擬一部分用戶空間,不方便管理。json
3.docker使用理由vim
1.快速部署服務;2.實現隔離;3.讓一個主機運行多個容器;4.提升開發效率;5.實現軟件的跨平臺。centos
二.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容器的操做命令bash
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.將日誌發送到哪?