容器:容器技術是一種虛擬化的方案 容器:docker , k8s docker:docker是能將開發的應用程序自動部署到容器的開源引擎。 Github地址:https://github.com/docker/docker docker官網:www.docker.com hub.docker.com 上傳下載docker鏡像的網站
docker的特別之處: docker在虛擬化的容器執行環境中,增長了一個應用程序部署引擎。 該引擎的目標: 提供一個輕量快速的環境,可以運行開發者的程序,便於方便高效的從開發者環境部署到測試環境,而後再部署到生產環境。
docker的優勢: 一、提供簡單輕量的建模方式,運行秒級 二、職責的邏輯分離。開發人員只須要關係容器中運行的程序,而運維人員只須要關心如何管理程序。docker設計的目的性就是增強開發人員寫代碼的開發環境與應用環境要部署的生產環境的一致性。 三、快速高效的開發生命週期。縮短代碼從開發到測試,再到上線運行的生命週期。讓應用和程序具有可移植性。在容器中開發,以容器的形式去交付。 四、鼓勵使用面向服務的架構。docker推薦單個容器只運行一個程序或者一個進程。這樣就造成了一個分佈式的應用程序模型。 在這種模型下,應用程序或服務均可以表示爲一系列內部互聯的容器,從而使分佈式互聯的程序擴展或調試應用程序都變得很是簡單。 這就是在開發中經常使用的思想:高內聚低耦合
docker的使用場景: 一、使用docker容器開發、測試、部署服務; 二、建立隔離的運行環境 三、搭建測試環境 四、構建多用戶的平臺即服務(PaaS)基礎設施 五、提供軟件即服務(SaaS)應用程序 六、高性能、超大規模的宿主機部署
三大核心理念: 構建 基於鏡像構建容器 運輸 傳輸到系統中 運行 運行於容器
安裝docker容器: 注:centos虛擬機必需要聯網,否則沒法安裝。 1.配置repo倉庫 cd /etc/yum.repos.d/ vi docker.repo [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg yum clean all yum makecache 2.安裝docker yum -y install docker cd 檢查有木有安裝方法: docker version 3.啓動並設置開啓自啓動 systemctl start docker systemctl enable docker docker version 到此,docker容器安裝完成,而且啓動成功。
獲取鏡像的三種方式: 1)下載鏡像(默認從Docker Hub下載) 2)把容器轉換爲鏡像 3)製做鏡像(經過dockerfile生成鏡像) 查找鏡像(默認從Docker Hub查詢) docker search httpd //查找全部httpd相關的鏡像 下載鏡像(默認從Docker Hub查詢) docker pull docker.io/httpd 查看本機鏡像列表 docker images //查看全部鏡像 (也能夠單獨查詢 後面跟倉庫名稱和標籤) docker inspect 2211e1f06c4e或docker.io/httpd //指定ID號查看 詳細信息 REPOSITORY:表示鏡像的倉庫源docker.io TAG:表示鏡像的標籤 IMAGE ID:表示鏡像的ID CREATED:表示鏡像建立時間 SIZE:表示鏡像大小 添加新名稱 新標籤 ,用於更名稱 docker tag httpd httpd:centos 刪除鏡像 刪除以前確保沒有被容器使用,如有容器使用須要先刪除容器。 docker rmi 鏡像名稱 或者鏡像id 鏡像沒有使用才能刪除成功,且只是刪除名稱 docker rmi -f 鏡像ID //永久刪除 docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}") 刪除全部沒有使用的鏡像 存出鏡像和載入鏡像 docker save -o httpd httpd //將本地鏡像存爲文件httpd,保存在當前所在的目錄中 docker save -o 文件名 鏡像名稱 docker load < cobbler //將鏡像文件導入到docker鏡像中
鏡像操做:
搜索 : docker search 關鍵字
下載 : docker pull 關鍵字
查看:docker images
查看鏡像內容信息:docker inspect 鏡像名(ID)
刪除:docker rmi 鏡像名(ID)
導出鏡像:docker sava -o 保存的文件名 鏡像名(ID)
導入鏡像:docker load < 保存的文件
更改鏡像名稱及標籤docker tag 鏡像id 新的鏡像名: 標籤linux
docker容器操做 容器是鏡像的一個運行實例。所不一樣的是,鏡像是靜態的只讀文件,而容器帶有運行時須要的可寫文件層。若是認爲虛擬機是模擬運行的一整套操做系統(包括內核、應用運行態環境和其餘系統環境)和跑在上面的應用,那麼Docker容器就是獨立運行的一個(或一組)應用,以及它們必需的運行環境。 建立容器 對容器進行操做就跟直接操做應用同樣簡單、快速。Docker容器實在過輕量級了,用戶能夠隨時建立或刪除容器。 1.新建容器 可使用docker create命令新建一個容器,例如: docker create -it ubuntu:latest //基於鏡像建立容器,默認是沒有運行的 docker ps -a //查看全部容器 使用docker create命令新建的容器處於中止狀態,可使用docker start命令來啓動它。
create命令和後續的run命令支持的選項都十分複雜,主要包括以下幾大類:與容器運行模式相關、與容器和環境配置相關、與容器資源限制和安全保護相關。 create命令與容器運行模式相關的選項: 選項 說明 -a,--attach=[] 是否綁定到標準輸入、輸出和錯誤 -d,--detach=true|false 是否在後臺運行容器,默認爲否 --detach-keys="" 從attach模式退出的快捷鍵 --expose=[] 指定容器會暴露出來的端口或端口範圍 --group-add=[] 運行容器的用戶組 -i,--interactive=true|false 保持標準輸入打開,默認爲false --ipc="" 容器IPC命名空間,能夠爲其它容器或主機 --isolation="default" 容器使用的隔離機制 --log-driver="json-file" 指定容器的日誌驅動類型,能夠爲json-file,syslog,journald,gelf,fluentd,awslogs,splunk,etwlogs,gcplogs或none --log-opt=[] 傳遞給日誌驅動的選項 --net="bridge" 指定容器網絡模式,包括bridge,none,其它容器網絡,host的網絡或者某個現有網絡 --net-alias=[] 容器在網絡中的別名 -P,--publish-all=true|false 經過NAT機制將容器標記暴露的端口自動映射到本地主機的臨時端口 -p,--publish=[] 指定如何映射到本地主機端口,例如-p 11234-12234:1234-2234 --pid=host 容器的PID命名空間 --userns="" 啓用userns-remap時配置用戶命名空間的模式 --uts=host 容器的PID命名空間 --restart="no" 容器的重啓策略,包括no、on-failure[:max-retry]、always、unless-stopped等 --rm=true|false 容器退出後是否自動刪除,不能跟-d同時使用 -t,--tty=true|false 容器運行時指定僞終端 --tmpfs=[] 掛載臨時文件系統到容器 -v|--volume host-dir:container-dir 掛載主機上的文件捲到容器內 --volume-driver="" 掛載文件卷的驅動類型 --volumes-from=[] 從其餘容器掛載卷 -w,--workdir="" 容器內的默認工做目錄
create命令與容器環境和配置相關的選項:
選項 說明
--add-host=[ ] 在容器內添加一個主機名到IP地址的映射關係(經過/etc/hosts文件)
--device=[ ] 映射物理機上的設備到容器內
--dns-search=[ ] DNS搜索域
--dns-opt=[ ] 自定義的DNS選項
--dns=[ ] 自定義的DNS服務器
-e,--env=[ ] 指定容器內環境變量
--env-file=[ ] 從文件中讀取環境變量到容器內
-h,--hostname="" 指定容器內的主機名
--ip=「」 指定容器的IPv4地址
--ip6="" 指定容器的IPv6地址
--link=[ <name or id>:alias] 鏈接到其它容器
--mac-address="" 指定容器的Mac地址
--name="" 指定容器的別名git
create命令與容器資源限制和安全保護相關的選項: 選項 說明 --blkio-weight=10~1000 容器讀寫塊設備的I/O性能權重,默認爲0 --blkio-weight-device=[device_name:weight] 指定各個塊設備的I/O性能權重 --cpu-shares=0 容許容器使用CPU資源的相對權重,默認一個容器能用滿一個核的CPU --cap-add=[ ] 增長容器的linux指定安全能力 --cap-drop=[ ] 移除容器的linux指定安全能力 --cgroup-parent="" 容器cgroups限制的建立路徑 --cidfile="" 指定容器的進程ID號寫到文件 --cpu-period=0 限制容器在CFS調度器下的CPU佔用時間片 --cpuset-cpus="" 限制容器能使用哪些CPU核心 --cpuset-mems="" NUMA架構下使用哪些核心的內存 --device-read-bps=[ ] 掛載設備的讀吞吐率(以bps爲單位)限制 --device-write-bps=[ ] 掛載設備的寫吞吐率(以bps爲單位)限制 --device-read-iops=[ ] 掛載設備的讀速率(以每秒i/o次數爲單位)限制 --device-write-iops=[ ] 掛載設備的寫速率(以每秒i/o次數爲單位)限制 --kernel-memory="" 限制容器使用內核的內存大小,單位能夠是b,k,m或g -m,--memory="" 限制容器內應用使用的內存,單位能夠是b、k、m或g --memory-reservation="" 當系統中內存太低時,容器會被強制限制內存到給定值,默認狀況下等於內存限制值 --memory-swap="LIMIT" 限制容器使用內存和交換區的總大小 --oom-kill-disable=true|false 內存耗盡(out-of-memory)時是否殺死容器 --oom-score-adj="" 調整容器的內存耗盡參數 --pids-limit="" 限制容器的pid個數 --privileged=true|false 是否給容器以高權限,這意味着容器內應用將不授權限下限制,通常不推薦 --read-only=true|false 是否讓容器內的文件系統只讀 --security-opt=[ ] 指定一些安全參數,包括權限、安全能力、apparmor等 --stop-signal=STGTERM 指定中止容器的系統信號 --shm-size="" /dev/shm的大小 --sig-proxy=true|false 是否代理收到的信號給應用,默認爲true,不能代理SIGCHLD、SIGSTOP和SIGKILL信號 --memory-swappiness="0-100" 調整容器的內存交換區參數 -u,--user="" 指定在容器內執行命令的用戶信息 --ulimit=[ ] 經過ulimit來限制最大文件數、最大進程數等 其餘比較重要的選項還包括: ·-l,--label=[]:以鍵值對方式指定容器的標籤信息; ·--label-file=[]:從文件中讀取標籤信息。
啓動容器 使用docker start命令來啓動一個已經建立的容器: docker start 容器ID //開啓容器 docker stop 容器ID //關閉容器 docker容器的狀態: up 開啓狀態 Exited 終止狀態 Create 建立狀態 (Paused) 暫停狀態 狀態沒有 中止狀態 docker pause/unpause centos/httpd //暫停docker容器 docker stop centos/httpd //中止指定docker容器
新建並啓動容器 除了建立容器後經過start命令來啓動,也能夠直接新建並啓動容器。所須要的命令主要爲docker run,等價於先執行docker create命令,再執行docker start命令。 docker run centos/lamp /bin/bash -c ls / //建立容器的同時啓動並運行相關程序,命令完成容器就中止。 啓動一個bash終端,容許用戶進行交互: docker run -it ubuntu:14.04 /bin/bash root@af8bae53bdd3:/# 其中,-t選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上,-i則讓容器的標準輸入保持打開。 更多的命令選項能夠經過man docker-run命令來查看。在交互模式下,用戶能夠經過所建立的終端來輸入命令。 守護態運行 更多的時候,須要讓Docker容器在後臺以守護態(Daemonized)形式運行。此時,能夠經過添加-d參數來實現。 下面的命令會在後臺運行容器: docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 進入運行中的容器中,對容器作各類操做: docker exec -it 容器id /bin/bash 進入容器中 退出方法: 一、輸入exit 二、Ctrl+p, Ctrl+q鍵返回主機控制檯 鏈接到容器的會話 docker attach 容器id號 //將容器導出成文件 docker export 13198d132fbe > centoslamp 將指定容器導出成名爲centoslamp的文件,該文件爲docker鏡像文件 //將容器文件生成鏡像 docker import 文件名 鏡像名:標籤 //刪除容器 docker rm d4e863a654aa 指定刪除某個容器 docker rm -f d4e863a654aa 強制刪除運行中的容器,不建議 docker container prune 刪除全部中止的容器 docker rm $(docker ps -qf status=exited) 刪除指定狀態的容器
擴展: 硬件資源相關 一、 顯示容器硬件資源使用狀況 docker stats [選項] [0個或多個正在運行容器] docker stats 不指定容器時顯示全部正在運行的容器 二、更新容器的硬件資源限制 docker update [選項] 有可能報錯: vi /etc/default/grub GRUB_CMDLINE_LINUX="... cgroup_enable=memory swapaccount=1" 三、使用壓力測試工具 stress 驗證效果 使用已有的stress鏡像 progrium/stress, 開兩個終端, 在一個終端中執行下面命令 docker run -m 100m --rm -it progrium/stress --cpu 2 --io 1 --vm 10 --vm-bytes 9M 在另外一個終端執行 docker stats 進行監控 再開一個終端執行 9eb0爲容器id開頭, 請根據實際狀況替換。內存限制只能調大不能調小 docker update -m 200m 9eb0
容器操做:
建立:docker create -it 鏡像名(ID) /bin/bash
啓動容器: docker start 容器名(ID)
中止容器:docker stop 容器名(ID)
暫停:docker pause 容器名(ID)
取消暫停:docker unpause 容器名(ID)
刪除:docker rm -f 容器名(ID)
刪除全部中止的容器:docker container prune
查看容器詳細信息:docker inspect 容器id
查看容器列表:docker ps -a
建立並運行:docker run -itd 鏡像id /bin/bash
將容器存入文件:docker export 容器id > 文件名
將容器文件導入鏡像:docker import 文件名 鏡像名: 標籤github
docker 網絡覆蓋範圍可分爲:單個host上的容器網絡和跨多個host的網絡 docker 安裝時會自動在host上建立三個網絡,可使用docker network ls查看到 none 、host、bridge 此外還有另外兩種方式
一、none網絡 在這個網絡下只有容器的lo網卡,在建立容器時可使用--network=none指定使用none網絡 正常不指定網絡的狀況下: eth0 inet addr:172.17.0.7 指定網絡爲none的狀況下: docker run -it --network=none --name network1 busybox 只有一個lo網卡 通常來說,這個封閉的網絡有什麼用處呢? 可用於一些安全性較高的而且不須要聯網的應用可使用none網絡,好比:某個容器惟一用途就是生成隨機密碼,就能夠放到none網絡中避免密碼被竊取;可是大部分容器是須要網絡的
二、host網絡: 鏈接到host網絡的容器共享docker host的網絡棧,容器的網絡配置與host徹底一致,能夠經過--network=host指定host網絡 docker run -it --network=host --name network2 busybox 在容器中能夠看到真機的全部網卡,而且連hostname也是真機的 host網絡的使用場景是什麼呢? host網絡的最大好處就是:性能; 若是容器對網絡傳輸效率要求較高,則能夠選擇host網絡。 可是host網絡也有缺點:靈活性不高,好比:要考慮多口靈活性的問題,docker host上已經使用的端口容器就不能使用了 doker host另外一個用途就是:讓容器能夠直接配置host網絡,好比:一些跨host的網絡解決方案,自己也是以容器運行的,這些方案須要對網絡進行配置,好比,iptables。
三、bridge網絡: 容器默認使用的時bridge網絡 docker安裝時會建立一個 命令爲docker0的linux bridge。若是不指定--network=,運行的容器會默認掛到docker0上 能夠用「brctl show」命令查看橋接的網卡 容器中「eth0」——》真機的 veth9cfd9f7 ——橋接——》docker0 注:interface一列就是容器的虛擬網卡,若是容器都處於關閉的狀態,會沒有網卡信息 須要docker在開啓狀態下才能看到接口網卡 如:看到interfaces一列是veth48a8eca 進入容器中能夠看一下網卡的信息eth0 其實:eth0和veth48a8eca是一對veth pair。veth pair是一種成對出現的特殊網絡設備,能夠把他想像成由一根虛擬網線連起來的一對網卡,網卡的一頭叫作:eth0@if315,另外一頭是veth48a8eca掛在了docker0上,其效果就是將eth0@if315掛在了docker0上 看到eth0@if315配置了172.17.0.2/16的ip,再運行一個容器,看看他的ip是否也是一樣的 新運行的容器的IP由172.17.0.3順延下去了,而不是一個獨立的網段,並且都是172.17.0的網段的 爲何都是這個網段上面的呢? 能夠經過docker network inspect bridge 看到網卡的配置信息:subnet是172.17.0.0/16,gateway是172.17.0.1,這個網管來自哪呢? 能夠看到host主機上面的docker0的ip就是172.17.0.1,因此這個網管就是docker0
四、自定義網絡: 一般默認的狀況下使用的是docker的bridge的網絡,用戶也能夠根據本身的業務須要,建立user-defined docker 提供三種user-defined網絡驅動:bridge,overlay,macvlan。 其中overlay和macvlan用於建立跨主機的網絡 能夠經過bridge驅動建立相似前面默認的bridge網絡docker0 docker network create --driver bridge brnet1 經過brctl show看到咱們新建的網絡 新增長了一個網橋br-32a5cb322311 ,這裏的32a5cb322311正好是新建的brnet1的容器ID 經過docker network inspect brnet1查看 能夠看到新建的brnet1的subnet是172.18.0.0/16,網關是172.18.0.1,這裏的172.18.0.0/16網段是docker自動分配的網段 也能夠本身指定網段和網關:--subent和--gateway docker network create --driver bridge --subnet 192.168.2.0/24 --gateway 192.168.2.1 brnet2 容器要使用新的網絡,須要在新建運行(docker run)的時候,經過--network=去指定 指定一個靜態ip地址 能夠經過--ip指定 docker run -it --network=brnet2 --ip 192.168.2.222 busybox 注:只有經過--subnet建立的網絡才能指定靜態IP。 最好不要將容器設置成與host相同網段的,不然host的主機將被幹擾,固然若是收到了干擾也不用怕,可使用docker network rm <本身設置的bridge的名稱> 將這個bridge刪除
使用指定網絡建立容器:
docker run -it --network bridge 鏡像id /bin/bash
docker網絡查看:
docker network ls
建立docker網絡:
docker network create --driver=bridge 自定義的網絡名稱
建立docker網絡而且自定義可分配的網段和網關:
docker network create --driver=bridge --subnet 192.168.80.0/24 --gateway 192.168.80.1 自定義的網絡名稱
使用指定網絡建立容器而且分配一個靜態IP地址:
docker run -it --network 網絡名稱(自定義) --ip 192.168.80.100 鏡像名 /bin/bash
注意:靜態IP地址只要自定義網段而且使用「--subnet」指定網段才能分配
查看docker網絡的詳細信息:
docker network inspect 網絡名稱
刪除docker網絡:
docker network rm 網絡名稱web
一、容器訪問外部網絡 容器默認指定了網關爲docker0網橋上的docker0內部接口。docker0內部接口同時也是宿主機的一個本地接口。所以,容器默認狀況下是能夠訪問到宿主機本地的。更進一步,容器要想經過宿主機訪問到外部網絡,須要宿主機進行轉發。 # sysctl net.ipv4.ip_forward 查看轉發是否打開,1表明打開 net.ipv4.ip_forward = 1 若是爲0,則沒有開啓轉發,則須要手動打開: # sysctl -w net.ipv4.ip_forward=1 更簡單的,在啓動Docker服務的時候設定--ip-forward=true,Docker服務會自動打開宿主機系統的轉發服務。
二、端口映射 容器中能夠運行一些網絡應用,要讓外部也能夠訪問這些應用,能夠經過 -P(大寫) 或 -p (小寫) 參數來指定端口映射。 一、當使用 -P 標記時,Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口 二、-p(小寫)則能夠指定要映射的IP和端口,可是在一個指定端口上只能夠綁定一個容器。 支持的格式有 :真機Port:容器Port hostPort:containerPort(映射全部接口地址) 將本地的 5000 端口映射到容器的 5000 端口: docker run -d -p 5000:5000 training/webapp /bin/bash 此時默認會綁定本地全部接口上的全部地址。 ip:hostPort:containerPort (映射指定地址的指定端口) 指定映射使用一個特定地址,好比 localhost 地址 127.0.0.1 docker run -d -p 127.0.0.1:5000:5000 training/webapp /bin/bash ip::containerPort (映射指定地址的任意端口) 綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口。 docker run -d -p 127.0.0.1::5000 training/webapp /bin/bash 還可使用 udp 標記來指定 udp 端口 docker run -d -p 127.0.0.1:5000:5000/udp training/webapp /bin/bash 查看映射端口配置 使用 docker port 來查看當前映射的端口配置,也能夠查看到綁定的地址 docker ps -a 端口——>端口 注: 容器有本身的內部網絡和 ip 地址(使用 docker inspect 能夠獲取全部的變量,Docker 還能夠有一個可變的網絡配置。) -p 標記能夠屢次使用來綁定多個端口 例如: docker run -d -p 5000:5000 -p 3000:80 training/webapp /bin/bash
一、必須兩個容器處於同一網段,同時制定統一網絡 二、DNS:只用自定義的網絡而且自定義的網段才能使用dns
1.增長路由: 若是host上對每一個網絡都有一個路由,同時操做系統上打開了ip forwarding,host就成了一個路由,掛在不一樣的網橋上的網絡就可以互相ping通 能夠看一下host上是否知足這個條件 ip r查看host上的路由表 打開路由轉發功能 centos7版本: vi /etc/sysctl.conf net.ipv4.ip_forward = 1 centos 6版本: echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -p cat /proc/sys/net/ipv4/ip_forward 看是否是1 可是iptables DROP 掉了網橋 docker0 與 br-5d863e9f78b6 之間雙向的流量。 從規則的命名 DOCKER-ISOLATION 可知 docker 在設計上就是要隔離不一樣的 netwrok。
二、經過docker另外的增長網卡的辦法來解決: 使用docker network connect給容器增長一塊新的網卡 docker network connect brnet2 --ip 192.168.2.22 容器ID 經過docker network connect 這個命令給容器添加網卡eth1,並讓這個網卡使用另外的bridge,如今不一樣bridge之間的容器建能夠進行通訊