《2018年11月8日 -容器生態分享會》
1. 容器生態介紹
基本概念
說到容器技術,大家都想到docker,可能認為容器就是docker,docker也是容器。其實,docker僅僅是一種容器的引擎。除了docker以外,還有CoreOS的RKT,還有linux的容器技術LXC等。而docker是這些容器引擎技術中最為成熟的技術。當我們談到容器,不得不說的是虛擬機器,例如:VMware,VirtualBox等,虛擬機器是基於硬體的虛擬化技術,會完全虛擬出一整套的物理主機,包括CPU、記憶體、磁碟、網絡卡等硬體設施,呈現的是一種物理主機的特性。架構圖如左邊所示。而對於容器技術,是一種基於作業系統的虛擬化技術,執行在作業系統之上的使用者空間,容器提供是一種程序級別的隔離,讓每個容器都像執行在單獨的系統之上,但是又能共享很多的底層資源。
docker最核心的三個概念
映象,容器,倉庫
docker的網路
一個宿主機上可以執行成百上千個容器,當多個宿主機組成容器的叢集時,開發者就需要考慮容器之間以及容器與其他實體之間的連通性以及隔離性的問題。docker network 是docker原生的解決方案。
主要有三種網路模式:
1.host 模式
docker 底層採用的是linux的Namespace技術來進行資源的隔離技術,其中Network Namespace隔離的是網路。一個Network Namespace隔離的是一個獨立的網路環境,包括網路、路由等資源,而採用host模式並不是使用獨立的Network Namespace,而是和宿主機共用一個Network Namespace,使用的是相同的IP和埠。
2.bridge 模式
橋接模式下,會把docker容器掛載在一個虛擬網橋上,docker會給每個容器配置自己的Network Namespace,設定IP地址。
3.none 網路
none網路就是什麼都沒有的網路,掛載在這個網路下面的容器除了lo,沒有其它任何網絡卡。
4.user-defined 模式
開發者可以根據業務需要自定義網路,docker提高三種自定義網路驅動,bridge、overlay和macvlan。
容器監控方案
一臺宿主機上一般都可以執行成百上千臺容器,而容器的動態效能是開發者所關心的,針對於少量的容器,可以採用docker的命令來監控效能,例如:docker ps /top/stats,除此之外還有 開源的工具比如:cAdvisor,第三方監控工具:data dog。
容器的編排技術
容器的編排包括容器管理、容器排程、容器叢集定義和服務發現等,通過容器編排引擎,容器被有機地組合成微服務應用,實現業務的需求。
目前最常見的編排工具有:
1.docker原生的Swarm
swarm在多臺docker主機上建立一層抽象,還提供宿主機資源的分配和管理。swarm的特性主要有:配置簡單,去中心話設計思想,可伸縮服務,負載均衡,高可用等特性。
2.google開源的Kubernetes
kubernetes是一個管理跨主機容器化應用的系統,實現了應用部署,高可用管理和服務伸縮在內的一系列基礎功能並封裝成簡單易用的RESTful API 對外提供服務。
3.是Apache開源的叢集資源排程平臺mesos
docker容器基本命令
安裝 docker 線上安裝
centos yum install docker
ubuntu apt-get install docker
windows 安裝 boot2docker
boot2docker是一個極小的虛擬機器,它在 windows宿主機上安裝一個原生的命令列工具,並提供一個 docker環境。
離線安裝
wget https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.12.6-1.el7.centos.x86_64.rpm wget https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.12.6-1.el7.centos.noarch.rpm yum localinstall -y docker-engine*
檢視安裝的版本
docker --version docker info
所有的程式都是從hello world開始的。
映象的命令
docker search image:tag docker pull image:tag docker search hello-world docker pull hello-world docker run hello-world docker pull centos docker run -it -d --name test-centos centos /bin/bash -i:以互動式模式執行容器 -t :為容器分配一個偽終端 --name: 為容器指定一個名稱 /bin/bash 這是表示載入容器後執行bash ,docker中必須要保持一個程序的執行,要不然整個容器就會退出。 docker ps docker exec -it <id/name> ls mkdir test
退出容器 crtl +p+q
ls / 發現沒有建立的資料夾,這就可以驗證 centos的容器是一個隔離的環境。
在這個容器中環境是和宿主機是隔離的,我們就可以做一些安裝軟體,執行程式的操作。比如,我們使用python環境,想裝一個 python2以及python3的環境,就可以採用 docker。
docker pull python 2.7 docker pull python 3.5 docker run -it --name python2 python:2.5 /bin/bash docker run -it --name python3 python:3.5 /bin/bash
這樣就比較容易的實現了環境的隔離。
Namespce做環境隔離
網路隔離
docker inspect <container>
uts隔離機制
docker run -it --name test-centos-1 --hostname centos /bin/bash
除此之外還有:IPC隔離,PID隔離等。
資源限制
Cgroup
Linux Cgroup 可讓您為系統中所執行任務(程序)的使用者定義組群分配資源 — 比如 CPU 時間、系統記憶體、網路頻寬或者這些資源的組合 。
預設情況下,所有的容器可以平等地使用 host CPU資源並且沒有限制,通過 -c可以限制容器使用 CPU的權重,不指定則預設是1024. -m 設定記憶體的使用限制。
docker run -it --name test-centos-2 -c 1024 -m 200m centos docker run -it --name test-centos-3 -c 512 -m 200m centos
當兩個容器容器都需要 CPU資源時,test-centos-2 是 3的兩倍。
docker stop container docker rm container docker rmi image:tag docker exec docker attach
埠對映與掛載
docker run -it -v /code:/code python:2.7 python /code/hello.py docker run -it -d -p 3306:3306 -v /code/data:/var/lib/mysql -e MYSQL_PASS="my_pass" mysql:5.7 docker run -it -d -p:2080:80 -v /code/nginx:/usr/share/nginx/html --name test-nginx nginx
使用容器的一些經驗:
一個容器中只執行一個程序。
容器故障退出時候,可以通過檢視日誌,排查錯誤。
docker logs [options] container
建立容器的時候,一定要通過掛載做持久化,防止容器被誤刪除後,重要資料丟失。做了持久化後,即使容器被刪除了,掛載在宿主機的資料還會存在。
交流的問題:
介紹下 雲端計算提供的三種服務?
雲端計算提供的三種服務分別是:
IAAS:基礎設施即服務,舉個例子:阿里雲伺服器,金山雲伺服器,亞馬遜雲伺服器,這個底層都是對叢集的虛擬化,提供是虛擬機器。而PAAS:平臺即服務,提供的是一些mysql服務,kafka的服務,使用 docker實現的。saas:軟體即服務,我們不需要在本地安裝各種軟體,只需要開啟瀏覽器註冊賬號,就可以使用各種軟體,比如QQ,Word等。
容器 host模式下,啟動一個nginx,是不是直接是 宿主機的ip+port?
是的,host模式下,主機和容器共享一個網段,容器不會使用 namespace空間。