1、引言
1.1Docker是什么
Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部項目,于 2013 年 3 月以 Apache 2.0 授權協議開源,主要項目代碼在 GitHub 上進行維護。
Docker 使用 Google 公司推出的 Go 語言 進行開發實現。
docker是linux容器的一種封裝,提供簡單易用的容器使用接口。它是最流行的Linux容器解決方案。
docker的接口相當簡單,用戶可以方便的創建、銷毀容器。
docker將應用程序與程序的依賴,打包在一個文件里面。運行這個文件就會生成一個虛擬容器。
程序運行在虛擬容器里,如同在真實物理機上運行一樣,有了docker,就不用擔心環境問題了。
1.2 應用場景
web應用的自動化打包和發布
自動化測試和持續集成、發布
在服務型環境中部署和調整數據庫或其他應用
1.3 區別
1、物理機
2、虛擬機
3、docker容器
1.4 Docker的三大概念及優勢
鏡像image
容器container
倉庫repository
docker容器的優勢
# 1、更高效的利用系統資源
由于容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker 對系統 資源的利用率更高。
無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳 統虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運 行更多數量的應用。
# 2、更快速的啟動時間
傳統的虛擬機技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由于直接 運行于宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟 動時間。大大的節約了開發、測試、部署的時間。
# 3、一致的運行環境
開發過程中一個常見的問題是環境一致性問題。由于開發環境、測試環境、生產環 境不一致,導致有些 bug 并未在開發過程中被發現。
而 Docker 的鏡像提供了除內 核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 “這段代碼 在我機器上沒問題啊” 這類問題。
# 4、持續交付和部署
對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意 地方正常運行。
使用 Docker 可以通過定制應用鏡像來實現持續集成、持續交付、部署。開發人員 可以通過 Dockerfile 來進行鏡像構建,并結合持續集成(Continuous Integration) 系 統進行集成測試,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。
而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環 境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。
# 5、更輕松的遷移
由于 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在 很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運 行結果是一致的。
因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一 個平臺上,而不用擔心運行環境的變化導致應用無法正常運行的情況。
2、0Docker安裝
系統環境:docker最低支持centos7且在64位平臺上,內核版本在3.10以上
版本:社區版,企業版(包含了一些收費服務)
官方版安裝教程(英文)
https://docs.docker.com/install/linux/docker-ce/centos/#upgrade-docker-after-using-the-convenience-script
博主版安裝教程:
#安裝dockeryuminstalldocker#啟動dockersystemctlstart/statusdocker#查看docker啟動狀態dockerversion
配置加速器
簡介:DaoCloud 加速器 是廣受歡迎的 Docker 工具,解決了國內用戶訪問 Docker Hub 緩慢的問題。DaoCloud 加速器結合國內的 CDN 服務與協議層優化,成倍的提升了下載速度。
DaoCloud官網:
https://www.daocloud.io/mirror#accelerator-doc
#一條命令加速(記得重啟docker)curl-sSLhttps://get.daocloud.io/daotools/set_mirror.sh|sh-shttp://95822026.m.daocloud.io
3、0Docker基礎命令
docker --help(中文注解)
Usage:docker[OPTIONS]COMMAND[arg...]
dockerdaemon[--help|...]
docker[--help|-v|--version]Aself-sufficientruntimeforcontainers.Options:--config=~/.docker
Locationofclientconfigfiles#客戶端配置文件的位置-D,--debug=false
Enabledebugmode#啟用Debug調試模式-H,--host=[]
Daemonsocket(s)toconnectto#守護進程的套接字(Socket)連接-h,--help=false
Printusage#打印使用-l,--log-level=info
Setthelogginglevel#設置日志級別--tls=false
UseTLS;impliedby--tlsverify#--tlscacert=~/.docker/ca.pemTrustcertssignedonlybythisCA#信任證書簽名CA--tlscert=~/.docker/cert.pemPathtoTLScertificatefile#TLS證書文件路徑--tlskey=~/.docker/key.pemPathtoTLSkeyfile#TLS密鑰文件路徑--tlsverify=false
UseTLSandverifytheremote#使用TLS驗證遠程-v,--version=false
Printversioninformationandquit#打印版本信息并退出Commands:attachAttachtoarunningcontainer#當前shell下attach連接指定運行鏡像buildBuildanimagefromaDockerfile#通過Dockerfile定制鏡像commitCreateanewimagefromacontainer'schanges#提交當前容器為新的鏡像cpCopyfiles/foldersfromacontainertoaHOSTDIRortoSTDOUT#從容器中拷貝指定文件或者目錄到宿主機中createCreateanewcontainer#創建一個新的容器,同run但不啟動容器diffInspectchangesonacontainer'sfilesystem#查看docker容器變化eventsGetrealtimeeventsfromtheserver#從docker服務獲取容器實時事件execRunacommandinarunningcontainer#在已存在的容器上運行命令exportExportacontainer'sfilesystemasatararchive#導出容器的內容流作為一個tar歸檔文件(對應import)historyShowthehistoryofanimage#展示一個鏡像形成歷史imagesListimages#列出系統當前鏡像importImportthecontentsfromatarballtocreateafilesystemimage#從tar包中的內容創建一個新的文件系統映像(對應export)infoDisplaysystem-wideinformation#顯示系統相關信息inspectReturnlow-levelinformationonacontainerorimage#查看容器詳細信息killKillarunningcontainer#kill指定docker容器loadLoadanimagefromatararchiveorSTDIN#從一個tar包中加載一個鏡像(對應save)loginRegisterorlogintoaDockerregistry#注冊或者登陸一個docker源服務器logoutLogoutfromaDockerregistry#從當前Dockerregistry退出logsFetchthelogsofacontainer#輸出當前容器日志信息pausePauseallprocesseswithinacontainer#暫停容器portListportmappingsoraspecificmappingfortheCONTAINER#查看映射端口對應的容器內部源端口psListcontainers#列出容器列表pullPullanimageorarepositoryfromaregistry#從docker鏡像源服務器拉取指定鏡像或者庫鏡像pushPushanimageorarepositorytoaregistry#推送指定鏡像或者庫鏡像至docker源服務器renameRenameacontainer#重命名容器restartRestartarunningcontainer#重啟運行的容器rmRemoveoneormorecontainers#移除一個或者多個容器rmiRemoveoneormoreimages#移除一個或多個鏡像(無容器使用該鏡像才可以刪除,否則需要刪除相關容器才可以繼續或者-f強制刪除)runRunacommandinanewcontainer#創建一個新的容器并運行一個命令saveSaveanimage(s)toatararchive#保存一個鏡像為一個tar包(對應load)searchSearchtheDockerHubforimages#在dockerhub中搜索鏡像startStartoneormorestoppedcontainers#啟動容器statsDisplayalivestreamofcontainer(s)resourceusagestatistics#統計容器使用資源stopStoparunningcontainer#停止容器tagTaganimageintoarepository#給源中鏡像打標簽topDisplaytherunningprocessesofacontainer#查看容器中運行的進程信息unpauseUnpauseallprocesseswithinacontainer#取消暫停容器versionShowtheDockerversioninformation#查看容器版本號waitBlockuntilacontainerstops,thenprintitsexitcode#截取容器停止時的退出狀態值Run'dockerCOMMAND--help'formoreinformationonacommand.#運行docker命令在幫助可以獲取更多信息dockersearchhello-docker#搜索hello-docker的鏡像dockersearchcentos#搜索centos鏡像dockerpullhello-docker#獲取centos鏡像dockerrunhello-world#運行一個docker鏡像,產生一個容器實例(也可以通過鏡像id前三位運行)dockerimagels#查看本地所有鏡像dockerimages#查看docker鏡像dockerimagermihello-docker#刪除centos鏡像dockerps#列出正在運行的容器(如果創建容器中沒有進程正在運行,容器就會立即停止)dockerps-a#列出所有運行過的容器記錄dockersavecentos>/opt/centos.tar.gz#導出docker鏡像至本地dockerload/opt/centos.tar.gz???#導入本地鏡像到docker鏡像庫docker?stop??`docker?ps?-aq`??#?停止所有正在運行的容器docker??rm?`docker?ps?-aq`????#?一次性刪除所有容器記錄docker?rmi??`docker?images?-aq`???#?一次性刪除所有本地的鏡像記錄
3.1 啟動容器的兩種方式
容器是運行應用程序的,所以必須得先有一個操作系統為基礎
1、基于鏡像新建一個容器并啟動
#1.后臺運行一個dockerdockerrun-dcentos/bin/sh-c"whiletrue;doecho正在運行;sleep1;done"#-d后臺運行容器#/bin/sh指定使用centos的bash解釋器#-c運行一段shell命令#"whiletrue;doecho正在運行;sleep1;done"在linux后臺,每秒中打印一次正在運行dockerps#檢查容器進程dockerlogs-f容器id/名稱#不間斷打印容器的日志信息dockerstopcentos#停止容器#2.啟動一個bash終端,允許用戶進行交互dockerrun--namemydocker-itcentos/bin/bash#--name給容器定義一個名稱#-i讓容器的標準輸入保持打開#-t讓Docker分配一個偽終端,并綁定到容器的標準輸入上#/bin/bash指定docker容器,用shell解釋器交互
當利用docker run來創建容器時,Docker在后臺運行的步驟如下:
#1.檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載#2.利用鏡像創建并啟動一個容器#3.分配一個文件系統,并在只讀的鏡像層外面掛在一層可讀寫層#4.從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去#5.從地址池配置一個ip地址給容器#6.執行用戶指定的應用程序#7.執行完畢后容器被終止
2、將一個終止狀態(stopped)的容器重新啟動
[root@localhost~]#dockerps-a#先查詢記錄CONTAINERID
IMAGE
COMMAND
CREATED
STATUS
PORTS
NAMESee92fcf6f32d
centos"/bin/bash"
4daysagoExited(137)3daysago
kickass_raman[root@localhost~]#dockerstartee9#再啟動這個容器ee9[root@localhost~]#dockerexec-itee9/bin/bash#進入容器交互式界面[root@ee92fcf6f32d/]##注意看用戶名,已經變成容器用戶名
3.2 提交創建自定義鏡像
#1.我們進入交互式的centos容器中,發現沒有vim命令dockerrun-itcentos#2.在當前容器中,安裝一個vimyuminstall-yvim#3.安裝好vim之后,exit退出容器exit#4.查看剛才安裝好vim的容器記錄dockercontainerls-a#5.提交這個容器,創建新的imagedockercommit059fdea031bachaoyu/centos-vim#6.查看鏡像文件dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEchaoyu/centos-vimlatestfd2685ae25fe5minutesago348MB
3.3 外部訪問容器
容器中可以運行網絡應用,但是要讓外部也可以訪問這些應用,可以通過-p或-P參數指定端口映射。
dockerrun-d-Ptraining/webapppythonapp.py#-P參數會隨機映射端口到容器開放的網絡端口#檢查映射的端口dockerps-lCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMEScfd632821d7atraining/webapp"pythonapp.py"21secondsagoUp20seconds0.0.0.0:32768->5000/tcpbrave_fermi#宿主機ip:32768映射容器的5000端口#查看容器日志信息dockerlogs-fcfd##不間斷顯示log#也可以通過-p參數指定映射端口dockerrun-d-p9000:5000training/webapppythonapp.py
打開瀏覽器訪問服務器的9000端口, 內容顯示 Hello world!表示正常啟動
(如果訪問失敗的話,檢查自己的防火墻,以及云服務器的安全組)
4、利用dockerfile定制鏡像
鏡像是容器的基礎,每次執行docker run的時候都會指定哪個鏡像作為容器運行的基礎。我們之前的例子都是使用來自docker hub的鏡像,直接使用這些鏡像只能滿足一定的需求,當鏡像無法滿足我們的需求時,就得自定制這些鏡像。
# 鏡像的定制就是定制每一層所添加的配置、文件。如果可以吧每一層修改、安裝、構建、操作的命令都寫入到一個腳本,用腳本來構建、定制鏡像,這個腳本就是dockerfile。# Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令 構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
參數詳解
FROMscratch#制作baseimage基礎鏡像,盡量使用官方的image作為baseimageFROMcentos#使用baseimageFROMubuntu:14.04#帶有tag的baseimageLABELversion=“1.0”#容器元信息,幫助信息,Metadata,類似于代碼注釋LABELmaintainer=“yc_uuu@163.com"#對于復雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令!RUNyumupdate&&yuminstall-yvimPython-dev#反斜線換行RUN/bin/bash-c"source$HOME/.bashrc;echo$HOME”WORKDIR/root#相當于linux的cd命令,改變目錄,盡量使用絕對路徑!!!不要用RUN cdWORKDIR/test#如果沒有就自動創建WORKDIRdemo#再進入demo文件夾RUNpwd#打印結果應該是/test/demoADDandCOPYADDhello/#把本地文件添加到鏡像中,吧本地的hello可執行文件拷貝到鏡像的/目錄ADDtest.tar.gz/#添加到根目錄并解壓WORKDIR/rootADDhellotest/#進入/root/添加hello可執行命令到test目錄下,也就是/root/test/hello一個絕對路徑COPYhellotest/#等同于上述ADD效果ADD與COPY-優先使用COPY命令-ADD除了COPY功能還有解壓功能添加遠程文件/目錄使用curl或wgetENV#環境變量,盡可能使用ENV增加可維護性ENVMYSQL_VERSION5.6#設置一個mysql常量RUNyuminstall-ymysql-server=“${MYSQL_VERSION}”
進階知識(了解)
VOLUMEandEXPOSE存儲和網絡RUNandCMDandENTRYPOINTRUN:執行命令并創建新的Image LayerCMD:設置容器啟動后默認執行的命令和參數ENTRYPOINT:設置容器啟動時運行的命令Shell格式和Exec格式RUNyuminstall-yvimCMDecho”hellodocker”ENTRYPOINTecho“hellodocker”Exec格式RUN[“apt-get”,”install”,”-y”,”vim”]CMD[“/bin/echo”,”hellodocker”]ENTRYPOINT[“/bin/echo”,”hellodocker”]通過shell格式去運行命令,會讀取$name指令,而exec格式是僅僅的執行一個命令,而不是shell指令catDockerfileFROMcentosENVnameDockerENTRYPOINT[“/bin/echo”,”hello$name”]#這個僅僅是執行echo命令,讀取不了shell變量ENTRYPOINT[“/bin/bash”,”-c”,”echohello$name"]CMD容器啟動時默認執行的命令如果dockerrun指定了其他命令(dockerrun-it[image]/bin/bash),CMD命令被忽略如果定義多個CMD,只有最后一個執行ENTRYPOINT讓容器以應用程序或服務形式運行不會被忽略,一定會執行最佳實踐:寫一個shell腳本作為entrypointCOPYdocker-entrypoint.sh/usr/local/binENTRYPOINT[“docker-entrypoint.sh]EXPOSE27017CMD[“mongod”][root@masterhome]#moreDockerfileFROmcentosENVnameDocker#CMD["/bin/bash","-c","echohello$name"]ENTRYPOINT["/bin/bash","-c","echohello$name”]
5、發布到倉庫
5.1 docker hub共有鏡像發布
docker提供了一個類似于github的倉庫docker hub,官方網站(需注冊使用)
https://hub.docker.com/
#注冊dockerid后,在linux中登錄dockerhubdockerlogin#注意要保證image的tag是賬戶名,如果鏡像名字不對,需要改一下tagdockertagchaoyu/centos-vimpeng104/centos-vim# 語法是:docker tag 倉庫名 peng104/倉庫名#推送dockerimage到dockerhubdockerpushpeng104/centps-cmd-exec:latest#去dockerhub中檢查鏡像#先刪除本地鏡像,然后再測試下載pull鏡像文件dockerpullpeng104/centos-entrypoint-exec
5.2 私有倉庫
docker hub 是公開的,其他人也是可以下載,并不安全,因此還可以使用docker registry官方提供的私有倉庫
用法詳解:
https://yeasy.gitbooks.io/docker_practice/repository/registry.html
#1.下載一個docker官方私有倉庫鏡像dockerpullregistry#2.運行一個docker私有容器倉庫dockerrun-d-p5000:5000-v/opt/data/registry:/var/lib/registryregistry-d后臺運行-p端口映射宿主機的5000:容器內的5000-v數據卷掛載宿主機的/opt/data/registry:/var/lib/registryregistry鏡像名/var/lib/registry存放私有倉庫位置# Docker 默認不允許非 HTTPS 方式推送鏡像。我們可以通過 Docker 的配置選項來取消這個限制#3.修改docker的配置文件,讓他支持http方式,上傳私有鏡像vim/etc/docker/daemon.json#寫入如下內容
{"registry-mirrors":["http://f1361db2.m.daocloud.io"],"insecure-registries":["192.168.11.37:5000"]}#4.修改docker的服務配置文件vim/lib/systemd/system/docker.service#找到[service]這一代碼區域塊,寫入如下參數[Service]EnvironmentFile=-/etc/docker/daemon.json#5.重新加載docker服務systemctldaemon-reload#6.重啟docker服務systemctlrestartdocker#注意:重啟docker服務,所有的容器都會掛掉#7.修改本地鏡像的tag標記,往自己的私有倉庫推送dockertagdocker.io/peng104/hello-world-docker192.168.11.37:5000/peng-hello#瀏覽器訪問http://192.168.119.10:5000/v2/_catalog查看倉庫#8.下載私有倉庫的鏡像dockerpull192.168.11.37:5000/peng-hello
6、實例演示
編寫dockerfile,構建自己的鏡像,運行flask程序。
確保app.py和dockerfile在同一個目錄!
#1.準備好app.py的flask程序[root@localhost~]#catapp.pyfromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello():return"hellodocker"if__name__=="__main__":app.run(host='0.0.0.0',port=8080)[root@masterhome]#lsapp.pyDockerfile#2.編寫dockerfile[root@localhost~]#catDockerfileFROMpython:2.7LABELmaintainer="溫而新"RUNpipinstallflaskCOPYapp.py/app/WORKDIR/appEXPOSE8080CMD["python","app.py"]#3.構建鏡像image,找到當前目錄的Dockerfile,開始構建dockerbuild-tpeng104/flask-hello-docker.#4.查看創建好的imagesdockerimagels#5.啟動此flask-hello-docker容器,映射一個端口供外部訪問dockerrun-d-p8080:8080peng104/flask-hello-docker#6.檢查運行的容器dockercontainerls#7.推送這個鏡像到私有倉庫dockertagpeng104/flask-hello-docker192.168.11.37:5000/peng-flaskwebdockerpush192.168.11.37:5000/peng-flaskweb
-
Linux
+關注
關注
87文章
11232瀏覽量
208949 -
Docker
+關注
關注
0文章
455瀏覽量
11818
原文標題:兩小時入門 Docker
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論