1、Docker入門簡介 Docker技術類似碼頭上看到的集裝箱,最早集裝箱沒有出現的時候,碼頭上有許多搬運的工人在搬運貨物,有了集裝箱以後,搬運貨物變得簡單,通過集裝箱的搬運模式更加單一、高效,將貨物打包在集裝箱裡面,可以複製貨物之間相互影響。 如果要將貨物搬運到另一個碼頭就需要裝運,通過集裝箱, ...
1、Docker入門簡介
Docker技術類似碼頭上看到的集裝箱,最早集裝箱沒有出現的時候,碼頭上有許多搬運的工人在搬運貨物,有了集裝箱以後,搬運貨物變得簡單,通過集裝箱的搬運模式更加單一、高效,將貨物打包在集裝箱裡面,可以複製貨物之間相互影響。
如果要將貨物搬運到另一個碼頭就需要裝運,通過集裝箱,可以直接把它們運送到另一個航艙內,而且完全可以保證裡面的貨物是整體地搬遷,而不會損壞貨物本身。
而Docker虛擬化正是基於類似的原理,將原本複雜的環境打包成為鏡像模塊,然後將模塊遷移到各個平臺,可以快速地交付使用,從而減少了人工大量的干預。
Docker是一個開源的應用容器引擎,開發者使用打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到如何流行的Linux機器上,進而實現虛擬化。
容器是完全使用沙箱機制的,而且互相之間不會有如何介面,幾乎沒有性能開銷,可以很容易地在機器和數據中心運行,最重要的是,他們不依賴於如何語言、框架或包括系統。
Docker虛擬化和傳統虛擬機(KVM、Xen等)方式的不同之處在於Docker虛擬化可以在操作系統層面上直接實現App或者虛擬化,直接復用本地機器的操作系統,而傳統方式則需要在硬體的基礎上,虛擬GurstOS操作系統,然後在GuestOS操作系統上部署相關的App應用。
Docker虛擬化實施有以下三個概念:
- Docker鏡像:Docker鏡像是一個靜態模塊,與常見的ISO鏡像類似,是一個樣板,不能直接修改,可以通過封裝生成;
- Docker容器:基於Docker鏡像運行啟動的應用或系統,稱之為一個Docker容器或Docker虛擬機;
- Docker倉庫:Docker倉庫是存放Docker鏡像的地方,常見分為公開倉庫和私有倉庫兩種形式;
Docker倉庫的用處:
Docker倉庫是Docker鏡像的存儲倉庫。可以推送鏡像到docker倉庫中,然後在docker客戶端,可以從docker倉庫中搜索和拉取鏡像。
Docker容器是如何工作的:
一個Docker容器包含了一個操作系統、用戶添加的文件和元數據(meta-data)。每個容器都是從鏡像建立的,鏡像告訴Docker容器內包含了什麼,當容器啟動時運行什麼程式,還有許多配置數據。Docker鏡像是只讀的,當Docker運行一個從鏡像建立的容器,它會在鏡像頂部添加一個可讀寫的層,應用程式可以在這裡運行。
Docker用途:簡單配置、代碼流水管理、開發效率、應用隔離、伺服器整合、多租戶、快速部署
2、Docker LXC及Cgroup
Docker虛擬化的由來需要從Docker發展歷史來看,最早的Docker技術為LXC+聯合文件系統(AUFS)組合。Docker0.9.0版本開始引入libcontainer可以視作LXC的替代品,其中LXC負責資源管理,AUFS負責鏡像管理。而LXC包括Cgroup、Namespace、Chroot等組件,並通過Cgroups進行資源管理。
Docker、LXC、Cgroup三者的關係是Cgroup在最底層落實資源管理。LXC在Cgroup上封裝了一層,Docker又在LXC封裝了一層。
Cgroups最初的目標是為資源管理提供一個統一的框架,整合現有的Cpuset等子系統,也為未來開發新的子系統提供介面。
Linux container容器可以提供輕量級的虛擬化,以便隔離進程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他複雜性。容器有效地將由單個操作系統管理的資源劃分到獨立的組中,以便更好地在獨立的組之間平衡有衝突的資源使用需求。
3、Docker虛擬化特點
Docker虛擬化跟傳統虛擬化相比,有以下特點:
- 操作啟動快,運行時的性能可以獲取極大提升,管理操作(啟動、停止、開啟、重啟等)都是以秒或毫秒為單位的;
- 輕量級虛擬化,用戶會擁有足夠的“操作系統”,僅需添加或減小鏡像即可,單台伺服器上可以部署100~1000個containers容器,而傳統虛擬化能虛擬10~20個虛擬機就非常不錯了;
- 開源免費,成本低,由現代Linux內核支持並驅動;
- 前景及雲支持,正在越來越受歡迎,各大主流公司都在推動Docker的快速交付;
- 更簡單的管理,使用Docker只需要小小的修改,就可以替代以往大量的更新工作,所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理;
4、Docker虛擬化原理
Docker虛擬化中最核心部分為Docker引擎,Docker引擎是一個C/S(client/server)機構的應用;
Docker server是一個常駐進程,rest API實現了client和server間的交互協議 ,CLI實現容器和鏡像的管理,為用戶提供統一的操作界面。Docker使用C/S架構,client通過介面與server進程通信實現容器的構建、運行和發佈,client和server可以運行在同一臺集群,也可以通過跨主機實現遠程通信。
Docker鏡像作為Docker中最基本的概念,有以下特性:
- 鏡像分層:每個鏡像都由一個或多個鏡像層組成;
- 可通過在某個鏡像上加上一定的鏡像層得到新鏡像(此過程可以通過編寫DockerFile或基於容器Commit實現);
- 每個鏡像層擁有唯一鏡像ID;
- 鏡像在存儲和使用時共用相同的鏡像層(根據ID),所以在Pull鏡像時,已有的鏡像層會在自動跳過下載;
- 每個鏡像層都是只讀的,即使啟動成容器,也無法對其真正的修改,修改只會作用於最上層的容器層。
Docker容器,可以理解為一個或多個運行進程,而這些運行進程將占有相應的記憶體、相應的CPU計算資源,則通過Docker鏡像的鏡像層文件來提供。
基於每個鏡像的json文件,Docker可以通過解析Docker鏡像的驚悚文件,獲知應該在這個鏡像之上運行什麼樣的進程,應該為進程配置怎樣的環境變數,Docker守護進程實現了靜態向動態的轉變。
5、Docker安裝配置-CentOS7.X系列安裝Docker軟體
sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config setenforce 0 yum -y install epel-release yum -y install docker* systemctl start docker
報錯:
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
解決辦法:
vi /etc/sysconfig/docker
systemctl start docker
systemctl enable docker
ps -ef |grep docker
Docker下載加速,預設docker下載是從國外去下載,但是下載速度慢,所有我們 這邊使用國內的:
cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": [ "https://registry.docker-cn.com", "https://dockerhub.azk8s.cn", "https://reg-mirror.qiniu.com" ] } EOF systemctl restart docker
6、Dockers必備命令
公共倉庫Nginx和CentOS鏡像下載以及本地導入CentOS鏡像,執行如下命令
docker pull centos :Docker下載CentOS鏡像
docker pull nginx :Docker下載Nginx鏡像
本地導入鏡像:
格式:cat 本地容器快照名 | docker import-自定義容器名:自定義標記名
docker version :查看Docker版本
docker info :查看當前信息
docker search centos :搜索可用Docker鏡像
docker search -s 500 nginx :搜索星級為500以上的鏡像
docker pull docker.io/nginx :下載nginx鏡像
docker images :查看當前Docker所有鏡像
啟動Docker鏡像:
-i:表示交互輸入 -t:表示打開終端 -d:表示後臺啟動
docker run -i -t centos /bin/bash
進入Docker容器:
docker exec -it a9ca644fd04f /bin/bash :紅色部分是容器的ID
退出Docker容器:
(1)exit或者ctrl+d :退出並停止容器
(2)先按ctrl+p再按ctrl+q :退出偽終端,容器後臺運行
docker ps :查看容器,-l獲得最後一個容器的ID,-a查看所有的容器
docker start id :啟動Docker容器,可以利用docker ps查看容器,然後輸入iD
docker stop id :關閉Docker容器
docker save -o centos-7.2.tar centos:latest :存儲鏡像
docker rm id :刪除Docker容器,如果刪除多個容器則需要使用空格隔離即可~!
docker rmi id :刪除Dokcer鏡像
docker load < centos-7.2.tar :導入容器快照
docker export -o centos-7.2.test.tar container_id :Docker導出鏡像
cat centos-7.2.test.tar | docker import - centos-7.2.test :本地導入Docker鏡像,紅色為鏡像名,需要自定義
docker run -p 5500:80 -it nginx /bin/bash :將宿主機5500埠映射給容器的80埠
nginx :啟動nginx服務
圖片顯示