1. 程式人生 > >Docker 基礎

Docker 基礎

新的 基礎 不同的應用 eat 大量 mail 獨立 emc 找到

docker 介紹

Docker is the world’s leading software container platform. Developers use Docker to eliminate(消除) “works on my machine” problems when collaborating(合作) on code with co-workers. Operators use Docker to run and manage apps side-by-side(並行) in isolated(獨立) containers to get better compute density(計算密度). Enterprises use Docker to build agile(敏捷) software delivery(交付) pipelines(管道) to ship new features(特性) faster, more securely and with confidence for both Linux, Windows Server, and Linux-on-mainframe apps.

Docker是世界領先的容器平臺,在與同事協作代碼開發消除個人開發環境引起(不一致)的問題,操作人原(開發或者運維)使用Docker運行和管理獨立且並行的程序容器來獲取更好的計算密度,企業使用Docker來構建敏捷的軟件交付管道以更快地發布新特性,對於Windows linux server 大型主機上應用更可靠安全。

docker特性(能幹什麽)

1. 簡化配置
這是Docker公司宣傳的Docker的主要使用場景。虛擬機的最大好處是能在你的硬件設施上運行各種配置不一樣的平臺(軟件、系統),Docker在降低額外開銷的情況下提供了同樣的功能。它能讓你將運行環境和配置放在代碼中然後部署,同一個Docker的配置可以在不同的環境中使用,這樣就降低了硬件要求和應用環境之間耦合度。
2. 代碼流水線(Code Pipeline)管理 前一個場景對於管理代碼的流水線起到了很大的幫助。代碼從開發者的機器到最終在生產環境上的部署,需要經過很多的中間環境。而每一個中間環境都有自己微小的差別,Docker給應用提供了一個從開發到上線均一致的環境,讓代碼的流水線變得簡單不少。 3. 提高開發效率 這就帶來了一些額外的好處:Docker能提升開發者的開發效率。如果你想看一個詳細一點的例子,可以參考Aater在DevOpsDays Austin 2014大會或者是DockerCon上的演講。 不同的開發環境中,我們都想把兩件事做好。一是我們想讓開發環境盡量貼近生產環境,二是我們想快速搭建開發環境。 理想狀態中,要達到第一個目標,我們需要將每一個服務都跑在獨立的虛擬機中以便監控生產環境中服務的運行狀態。然而,我們卻不想每次都需要網絡連接,每次重新編譯的時候遠程連接上去特別麻煩。這就是Docker做的特別好的地方,開發環境的機器通常內存比較小,之前使用虛擬的時候,我們經常需要為開發環境的機器加內存,而現在Docker可以輕易的讓幾十個服務在Docker中跑起來。
4. 隔離應用 有很多種原因會讓你選擇在一個機器上運行不同的應用,比如之前提到的提高開發效率的場景等。 我們經常需要考慮兩點,一是因為要降低成本而進行服務器整合,二是將一個整體式的應用拆分成松耦合的單個服務(譯者註:微服務架構)。如果你想了解為什麽松耦合的應用這麽重要,請參考Steve Yege的這篇論文,文中將Google和亞馬遜做了比較。 5. 整合服務器 正如通過虛擬機來整合多個應用,Docker隔離應用的能力使得Docker可以整合多個服務器以降低成本。由於沒有多個操作系統的內存占用,以及能在多個實例之間共享沒有使用的內存,Docker可以比虛擬機提供更好的服務器整合解決方案。 6. 調試能力 Docker提供了很多的工具,這些工具不一定只是針對容器,但是卻適用於容器。它們提供了很多的功能,包括可以為容器設置檢查點、設置版本和查看兩個容器之間的差別,這些特性可以幫助調試Bug。你可以在《Docker拯救世界》的文章中找到這一點的例證。 7. 多租戶環境 另外一個Docker有意思的使用場景是在多租戶的應用中,它可以避免關鍵應用的重寫。我們一個特別的關於這個場景的例子是為IoT(譯者註:物聯網)的應用開發一個快速、易用的多租戶環境。這種多租戶的基本代碼非常復雜,很難處理,重新規劃這樣一個應用不但消耗時間,也浪費金錢。 使用Docker,可以為每一個租戶的應用層的多個實例創建隔離的環境,這不僅簡單而且成本低廉,當然這一切得益於Docker環境的啟動速度和其高效的diff命令。 你可以在這裏了解關於此場景的更多信息。 8. 快速部署 在虛擬機之前,引入新的硬件資源需要消耗幾天的時間。虛擬化技術(Virtualization)將這個時間縮短到了分鐘級別。而Docker通過為進程僅僅創建一個容器而無需啟動一個操作系統,再次將這個過程縮短到了秒級。這正是Google和Facebook都看重的特性。 你可以在數據中心創建銷毀資源而無需擔心重新啟動帶來的開銷。通常數據中心的資源利用率只有30%,通過使用Docker並進行有效的資源分配可以提高資源的利用率。

docker架構及組件(家庭成員)

docker是有docker宿主機 client 和server構成
技術分享

