都說docker是運維大神,想了解一下docker在web server運營上都有哪些用武之地?
docker的思想來自於集裝箱,集裝箱解決了什麼問題?在一艘大船上,可以把貨物板正的擺放起來。並且各種各樣的貨物被集裝箱標準化了。集裝箱和集裝箱之間不會互相影響。那麼我就不需要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱里封裝的好好的,那我就可以用一艘大船把他們都運走。
docker就是類似的理念。現在都流行雲計算了,雲計算就好比大貨輪。docker就是集裝箱。
1.不同的應用程序可能會有不同的應用環境,比如.net開發的網站和php開發的網站依賴的軟體就不一樣,如果把他們依賴的軟體都安裝在一個伺服器上就要調試很久,而且很麻煩,還會造成一些衝突。比如IIS和Apache訪問埠衝突。這個時候你就要隔離.net開發的網站和php開發的網站。常規來講,我們可以在伺服器上創建不同的虛擬機在不同的虛擬機上放置不同的應用,但是虛擬機開銷比較高。docker可以實現虛擬機隔離應用環境的功能,並且開銷比虛擬機小,小就意味著省錢了。
2.你開發軟體的時候用的是Ubuntu,但是運維管理的都是centos,運維在把你的軟體從開發環境轉移到生產環境的時候就會遇到一些Ubuntu轉centos的問題,比如:有個特殊版本的資料庫,只有Ubuntu支持,centos不支持,在轉移的過程當中運維就得想辦法解決這樣的問題。這時候要是有docker你就可以把開發環境直接封裝轉移給運維,運維直接部署你給他的docker就可以了。而且部署速度快。
3.在伺服器負載方面,如果你單獨開一個虛擬機,那麼虛擬機會佔用空閑內存的,docker部署的話,這些內存就會利用起來。
做過開發的人對開發環境的安裝、配置應該都不會太陌生,不管你做什麼開發,對開發環境都會具有一定的依賴性的。對於 PHP 的 Web 開發來說,開發環境至少要有一個 Web 伺服器(如 Apache、Nginx)、一個資料庫伺服器(如 MySQL)和一個 PHP 解析器吧,如果你的 PHP 代碼使用的一些擴展,那你還需要給你的 PHP 安裝上這些擴展,那樣你的 PHP 代碼才能夠順利地跑起來。對於一個只想靜靜地敲代碼的開發人員來說,開發環境的安裝與配置這種事情,只要經歷一次就已經很折騰人了。可是,事情往往不能按人們的意願進行的,你保不準會重裝下系統,也保不準會換一個新的環境。總之就是,你會偶爾需要重新安裝配置你的的開發環境!
你可以回想一下,上一次安裝配置你的開發環境花費了多少時間,你所需要的 PHP 擴展是不是到運行時報錯了才記起來沒安裝的呢?還好,自從有了 Docker 之後,媽媽再也不用擔心我的開發環境的問題了。使用 Docker ,開發環境只需要安裝配置一次,之後搭建相同的開發環境很簡單,只需要一條命令即可完成!
這就是本文的目的,介紹 Docker 下安裝配置 Web 的服務環境,實現一次安裝配置,多次重用、跨平台重用的功能。
Docker 概述
Docker 是什麼?可以將 Docker 理解為打包環境的容器,它可以將環境打包成鏡像,在需要的時候,再基於該鏡像來創建容器,這樣所需要的環境就回來了。剛剛提到了 Docker 的兩大核心概念,鏡像和容器。
Docker鏡像是為了滿足特殊用途而按照Docker的規則製作的應用,有點兒類似於Win-dows裡面的安裝軟體包。容器都是基於鏡像而創建的,基於一個鏡像可以創建若干個名字不同但功能相同的容器。鏡像是靜態的,容器是動態的。
除了鏡像和容器之外,還有兩個概念需要了解一下的,那就是倉庫和 docker-compose。Docker 倉庫是存放鏡像的地方,我們可以從 Docker 倉庫中拉取鏡像到本地,然後再基於鏡像創建容器。docker-compose 是管理容器的。Docker 的思想是一個容器只做一件事情,一個開發環境中可能會使用到多個容器,比如 Web 服務環境會使用到 PHP 、Nginx、MySQL 等等。那麼一個 Web 服務環境就需要有三個容器,並且這些容器之間是存在依賴關係的,Nginx 依賴 PHP,PHP 依賴 MySQL。有了 docker-compose 就可以很好地管理這些容器了,它可以根據容器之間的依賴關係來決定每個容器的啟動順序和關閉順序,可以管理各容器與宿主機器之間的埠映射關係,也可以配置容器與宿主機器之間的數據共享策略等等。
國內的鏡像倉庫
由於地理位置的原因,國內訪問 Docker 的官方倉庫是比較慢的,所以在這裡介紹一個國內的 Docker 倉庫:靈雀雲。靈雀雲鏡像倉庫中彙集了大量來自社區的優質作品,讓用戶組合、復用容器化微服務,輕鬆搭建新一代雲端應用。
搭建 Web 服務環境
本文的重點是使用 Docker 搭建一套 Web 服務環境,如果在你的環境中還沒有安裝 Docker,可以參考這裡自行安裝。
安裝了 Docker 之後,搭建 Web 服務環境就很簡單了,只需要一個文件,一條命令即可!
一個文件: docker-compose.yml
nginx:
image: index.alauda.cn/library/nginx
links:
- phpfpm
ports:
- "80:80"
- "443:443"
volumes:
- /Users/chenishr/www:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/nginx.conf
- ./nginx.d:/etc/nginx/conf.d
mysql:
image: index.alauda.cn/library/mysql
environment:
MYSQL_ROOT_PASSWORD: qazasdedc123
ports:
- "3306:3306"
phpfpm:
image: index.alauda.cn/library/php:7.0-fpm
links:
- mysql
volumes:
- /Users/chenishr/www:/var/www/html
ports:
- "9000:9000"
上面的文件內容很簡單,它定義了三個容器,分別是 nginx、mysql 和 phpfpm 。每個容器定義里包含了一些信息,這裡簡單介紹一下。
image:這個欄位表示該容器是基於那個鏡像來創建的
links:表示在該容器內部需要訪問那個其它的容器,該名字在容器內部的表現類似於域名,它會綁 定對應容器的 IP
ports:將容器內部的埠映射到宿主機器中
volumes:配置容器與宿主機器的共享文件或者目錄
一條命令
有了上面的 docker-compose.yml 文件之後,只需要一條命令即可啟動所有的容器,也就是搭建好了整個 Web 服務環境了!
docker-compose up -d
最後
有了 Docker 之後,搭建環境從未有過如此簡單。
本文只是介紹了 Docker 的最基本的應用而已,它還很多用途而不僅限於本文。
舉個最簡單的例子,你想搭建個wordpress,那麼只需在伺服器端運行一條命令
docker run -d -p 80:80 tutum/wordpress
然後你的wordpress就跑起來了
原來只要2個運維工程師2個月搭建的持續集成就能解決的問題,現在要付每年好幾萬美金不說,還打亂原有部署。在國內吹得響,無非是不用付license fee一群小朋友在玩而已。
省搭建環境的時間,能省多少錢?兩個manday?
已經擁有3年+的Docker的使用經驗,在使用過程遇到過各種問題。以下回答,如果能幫您解釋清楚了,就順便幫忙點個贊吧!
一、運維工作中經常遇到的問題:
1. 硬體資源利用率的問題,造成部分成本的浪費
在網站功能中不同的業務場景有計算型的,有IO讀寫型的,有網路型,有內存型的,集中部署應用就會導致資源利用率不合理的問題。比如,一個機器上部署的服務都是內存密集型,那麼CPU資源就都很容易浪費了。
2. 單物理機多應用無法對無法進行有效的隔離,導致應用對資源的搶佔和相互影響
一個物理機器跑多個應用,無法進行所使用的CPU,內存,進程進行限制,如果一個應用出現對資源的搶佔問題,就會引起連鎖反應,最終導致網站部分功能不可用。
3. 環境、版本管理複雜,上線部署流程缺乏,增加問題排查的複雜度
由於內部開發流程的不規範,代碼在測試或者上線過程中,對一些配置項和系統參數進行隨意的調整,在發布時進行增量發布,一旦出現問題,就會導致測試的代碼和線上運行的代碼是不一致的,增加了服務上線的風險,也增加了線上服務故障排查的難度。
4. 環境不穩定,遷移成本高,增加上線風險
在開發過程中存在多個項目並行開發和服務的依賴問題,由於環境和版本的複雜性很高,不能快速搭建和遷移一個環境,導致無法在測試環境中無法模擬出線上的流程進行測試,很多同學在線上環境進行測試,這裡有很高的潛在風險,同時導致開發效率降低。
5. 傳統虛擬機和物理機佔用空間大,啟動慢,管理複雜等問題
傳統虛擬機和物理機在啟動過程進行載入內核,執行內核和init進行,導致在啟動過程佔用很長時間,而且在管理過程中會遇到各種各樣的管理問題。
二、Docker的工作原理和機制,看下圖形象的示例:
二、運維工作中Docker與常用的集成工具有哪些?
- 配置管理(anisble,saltstack,jumperserver)
- 持續集成和持續部署(Jenkins,git,gitlab)
- 服務編排(k8s,swarm,mesos,rancher)
- 網路模型(host,bridge,Flannel,Calico)
- Docker倉庫(Registry,Habor)
- 服務註冊(etcd)
- 服務發現(confd)
- 日誌平台(ELK, loghub)
- 監控平台(zabbix,cadvisor,prometheus,grafana)
- 開發工具(shell,python)
三、如何建立起合適自己工作的Docker容器平台?
一套完整的方案可以看這裡:基於Docker持續交付平台建設的實踐
會了docker,不一定是運維大神,不會docker,不一定是運維菜鳥,說這話的人,一般都是不知道運維為何物的人。
開發的時候 docker image裡面安裝好了node和需要的npm包 code是掛載本地目錄
一個feature開發完成 會把code打包進image交給測試 測試好之後 他們會deploy到產品環境
我們以前是用rpm和jenkins 現在太簡單了 ops覺得自己沒啥事情幹了docker運維之神
5秒部署1個 web server 就是 docker
docker不只是運維大神,docker對研發、測試、運維各環節全都有影響,未來會不會影響到產品環節目前還不可知......
在看完官方 tutorial 掃過 reference 並且自己上手實踐過幾次之前,不要看那些「XX 是大神 XX 是垃圾」的廢話。別人的評價在沒有對應的經歷之前都是廢話。
感覺是做開發和測試的時候方便。
可能做分散式系統擴容時也比較方便(比如雙十一的時候)。
但是真正的生產環境實戰,我不清楚操作會不會666,手動 @阿里雲( @阿里云云棲社區 @阿里雲大學 ) @騰訊雲技術社區 兩個大佬。
絕大多數人需要的只是一個打包方案,本來很簡單的事情,早幾年都有成熟方案,現在被忽悠上docker,有docker不成啊,不夠高大上,還要有網路、存儲、容器監控乃至非常火的容器編排。。
典型的,木匠想要一個鎚子,最後搞出了一個機械廠。。不是說機械廠不需要,問題是,這tm干你木匠屁事,不過是木匠沖了KPI罷了。docker可以理解為超輕量級的虛擬機。
大概就是你機器很多的時候,你需要批量部署,又被各種機器、各種環境依賴弄的很煩(比如某個c庫的版本不兼容,兩台機器的c庫版本不一樣一台可以跑你的新程序,一台不可以之類的玄學問題)。。。
然後用docker,把所有的依賴打到包裡面去。然後每一台機器基本都能跑了。。兩個docker之間的自己的依賴還不互相影響。
損失少部分性能,還有如果自己docker寫的比較糙,把各種不必要的東西都給打進去的話,包會很大,網路傳輸和空間都會有較大損耗。
還有多了一層docker,你的操作會變麻煩,從包內到包外,怎麼cp一個文件。埠映射怎麼回事?
凡事都是一個權衡,沒有啥萬能葯。。。
也不能說會docker 就是大神了,它畢竟只是一個工具,過段時間仍然會被新東西取代,我用docker集群跑公司業務也算挺久了,它也確實方便,但這不就是發展的本質么,好東西都需要掌握開發能力,因為這是創造,而不是使用。
1.管理環境依賴;
2.服務伸縮擴展;
3.相比虛擬機在性能上的優勢。
接觸時間不是很長,離production還有一段時間。
web server是一個接觸Docker起步最早的點,後續會發現很多東西都可以用Docker管理
docker在linux上已經是神了,但是在虛擬圖形界面上還不行,另外對mac不支持,要靠虛擬機再來一遍
docker是提供一個類似「虛擬機」的隔離環境吧。通過docker,可以在同一台伺服器上安裝N個不同獨立的web app。
docker我認為最大優勢就是統一環境入口,如果說手機是移動互聯入口,網頁是互聯網入口,那麼docker可以說是服務互聯網入口。
推薦閱讀: