轉自:https://www.cnblogs.com/neptunemoon/p/6512121.html
我們都聽過或者用過 docker灼狰,然而使用方式卻是僅僅用手動的方式,這樣去操作 docker 還是很原始浮禾。 好吧交胚,可能在小白的眼中噼里啪啦的對著 term 一頓操作會很拉風,但是高手很不屑盈电!在高手眼里…too young, too low. 因為高手都是自動化的蝴簇,今天就稍微介紹下自動化工具,也就是大殺器 docker-compose
????????????好了匆帚, 我們進化到熬词,快速1.0 時代
????????????于是, 我們又進化了吸重, 快速2.0時代
????????????于是互拾,我們再次加入光榮的進化, 快速3.0時代
先從 docker 說起
我知道可能有些看到這篇文章的朋友沒有了解或者使用過 docker,那我就在這里做一個小小的介紹嫉晶,已經(jīng)有過了解的朋友請直接從docker-compose部分看起.
docker 簡介
想要理解 docker 是啥骑疆,就要先說說 docker 可以解決啥
一句話來說
docker 是一種容器技術田篇,作用是用來快速部署服務
為什么說 docker 是快速部署
我們做一個項目,最不想面對的不是開發(fā)箍铭,也不是調試斯辰,而是部署!F绿邸1蛏搿!
比如你這個機器上的環(huán)境是 python3 你用另一個機器上卻是 python2 或者壓根就沒有 python 環(huán)境柄瑰。
好了闸氮,這個時候你怎么解決呢。 對教沾,只要去新機器上你就要部署 python蒲跨。
嗯~ 好吧, 部署 python 就 python授翻,但是你的項目里面還要用到 MySQL或悲,好的沒問題, 你又要去用 pip 去安裝 python 的 mysql 模塊堪唐。 哦對了巡语, 我記我們的項目里面還有 redis, 兩種非對稱加密淮菠,還有三方隊列男公, 哦, 還有阿里云的接口合陵,對對對對對對哦枢赔。 亂七八糟的東西真的好多,搞完了幾個小時沒有了拥知,遇到網(wǎng)絡卡了踏拜,那就更沒有譜了。
好了低剔, 我們進化到速梗,快速1.0 時代
我們把要安裝的東西全都放進離線安裝包里面,再寫個 bash 腳本
對户侥,這種事情真的有過镀琉。 部署全靠一個 bash 腳本,畢竟不用手動了么蕊唐。 可是就是苦了寫腳本的人屋摔,我就寫過一個腳本寫了好久。
于是替梨, 我們又進化了钓试, 快速2.0時代
我們把整個系統(tǒng)做成了鏡像装黑,存在了光盤里面,每當要架設的時候趕快用鏡像做出一個新的系統(tǒng)弓熏!
可能經(jīng)歷過的自然會懂恋谭,還特么要做鏡像啊,離機房遠咋辦巴炀稀>渭铡!我們做游戲信认,開服快材义,更新更快!我們版本更新過快怎么辦凹奚汀F涞唷!我們還要刻刻刻么潦蝇? 我們的 tornado 又更新了款熬,我去,我們客戶端的 protobuf 也更新了攘乒,可是我們有100臺服務器啊贤牛,為了這一點小小的東西更新么?西八持灰!
于是盔夜,我們再次加入光榮的進化负饲, 快速3.0時代
我們把服務裝進了 docker 中
我們把做好的鏡像堤魁,一個命令 pull 了下來,嗯返十,蠻快又一個命令?docker start XXXXXX?服務起來了妥泉。哦,你說多服務洞坑?好吧那就寫個docker-compose.file吧盲链。 嗯哼? 你說集群部署 來來來迟杂, 有Kubernetes刽沾、Mesos,F(xiàn)leet和Swarm 任君挑選排拷,不好用不要錢侧漓。
docker 是部署的最佳輔助,即使你爛成渣渣监氢,docker 也可以扶你上王者布蔗。
docker 安裝
很簡單?docker官網(wǎng)
Get docker 之后藤违, 有圖型系統(tǒng)(windows 之類)的有下一步,下一步纵揍。 有 term 接口的顿乒。 有?apt-get?之類的軟件管理。
安裝非常簡單泽谨,不值得一說璧榄。
docker 的一些概念
鏡像
對!就和我上面說的使用光盤拷貝已經(jīng)有的鏡像一樣吧雹,我們的鏡像是指一個系統(tǒng)的鏡像
我們的鏡像都是基于 linux 的準確來說是基于 ubuntu 的犹菱。?
docker 鏡像可以理解為,你在 win 下用ghost 拷貝出來的磁盤鏡像吮炕。不過他是 linux 版的腊脱。
性能損耗
得益于現(xiàn)在的 linux 內(nèi)核的 namespace, 我們可以擁有各種直達內(nèi)耗的容器可以用龙亲,你在 docker 中的進程其實進程就是直接的宿主機進程陕凹,這一切都在系統(tǒng)啟動 clone 函數(shù)的時候就決定了, 所以談不上性能損耗鳄炉。
容器
容器本身就是我們最重要的概念杜耙,我們使用 docker 要做的就是容器這個東西。
簡單來說容器是一個鏡像的實例
更通俗來說容器就像你用 vm 或者 virtualbox 使用鏡像創(chuàng)建的一個虛擬機實例
hub
就是鏡像倉庫拂盯。
如果你寫代碼佑女,你肯定就知道 github,我們把代碼托管到 github 之上谈竿。
如果我們部署团驱,我肯定就要用 dockerhub, 我們把鏡像托管到?docker hub?上(當然我們也可以假設空凸,或者是用別人假設的hub)
國內(nèi)有很多三方 dockerhub 服務器嚎花, 有阿里云,網(wǎng)易蜂巢呀洲,有容云紊选,daocloud 等等等等
至于國外那就更多了,如果非要推薦一家道逗,那就是 amazon 了兵罢,畢竟云服務他們家宇宙最強,沒有之一滓窍,沒有對手卖词。
docker 簡單使用
搜索鏡像
docker search xxx
比如我要架設一個 wordpress,我直接就用
docker search wordpress
第一列就是你可以選擇使用的鏡像贰您,你當然可以自己制作鏡像坏平,而且很容易拢操,但是如果我們?nèi)腴T的話就直接用別人做好的吧。
下載鏡像
我直接用第一個吧
git pull wordpress
這個是在下載鏡像的過程中
下載完成
helloworld
程序員的老慣例了
這句其實就相當于你的鏡像
做到 helloworld 了你就算是入門了舶替。哈哈哈令境。
推薦一個寫很有層次感的入門docker入門教程
我常用的 docker 命令
你可以使用幫助看一個命令的大概
登錄
登錄你自己的 dockerhub 賬戶,要去注冊哦
docker login
查看容器
查看你已經(jīng)下載好的鏡像
docker images
查找鏡像
docker search XX
下載鏡像
docker pull xx
刪除鏡像
docker rmi xx
開始
docker run 你的鏡像
看日志
docker logs 你的容器
停止一個容器示例
docker stop 你的容器
查看容器狀態(tài)
docker stats 你的容器
格式
基本上都是這個格式 顾瞪,根據(jù)上面寫好的注釋舔庶,很容易去使用
更快更好更強
????使用 dockerfile
????使用 crontab
????使用 supervisr
略, 這個要扯起來就太長了
docker-compose 簡介
一句話
docker-compose 是用來做docker 的多容器控制
docker-compose 是什么
docker-compose 是一個用來把 docker 自動化的東西陈醒。
有了 docker-compose 你可以把所有繁復的 docker 操作全都一條命令惕橙,自動化的完成。
為什么要用 docker-compose钉跷,他解決了什么
用通俗的語言來說弥鹦,我們平時操作 docker 還是很原始的一系列動作,你手動使用 docker 的動作可以拆分成
找到一個系統(tǒng)鏡像 // docker search
安裝好 vm 或者 virtual box // apt-get install docker
在 vm 中安裝鏡像 // docker run -d -it 你的鏡像
略..
這是最小的動作爷辙, 如果你要映射硬盤彬坏,設置nat網(wǎng)絡或者橋接網(wǎng)絡,等等…你就要做更多的 docker 操作膝晾, 這顯然是非常沒有效率的栓始。
但是我們寫在 docker-compose.file 里面就很好了。 你只需要寫好后 只運行一句
docker-compose up -d
一切都是那么的簡單
那么哪里可以買到呢血当?
你要你能上網(wǎng)幻赚,到處都可以得到他。
我自己的機器上有 python&pip 的環(huán)境臊旭,所以我的安裝非常簡單
先確定你是不是安裝了 docker
沒有安裝請看上面的文章
我的環(huán)境是
linux-ubuntu:python2:pip
所以我的安裝
pip install docker-compose
如此簡單
從一個小例開始
先安裝吧
如果你和我的環(huán)境相同落恼,請直接看我的 docker-compose 安裝
如果是別的話,別擔心巍扛,這里有
helloworld
服務更新
軟升級
還比如
你的 nginx 更新了配置文件之后
docker-compose restart nginx
硬升級
docker-compose stop
升級你的程序
你要重新
docker-compose up
從日志得到需要的信息
直接使用 logs
docker-compose logs nginx
歐 shit 直接給我屏幕刷爆了
使用類似linux tail 命令
我們的 tial 命令一般是什么樣的呢
tail -f xx.file
我們的docker-compose log 卻是這樣
root@ubuntu:~# docker-compose logs -f --tail 10 nginx
最近的10條開始
docker-compose 常用命令
解釋一下
docker-compose 如何配置
先看看我自己寫的一個 docker-compose.yml
version:docker-compose的版本
nginx 和 mariadb领跛,wordpress 是要啟動的三個服務
順序不是重要的,我們看見wordpress中有個?depends_on:?的屬性
depends_on: 依賴
代表wordpress 依賴于
- mariadb- nginx
兩個服務, 所以他們兩個會先啟動
image: 鏡像
就是你的 docker 鏡像
我們用
docker search mariadb
找到我們需要的鏡像
好了撤奸,就是bitnami/mariadb了
如果你看見有的么有 images ,而是一個 build喊括, 那個說明這個不是用鏡像的胧瓜,而是使用 dockerfile 去構建容器。
如果要說 dockerfile 又要花很久了
想了解 dockerfile 可以看這里
environment 環(huán)境變量
這個是在好理解不過的了郑什。
不過這和我們程序語言設計層面的還是不一樣的府喳,這個是容器層面的環(huán)境變量。
如果我們寫程序做一些邏輯判斷的時候只祠,肯定會使用
比如我們判斷現(xiàn)在的編譯器奋早,我們會使用
#if __GNUC__?或者?#if _MSC_VER
相應的,我們的容器里面肯定也有這樣的邏輯砸泛,我們經(jīng)常使用環(huán)境變量來傳值弯蚜,或者定義一個行為孔轴。寫過程序的人都懂。
ports 端口映射
映射本機還有鏡像的端口碎捺。這個沒有什么好說的路鹰。
volumes 文件映射
有兩種格式,
可以對應 docker 操作中的 -v my/path/:/docker/path
還可以使用單方面的 -v /path?
這樣的話 就相當于 一個匿名映射收厨, 其實還是在本機有對應目錄的晋柱。
使用docker inspect -f {{.Volumes}} /path?可以看到詳細信息
相對這個了解更多的?深入理解Docker Volume
docker-compose 需要注意的
我根據(jù)我自己的體驗,給出幾點需要注意的
不要把 docker 當做數(shù)據(jù)容器來使用诵叁,數(shù)據(jù)一定要用 volumes 放在容器外面
不要把 docker-compose 文件暴露給別人雁竞, 因為上面有你的服務器信息
多用 docker-compose 的命令去操作, 不要用 docker 手動命令&docker-compose 去同時操作
寫一個腳本類的東西拧额,自動備份docker 映射出來的數(shù)據(jù)浓领。
不要把所有服務都放在一個 docker 容器里面
針對需求開始部署了
設定一個需求
我假定現(xiàn)在我們的需求是做一個博客系統(tǒng)
我們的第一印象肯定是 wordpress, 沒有比這個更專業(yè)的了势腮, 當然還有很多联贩,我們使用 django 吧
用過 django 的肯定會知道, django 一開始是要構造工程的捎拯。
還有數(shù)據(jù)之類的
我們擬訂一個過程
python 環(huán)境搭建
django 環(huán)境搭建
docker-compose.yml 寫作
django 構建工程
django 數(shù)據(jù)庫設定
開始運行
數(shù)據(jù)庫同步
簡單的單機部署
python 環(huán)境搭建
Dockerfile
ENV PYTHONUNBUFFERED 1
RUN mkdir /root/testdjango/code? ? #都寫上絕對路徑泪幌, 注意不要跟我一樣。
WORKDIR /root/testdjango/code
ADD requirements.txt /root/testdjango/code/
RUN pip install -r requirements.txt
ADD . /root/testdjango/code/
python 的pip 有一個requirements.txt?文件來專門放依賴環(huán)境的
django 環(huán)境搭建
requirements.txt
Djangopsycopg2
docker-compose.yml 寫作
django 構建工程
docker-compose run web django-admin.py startproject docker_composeexample .
django 數(shù)據(jù)庫設定
我們做了 volumes署照, django 的東西在本地有映射祸泪。
做過 django 的人都知道 ,我們的設定都在?settings.py?中
開始運行
docker-compose up
數(shù)據(jù)庫同步
docker-compose run web python manage.py syncdb
集群部署
敬請期待本文的下一篇
參考