docker三大組件分別是鏡像(image)、容器(Container)、倉庫(repository)
1.鏡像 Docker運行容器前需要本地存在對應的鏡像。 鏡像可以用來創建Docker容器的。一個鏡像可以包含一個完整的操作系統環境和用戶需要的其它應用程序。在docker hub 裏面有大量現成的鏡像提供下載。docker的鏡像是只可讀的,一個鏡像可以創建多個容器。 2.容器 docker利用容器來開發、運行應用。 容器是鏡像創建的實例。它可以被啟動、開始、停止、刪除。每個容器都是 相互隔離的、保證安全的平臺。 3.倉庫 倉庫是集中存放鏡像文件的場所。 每個 倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)。 最大的公開倉庫是DockerHub,存放了數量龐大的鏡像供用戶下載。國內的公開 倉庫包括DockerPool等,可以提供大陸用戶更穩定快速的訪問。當然,用戶也可以在本地網絡內創建一個私有倉庫

Docker VS Vm(不同場景選擇不懂程度上的虛擬化)

Docker可以認為是服務或微型服務虛擬化,Vm是操作系統的級別的虛擬化

技術分享技術分享

技術分享

在一個物理機上可以跑多個VM,VM特點就是穩定占用主機的性能較高相對不靈活適合傳統復雜的企業,Docker則相反,適合真正的互聯網公司可以動態擴展和伸縮集群。

安裝(基於Centos7)

[[email protected] ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[[email protected] ~]# uname -ra
Linux docker01.zwjf.com 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[[email protected] ~]# yum -y install docker
[[email protected] ~]# systemctl   start docker
[[email protected] ~]# systemctl   restart docker
[[email protected] ~]# systemctl   enable docker
[[email protected] ~]# docker info

常用命令可參考 http://www.runoob.com/docker/docker-tutorial.html

技術分享
1. 查看docker信息(version、info)
# 查看docker版本 
docker version 
# 顯示docker系統的信息 
docker info
2. 對image的操作(search、pull、images、rmi、history)
# 檢索image 
docker search image_name
 
# 下載image 
docker pull image_name 
#列出鏡像列表; -a, --all=false Show all images; --no-trunc=false Dont truncate output; -q, --quiet=false Only show numeric IDs 
docker images
# 刪除一個或者多個鏡像; -f, --force=false Force; --no-prune=false Do not delete untagged parents 
docker rmi image_name
# 顯示一個鏡像的歷史; --no-trunc=false Dont truncate output; -q, --quiet=false Only show numeric IDs docker his
3. 啟動容器(run)
# 在容器中運行"echo"命令,輸出"hello word" 
docker run image_name echo "hello word"
# 交互式進入容器中 
docker run -i -t image_name /bin/bash
# 在容器中安裝新的程序 
docker run image_name apt-get install -y app_name
# 在一次進剛才進入的容器
docker exec -i -t [容器ID]
查看容器(ps)
# 列出當前所有正在運行的container 
docker ps
# 列出所有的container 
docker ps -a 
# 列出最近一次啟動的container 
docker ps -l
保存對容器的修改(commit)
# 保存對容器的修改; -a, --author="" Author; -m, --message="" Commit message 
docker commit ID new_image_name
 對容器的操作(rm、stop、start、kill、logs、diff、top、cp、restart、attach)
# 刪除所有容器 
docker rm `docker ps -a -q` 
    
# 刪除單個容器; -f, --force=false; -l, --link=false Remove the specified link and not the underlying container; -v, --volumes=false Remove the volumes associated to the container 
docker rm Name/ID
    
# 停止、啟動、殺死一個容器 
docker stop Name/ID
docker start Name/ID
docker kill Name/ID
    
# 從一個容器中取日誌; -f, --follow=false Follow log output; -t, --timestamps=false Show timestamps 
docker logs Name/ID
    
# 列出一個容器裏面被改變的文件或者目錄,list列表會顯示出三種事件,A 增加的,D 刪除的,C 被改變的 
docker diff Name/ID
    
# 顯示一個運行的容器裏面的進程信息 
docker top Name/ID
    
# 從容器裏面拷貝文件/目錄到本地一個路徑 
docker cp Name:/container_path to_path 
docker cp ID:/container_path to_path 
    
# 重啟一個正在運行的容器; -t, --time=10 Number of seconds to try to stop for before killing the container, Default=10 
docker restart Name/ID

# 附加到一個運行的容器上面; --no-stdin=false Do not attach stdin; --sig-proxy=true Proxify all received signal to the process 
docker attach ID
保存和加載鏡像(save、load)
# 保存鏡像到一個tar包; -o, --output="" Write to an file 
docker save image_name -o file_path 
 
# 加載一個tar包格式的鏡像; -i, --input="" Read from a tar archive file 
docker load -i file_path 
    
# 機器a 
docker save image_name > /home/save.tar
 
# 使用scp將save.tar拷到機器b上,然後:
docker load < /home/save.tar
登錄registry server(login)
# 登陸registry server; -e, --email="" Email; -p, --password="" Password; -u, --username="" Usernamedocker login
 發布image(push)
# 發布docker鏡像 
docker push new_image_name
根據Dockerfile 構建出一個容器
build 
   --no-cache=false Do not use cache when building the image 
   -q, --quiet=false Suppress the verbose output generated by the containers 
   --rm=true Remove intermediate containers after a successful build 
   -t, --tag="" Repository name (and optionally a tag) to be applied to the resulting image in case of success 
 
docker build -t image_name Dockerfile_path
View Code

Docker 基礎