introduction
docker是幾年前出來的一個(gè)容器技術(shù)猴誊,我也是在2017年才接觸到這個(gè)東西,一開始用來部署tomcat和mysql服務(wù)装诡,后來做項(xiàng)目和做算法也沒有研究這個(gè)東西≈就海現(xiàn)在由于要在本地搭建深度學(xué)習(xí)服務(wù)器,所以又把docker溫故知新一下倔矾。
本文提到以下內(nèi)容:
- 是什么
- 優(yōu)點(diǎn)
- 大致的原理
- centos安裝
理論內(nèi)容主要(大篇幅)參考以下兩篇文章,已經(jīng)注明出處了蛉幸,所以為了排版方便后面就不加引用符號了破讨。而且加入了自己的一點(diǎn)內(nèi)容。
不過實(shí)際操作還是一把辛酸淚T…T奕纫,各種踩坑
docker就是集裝箱原理:這是大佬的知乎回答提陶,可以去點(diǎn)個(gè)贊啊。
大白話Docker入門
是什么匹层?集裝箱
如果現(xiàn)在有一批水果和化學(xué)用品要運(yùn)送隙笆。我們沒有集裝箱,為了安全起見升筏,只能用一艘船運(yùn)水果撑柔,一艘船運(yùn)化學(xué)用品。動(dòng)力能源就會被拿來維持多個(gè)船體本身航行的需求您访。
但是如果有集裝箱铅忿,就可以把水果和化學(xué)用品分別裝箱,規(guī)整的擺放起來灵汪。集裝箱和集裝箱之間不會互相影響檀训,就不需要專門運(yùn)送水果的船和專門運(yùn)送化學(xué)品的船了柑潦。只要這些貨物在集裝箱里封裝的好好的,那就可以用一艘大船把它們都運(yùn)走峻凫。
虛擬機(jī)是船渗鬼,docker就是集裝箱。
- 不同的應(yīng)用程序可能會有不同的應(yīng)用環(huán)境荧琼,比如.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站依賴的軟件就不一樣譬胎,如果把他們依賴的軟件都安裝在一個(gè)服務(wù)器上就要調(diào)試很久,而且很麻煩命锄,還會造成一些沖突堰乔。比如IIS和Apache訪問端口沖突。這個(gè)時(shí)候你就要隔離.net開發(fā)的網(wǎng)站和php開發(fā)的網(wǎng)站脐恩。常規(guī)來講浩考,我們可以在服務(wù)器上創(chuàng)建不同的虛擬機(jī)在不同的虛擬機(jī)上放置不同的應(yīng)用,但是虛擬機(jī)開銷比較高被盈。docker可以實(shí)現(xiàn)虛擬機(jī)隔離應(yīng)用環(huán)境的功能,并且開銷比虛擬機(jī)小搭伤,小就意味著省錢了只怎。
- 你開發(fā)軟件的時(shí)候用的是Ubuntu,但是運(yùn)維管理的都是centos怜俐,運(yùn)維在把你的軟件從開發(fā)環(huán)境轉(zhuǎn)移到生產(chǎn)環(huán)境的時(shí)候就會遇到一些Ubuntu轉(zhuǎn)centos的問題身堡,比如:有個(gè)特殊版本的數(shù)據(jù)庫,只有Ubuntu支持拍鲤,centos不支持贴谎,在轉(zhuǎn)移的過程當(dāng)中運(yùn)維就得想辦法解決這樣的問題。這時(shí)候要是有docker你就可以把開發(fā)環(huán)境直接封裝轉(zhuǎn)移給運(yùn)維季稳,運(yùn)維直接部署你給他的docker就可以了擅这。而且部署速度快。
- 在服務(wù)器負(fù)載方面景鼠,如果你單獨(dú)開一個(gè)虛擬機(jī)仲翎,那么虛擬機(jī)會占用空閑內(nèi)存的,docker部署的話铛漓,這些內(nèi)存就會利用起來溯香。
優(yōu)點(diǎn)
- docker image的體積非常的小。一個(gè)完整功能的ubuntu才100多mb浓恶。docker image如此小的體積玫坛,讓我們可以方便的在網(wǎng)絡(luò)上傳輸和分享,對于公司來說就提供了對大量image的管理和分發(fā)的可能包晰。
- docker的系統(tǒng)啟動(dòng)的耗時(shí)為0湿镀。docker run hello-world的命令是瞬間完成的炕吸,感覺不到加載image,啟動(dòng)系統(tǒng)的耗時(shí)肠骆,命令完成就直接輸出了結(jié)果算途。程序執(zhí)行完后container也跟著關(guān)閉,也并沒有保存鏡像的時(shí)間蚀腿,但下次再運(yùn)行還是會保留你處理過的狀態(tài)嘴瓤。
在后面tensorflow使用,這個(gè)感覺是尤為突出莉钙。在windows上廓脆,拿pycharm運(yùn)行,從按下ctrl+shift+f10到真正開始運(yùn)行的時(shí)間磁玉,可能和docker run tensorflow的時(shí)間是差不多的停忿。 - docker系統(tǒng)占用資源極少。如果我們開啟一個(gè)vm的系統(tǒng)蚊伞,不論是linux的或者windows席赂,就算什么程序都不運(yùn)行都會占用一部分內(nèi)存。但是docker container啟動(dòng)后如果不運(yùn)行程序时迫,你是看不到系統(tǒng)資源被占用的颅停。
如何做到的
- 先思考一下,一臺服務(wù)器給我們開發(fā)的項(xiàng)目提供了什么掠拳?
cpu癞揉、內(nèi)存、硬盤溺欧、網(wǎng)絡(luò)喊熟、操作系統(tǒng)、工具軟件、運(yùn)行環(huán)境 等。擁有了這些資源座哩,就可以運(yùn)行一個(gè)程序。 - VM技術(shù)可以在一臺server上部署多臺虛擬機(jī)胳泉,提高了物力資源的重用性和設(shè)備管理的方便性。
那么VM是怎么做到的呢岩遗?Hypervisor扇商。VM在物理機(jī)器的操作系統(tǒng)上建立了一個(gè)中間軟件層Hypervisor,Hypervisor利用物理機(jī)器的資源宿礁,虛擬出多個(gè)虛擬的硬件環(huán)境案铺,這些硬件環(huán)境可以共享宿主機(jī)的資源。這些新的虛擬硬件環(huán)境梆靖,安裝操作系統(tǒng)和相應(yīng)的軟件后便形成了一臺臺虛擬機(jī)控汉。 - 那么Docker有什么不同呢笔诵?Docker很聰明的利用linux的一些技術(shù)走了一條捷徑。Docker選擇了和虛擬化完全不同的思路姑子,并不去虛擬化任何硬件乎婿,而是對硬件資源在不同的docker container之間做了“隔離”。隔離使每個(gè)container擁有了不同的環(huán)境(硬盤空間街佑、網(wǎng)絡(luò)谢翎、系統(tǒng)的工具包),并且又可以共享需要的硬件資源(cpu沐旨、內(nèi)存森逮、系統(tǒng)內(nèi)核),表面上達(dá)到了虛擬機(jī)的功能磁携。
VM container對比
Docker使用的Linux核心的組建如下:(截取自Docker的元件– Linux核心部分) - AUFS(chroot) – 用來建立不同的操作系統(tǒng)和隔離運(yùn)行時(shí)的硬盤空間
- Namespace – 用來隔離Container的執(zhí)行空間
- Cgroup – 分配不同的硬件資源
- SELinux – 用來保護(hù)linux的網(wǎng)絡(luò)安全
- Netlink – 用來讓不同的Container之間的進(jìn)程保持通信
- Netfilter – 建立Container埠為基礎(chǔ)的網(wǎng)路防火牆封包過濾
- AppArmor – 保護(hù)Container的網(wǎng)路及執(zhí)行安全
- Linux Bridge – 讓不同Container或不同主機(jī)上的Container能溝通
- ……
這里面的每一項(xiàng)技術(shù)都值得我們?nèi)ド钊胙芯堪唷5侨说木κ怯邢薜模芏嗲闆r下只能關(guān)心到目前最需要用的那些東西谊迄。所以原理性的問題就不贅述了闷供。
centos下安裝docker-ce
這一部分參考了網(wǎng)上的諸多資料(包括官方教程、網(wǎng)友博客统诺,由于數(shù)量確實(shí)很多这吻,實(shí)際操作的問題也很雜亂,所以無法擺出全部的參考文獻(xiàn))篙议,主要還是參考官方教程吧。
https://docs.docker-cn.com/
https://docs.docker.com/
http://www.docker.org.cn/book/
大大小小遇到了一些坑怠硼。這里就把我成功的安裝的流程擺出來鬼贱,供大家參考。
我這里主要是為了拿docker搭建python3的TensorFlow深度學(xué)習(xí)平臺香璃。雖然后期使用不一樣这难,但是前期安裝都是差不多的。
為什么是centos葡秒?因?yàn)檠bnvidia驅(qū)動(dòng)的時(shí)候踩了更多的坑姻乓。可能是一些系統(tǒng)版本眯牧、網(wǎng)絡(luò)蹋岩、本人操作太蠢 等各方面問題,在用ubuntu系統(tǒng)裝的時(shí)候学少,nvidia+cuda+cudnn的一套系統(tǒng)總是裝不上剪个,所以對ubuntu失去信心。T T
下面關(guān)于安裝的命令版确,直接復(fù)制運(yùn)行就可以了扣囊。
- 刪除老版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-ce \
docker-engine
- 查看內(nèi)核版本(需要大于3.10)
uname -r
- 設(shè)置倉庫
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager --enable docker-ce-edge
sudo yum-config-manager --enable docker-ce-test
- 正式安裝部分乎折。這里要注意了。
如果你使用docker不涉及到nvidia or gpu or deep learning侵歇,就直接執(zhí)行以下命令安裝最新版本骂澄。
sudo yum -y install docker-ce
由于docker是在nvidia驅(qū)動(dòng)之上運(yùn)行,即docker-nvidia是依賴了nvdia驅(qū)動(dòng)本身惕虑,所以對其版本有一定的要求坟冲。
假如你之前安裝的nvidia和之后安裝的docker需要的版本不同,在運(yùn)行TensorFlow-gpu的時(shí)候就會報(bào)錯(cuò)枷遂。
指定版本安裝:
# 查看版本
yum list docker-ce --showduplicates | sort –r
# 安裝指定版本 sudo yum -y install docker-ce-17.12.0.ce
sudo yum -y install docker-ce-18.09.5-3.el7
-
如果安裝成功
啟動(dòng)docker服務(wù):sudo service docker start
測試是否能用:sudo docker run hello-world
能輸出下圖就成功安裝了樱衷。如果是沒成功pull鏡像,就參考其他中的鏡像源配置酒唉。
docker成功安裝 卸載
卸載 Docker 軟件包:sudo yum remove docker-ce
主機(jī)上的鏡像矩桂、容器、存儲卷痪伦、或定制配置文件不會自動(dòng)刪除侄榴。如需刪除所有鏡像、容器和存儲卷网沾,請運(yùn)行下列命令:sudo rm -rf /var/lib/docker
必須手動(dòng)刪除任何已編輯的配置文件癞蚕。
其他
- 鏡像源配置
- 初始狀態(tài)下,docker的鏡像包都是從外國的服務(wù)器拉辉哥,所以速度慢的令人發(fā)指桦山。和大多數(shù)linux上的加速下載玩法一樣,docker也可以配置鏡像源醋旦。直接一步操作恒水。
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s mirror_address
-
執(zhí)行了之后,你會發(fā)現(xiàn)饲齐,上面的命令是不會正確運(yùn)行的钉凌。即使運(yùn)行了,也沒有成功配置鏡像源捂人。
上面的mirror_address要改成你自己的鏡像源地址御雕。那么問題來了,你哪里有鏡像源滥搭?兩個(gè)地方有:daocloud and 阿里云
daocloud中酸纲,注冊,登錄瑟匆,點(diǎn)開個(gè)人面板福青,右上角有個(gè)小火箭,點(diǎn)開,新打開的頁面往下拉无午,下面就有你的地址了媒役。
image.png
阿里云中,注冊宪迟,登錄酣衷,點(diǎn)開個(gè)人面板,左上角搜索次泽,“容器鏡像服務(wù)”(隨時(shí)間可能這個(gè)內(nèi)容會變穿仪,但是搜 容器 鏡像等字眼應(yīng)該可以搜出來。)點(diǎn)出來之后意荤,右邊主面板就有你的地址了啊片。
image.png 正常的鏡像源配置到這里就結(jié)束了。但是玖像。紫谷。。
如果linux的curl用不了or無法聯(lián)網(wǎng)捐寥,上面的命令是沒法運(yùn)行的笤昨。采取以下辦法。
先在windows上握恳,下載剛剛的sh文件
然后用scp傳去linux上瞒窒,給這個(gè)文件加運(yùn)行權(quán)限,然后使用如下命令運(yùn)行乡洼。
sudo ./set_mirror.sh –s mirror_address
其實(shí)也可以手動(dòng)改崇裁,vi /etc/docker/daemon.json
改成下面這個(gè),以上以下所有mirror_address都是私人的地址束昵,都要替換成自己的拔稳。
{"registry-mirrors": ["mirror_address"]}
還有另一個(gè)docker網(wǎng)絡(luò)的配置文件是這個(gè)vi /etc/sysconfig/docker
,一般不需要?jiǎng)印?/p>
- 配置完了之后要重啟
systemctl daemon-reload
systemctl restart docker
再重新試一下拉取鏡像妻怎,能成功拉取就代表配置成功。不然就把別的鏡像地址也試一下泞歉,或者把daocloud和阿里云都試試逼侦,選快的那個(gè)。
這里總是會有一些其他的坑的腰耙,如果遇到一些本地鏡像搭建榛丢、docker代理配置的問題。推薦用搜索引擎查下面的這幾個(gè)命令挺庞,會有相關(guān)的內(nèi)容出來晰赞。
systemctl show --property=Environment docker
mkdir /etc/systemd/system/docker.service.d
vi /etc/systemd/system/docker.service.d/http-proxy.conf
- 調(diào)整用戶權(quán)限,使得不用每次都加sudo運(yùn)行docker命令
創(chuàng)建docker用戶組sudo groupadd docker
添加用戶至docker組sudo usermod -aG docker $USER
更新用戶組newgrp docker
重啟docker,注銷用戶掖鱼,重登用戶然走。看能否直接運(yùn)行docker run hello-world
- 設(shè)置開機(jī)啟動(dòng)
sudo systemctl enable docker