大家好,我是前端dog君躲庄,一名95后前端小兵查剖。2019年畢業(yè)于北京化工大學(xué),天津人噪窘,不知道有校友和老鄉(xiāng)嘛笋庄?對前端的熱愛,讓我們在此相聚倔监,希望這篇文章直砂,能幫助到您,也同時希望能交到志同道合的小伙伴丐枉,共同發(fā)展,一起進步掘托。我的微信號dm120225瘦锹,備注簡書,期待您的光臨。
大家注意弯院,這是一篇寫給前端的docker簡明教程辱士,亦可以說是dog君對最近對docker的簡單總結(jié)。談到的是一些基礎(chǔ)內(nèi)容听绳,不涉及docker的一些高級用法或k8s容器編排等技術(shù)颂碘,旨在前端開發(fā)工程師擴展知識面,為全棧開發(fā)打好基礎(chǔ)椅挣。dog君水平有限头岔,如果有一些地方寫的不太好,您可以聯(lián)系dog君或評論鼠证,dog君非常愿意傾聽您的建議峡竣,交個朋友嘛~
下面我們就一起來學(xué)習(xí)docker,揭開docker的神秘面紗量九。
docker介紹
引言
在我們?nèi)粘i_發(fā)中适掰,可能會遇到以下問題:
1.我本地運行沒問題啊
環(huán)境不一致
2.哪個哥們又寫死循環(huán)了,怎么這么卡
在多用戶的操作系統(tǒng)下荠列,會相互影響
3.淘寶在雙11的時候类浪,用戶量暴增
運維成本過高的問題
4.學(xué)習(xí)一門技術(shù),學(xué)習(xí)安裝成本過高
關(guān)于軟件成本過高
相信大家在日常的開發(fā)過程中肌似,也沒少遇到這樣的問題费就。以上的問題呢,也是我們工作中的一些場景锈嫩,很是頭疼受楼。那么這就有一款神器,docker來幫助我們解決這些問題呼寸。
docker 的由來
2010年的時候艳汽,有一幫年輕人創(chuàng)業(yè),創(chuàng)辦了一家公司对雪,他們是專門做PASS平臺的河狐。那時候市場上PASS平臺還比較少,這家公司也是混的風(fēng)生水起瑟捣。
但是到了2013年的時候馋艺,各大公司也都注意到了PASS這塊肉,像亞馬遜迈套,微軟捐祠,Google 等都競相開始做PASS平臺,導(dǎo)致這家公司的營業(yè)額直線下降桑李,瀕臨破產(chǎn)踱蛀。
那么最后呢窿给,創(chuàng)始人一狠心,既然我們干不過他們率拒,那么我們就為人類做做貢獻把崩泡。說時遲那時快,2013年猬膨,這家公司將核心技術(shù)對外開源角撞,那么這個核心技術(shù),就是docker勃痴。
docker開源之后谒所,立刻獲得了一大片追捧。深受資本家的喜愛召耘。
于是乎百炬,到了2014年的時候,得到了C輪的融資污它,4000w美元
到了2015年的時候剖踊,得到了D輪的融資,9500w美元
這不就有錢了嘛衫贬?這家公司開始全神貫注的維護docker德澈。
docker的思想
不是說我們很多情況下是因為環(huán)境不一致導(dǎo)致的問題嘛,那么好固惯,我們直接將環(huán)境打包梆造,這樣就不會出現(xiàn)問題了吧。那么將環(huán)境打包都會分為幾個步驟呢葬毫?這就是docker 的思想镇辉。
docker將本地環(huán)境打包,發(fā)布到遠程的一個中央大倉庫贴捡,其他的用戶通過docker拿到其他用戶發(fā)布上去的環(huán)境忽肛,運行在自己的機器上,這就是docker的思想烂斋。
介紹幾個概念吧
1.集裝箱
會將所有需要的內(nèi)容放到不同的集裝箱中屹逛,誰需要這些環(huán)境,直接拿這個集裝箱就可以了汛骂。
2.標準化:
運輸?shù)臉藴驶篋ocker 有一個碼頭罕模,所有上傳的集裝箱都放在了這個碼頭上,當誰需要某一個環(huán)境帘瞭,就直接指派docker去搬運這個集裝箱就可以了淑掌。
命令的標準化:Docker提供了一系列的命令,幫助我們?nèi)カ@取集裝箱等等操作蝶念。
提供了REST的API:衍生出很多的圖形化界面 如Rancher
3.隔離性:
Docker在運行的集裝箱內(nèi)的內(nèi)容時抛腕,會在Linux的內(nèi)核中诈悍,單獨的開辟一片空間,這片空間不會影響到其他程序兽埃。
注冊中心:超級碼頭,上面放的就是集裝箱
鏡像:集裝箱
容器:運行起來的鏡像
docker 基本操作
安裝docker
那么我們來聊聊docker的基本操作适袜。我們想要使用docker柄错,首先需要下載docker。因為windows操作系統(tǒng)下載docker需要docker專業(yè)版苦酱,并且安裝過程相對比較麻煩售貌,所以說我們在服務(wù)器上來使用下,服務(wù)器操作系統(tǒng)是CentOS 7疫萤,下面附CentOS 7 安裝docker的一些操作步驟颂跨,這里給出鏈接,按照步驟一步步來就可以了扯饶。在安裝docker的過程中可能會遇到一些問題恒削,這里也給出參考鏈接,如下:
安裝好后尾序,我們在控制臺輸入docker run hello-world
钓丰,出現(xiàn)如下信息,即為安裝成功
Docker的中央倉庫
我們上面說到docker的思想每币,是即可携丁。那么我們從哪里下載docker鏡像呢?這里我們推薦三個地址:
1.Docker官方的中央倉庫:這個倉庫是鏡像最全的兰怠,但是下載速度較慢梦鉴,還需要登錄,也有可能被墻揭保。
地址: http://hub.docker.com
2.國內(nèi)的鏡像網(wǎng)站:網(wǎng)易蜂巢肥橙,daoCloud......
網(wǎng)易蜂巢:也是需要進行登錄,操作也比較繁瑣一點
地址:http://c.163yun.com/hub#/home
daoCloud:免登陸掖举,國內(nèi)鏡像快骗,下載速度較快,推薦使用
地址:http://hub.daocloud.io
3.在公司內(nèi)部會采用私服的方式拉取鏡像塔次,但是需要添加一些配置
# 需要在/etc/docker/daemon.json
{
"registry-mirrors":["https://registry.docker-cn.com"],
"inscure-registries":["ip:port"],
}
# 重啟兩個服務(wù)
systemctl daemon-reload
systemctl restart docker
# 這樣我們就在公司內(nèi)部搭建起來docker的私有中央倉庫方篮。具體的一些實踐操作,還需要大家來操作哈励负。
鏡像的操作
下面我們開始進行鏡像的操作藕溅。首先我們回顧下docker的思想:用戶上傳制作好的鏡像,發(fā)布到中央倉庫继榆,我們從中央倉庫下載鏡像巾表,運行起來變成一個容器汁掠。我們一步步的來。
拉取鏡像到本地
docker pull 鏡像名稱[:tag]
舉個例子集币,我們想從中央倉庫拉取tomcat的鏡像
- 進入daocloud網(wǎng)站:http://hub.daocloud.io
- 輸入tomcat 查找
-
點擊版本考阱,找到8.5.14-jre8
點擊拉取
- 復(fù)制命令,控制臺執(zhí)行
docker pull daocloud.io/library/tomcat:8.5.14-jre8
,控制臺顯示鏡像安裝過程
這樣我們的鏡像就從中央倉庫拉取到了我們本地
查看全部本地的鏡像
docker images
這里我們可以看到本地的全部鏡像鞠苟,包括tomcat和hello-world
刪除本地鏡像
docker rmi 鏡像的標識
比如說乞榨,刪除我們剛才下載的tomcat鏡像 docker rmi a0
我們在查看下所有鏡像
發(fā)現(xiàn)tomcat鏡像已經(jīng)被我們從本地刪除了
這里我們說下鏡像的標識,我們可以看到IMAGE ID這個字段当娱,就是鏡像的ID吃既,我們不用全部輸入好,只需要前面幾位跨细,保證它在我們本地的鏡像中是唯一的就好了鹦倚。
鏡像的導(dǎo)入導(dǎo)出
這是一種不規(guī)范的行為,但是如果我們遇到外網(wǎng)環(huán)境下載冀惭,內(nèi)網(wǎng)環(huán)境使用的場景的時候震叙,我們可以采用這種方法。
# 將本地的鏡像導(dǎo)出
docker save -o 導(dǎo)出的路徑 鏡像id
# 加載本地的鏡像文件
docker load -i 鏡像文件
# 修改鏡像名稱
docker tag 鏡像id 新鏡像名稱:版本
舉個例子散休,我們將tomcat 鏡像導(dǎo)出后再導(dǎo)入到我們本地
- 拉取tomcat鏡像(看上面操作)
-
查看本地所有鏡像捐友,找到tomcat的鏡像id
- 將本地的鏡像導(dǎo)出
docker save -o ./tomcat.images a0
- 刪除已有的tomcat 鏡像
docker rmi a0
- 導(dǎo)入制作好的tomcat鏡像
docker load -i tomcat.images
我們可以看到,鏡像已經(jīng)成功被我們導(dǎo)入進去了溃槐。但是并沒有名字和版本號匣砖,這里我們修改下
- 修改名稱和版本號
docker tag a0 tomcat:1.0.0
名稱已經(jīng)被我們成功修改過來了
容器的操作
我們來說說容器的操作。老規(guī)矩昏滴,我們還是來回顧下docker的思想猴鲫。用戶將制作好的鏡像發(fā)布到中央倉庫,我們從中央倉庫拉取鏡像到本地谣殊,運行鏡像變成一個容器拂共。
我們運行鏡像變成容器后,這個鏡像就可以正常的使用了姻几。
運行容器
- 簡單操作
docker run 鏡像的標識|鏡像名稱[:tag]
- 常用參數(shù)
docker run -d -p 宿主機端口:容器端口 --name 容器名稱 鏡像的標識|鏡像名稱[:tag]
# -d:代表后臺運行容器
# -p:宿主機端口:容器端口:為了映射當前的Linux的端口和容器的端口
# --name 容器名稱:指定容器名稱
我們直接使用參數(shù)來運行起來我們剛才制作的tomcat鏡像
docker run -d -p 8081:8080 --name tomcat a0
然后我們通過瀏覽器訪問下tomcat服務(wù) ip:+8081
正常顯示出tomcat服務(wù)宜狐,表示我們的鏡像運行成功,變成一個容器
查看正在運行的容器
docker ps [-qa]
# -a:查看全部容器
# -q:只查看容器的標識
我們來看看目前我們正在運行的容器有哪些docker ps
這里我們看到運行中的容器是tomcat蛇捌,所有的容器還包含我們之前安裝docker使用過的hello-world容器
查看容器日志
docker logs -f 容器id
# -f:可以滾動查看日志的最后幾行
進入到容器內(nèi)部
docker exec -it 容器id bash
比如說抚恒,我們進入tomcat容器,查看容器內(nèi)部樣子docker exec -it 4d bash
可以看到络拌,docker容器相當于一個小虛擬機俭驮,一些詳細內(nèi)容大家自行查閱相關(guān)資料,這里就不做介紹了哈~
刪除容器
我們在刪除容器前春贸,如果這個容器正在運行混萝,需要先停止當前容器
# 停止指定的容器
docker stop 容器id
# 停止所有容器
docker stop $(docker ps -aq)
# 刪除指定容器
docker rm 容器id
# 刪除所有容器
docker rm $(docker ps -aq)
我們一起來刪除下tomcat還有之前的hello-world容器
- 停止所有容器
docker stop $(docker ps -aq)
我們可以看到遗遵,這時已經(jīng)沒有正在運行中的容器了,并且我們用瀏覽器訪問也訪問不到
- 刪除所有容器
docker rm $(docker ps -aq)
我們可以看到逸嘀,所有的容器已經(jīng)全部刪除
那么我們想啟動停止的容器怎么辦呢
docker start 容器id
- 運行tomcat鏡像
docker run -d -p 8080:8080 --name tomcat a0
-
查看當前運行容器
docker ps
-
停止當前運行的容器
docker stop ee
-
啟動停止的容器
docker start ee
-
我們用瀏覽器訪問下: ip:+8080
tomcat容器又重新啟動了
docker 應(yīng)用
現(xiàn)在我們已經(jīng)掌握了一些基本的docker操作车要,那就一起來實踐一下吧!我們寫一個html文件崭倘,部署到服務(wù)器上運行感受下屯蹦,這里我們以tomcat為例。
那么tomcat如何部署web應(yīng)用呢绳姨?我們只需要將編寫好的index.html文件放在tomcat的webapps目錄下即可正常訪問。好阔挠,我們首先制作一個index.html文件飘庄,這里我們用vim 查看下 vim index.html
-
啟動tomcat容器
docker run -d -p 8080:8080 --name tomcat a0
用瀏覽器訪問下可以正常訪問
將index.html 文件放到tomcat容器的webapps目錄下tomcat目錄下
1.進入tomcat容器docker exec -it ee bash
2.新建tomcat目錄mkdir tomcat
3.從tomcat容器退出exit
4.將index.html放入tomcat容器中
docker cp 文件名稱 容器id:容器內(nèi)部路徑
docker cp index.html ee:/usr/local/tomcat/webapps/tomcat
現(xiàn)在我們已經(jīng)可以看到tomcat容器中已經(jīng)有了我們編寫的index.html文件,下面我們訪問下把购撼! ip:8080/tomcat
顯示成功跪削!
那么我們這么操作會不會很麻煩呢?實際上迂求,我們?nèi)ミM入到容器中碾盐,修改容器內(nèi)部的文件是不規(guī)范的,因為當我們刪除容器揩局,再次運行時毫玖,我們的文件就丟失了,達不到持久化的目的凌盯。那怎么辦呢?這里介紹一個數(shù)據(jù)卷的概念付枫。
數(shù)據(jù)卷
我們將容器內(nèi)部的一些文件夾或目錄,和宿主機進行一個映射驰怎,我們在宿主機去做一些操作阐滩,容器內(nèi)部也會同步修改,并且當我們刪除容器后县忌,再次運行時掂榔,只需要指定數(shù)據(jù)卷,那么這個容器就又會重新加載我們保留在宿主機上的文件了症杏,達到了持久化的目的装获。下面我們一起來看下數(shù)據(jù)卷如何使用把!
創(chuàng)建數(shù)據(jù)卷
docker volume create 數(shù)據(jù)卷名稱
# 創(chuàng)建數(shù)據(jù)卷后,默認會存放在一個目錄下 /var/lib/docker/volumes/數(shù)據(jù)卷名稱/_data
我們來創(chuàng)建一個tomcat數(shù)據(jù)卷 docker volume create tomcat
進入目錄查看 cd /var/lib/docker/volumes/tomcat/_data
我們可以看到,數(shù)據(jù)卷已經(jīng)創(chuàng)建成功方灾,目前是空的步责,沒有任何數(shù)據(jù)酝掩。
查看全部數(shù)據(jù)卷
docker volume ls
我們可以看到剛才創(chuàng)建的tomcat數(shù)據(jù)卷
查看某個數(shù)據(jù)卷的詳細信息
docker volume inspect 數(shù)據(jù)卷名稱
我們也可以拿到數(shù)據(jù)卷存放的目錄
刪除數(shù)據(jù)卷
docker volume rm 數(shù)據(jù)卷名稱
我們刪除下tomcat數(shù)據(jù)卷看看
我們可以看到幅聘,tomcat數(shù)據(jù)卷已經(jīng)全部刪除
應(yīng)用數(shù)據(jù)卷
# 當你映射數(shù)據(jù)卷時震糖,如果數(shù)據(jù)卷不存在总珠,Docker會幫助我們自動創(chuàng)建肋杖,會將容器內(nèi)部自帶的文件溉仑,存儲在默認路徑中。
docker run -v 數(shù)據(jù)卷名稱:容器內(nèi)部路徑 鏡像id
# 直接指定一個路徑作為數(shù)據(jù)卷的存放位置状植,這個路徑下是空的
docker run -v 路徑:容器內(nèi)部路徑 鏡像id
下面我們以tomcat為例浊竟,分別來看下這兩種的效果
- Docker自動創(chuàng)建數(shù)據(jù)卷:
1.查看當前所有鏡像docker images
2.自動創(chuàng)建數(shù)據(jù)卷方式,啟動tomcat容器
docker run -d -p 8080:8080 --name tomcat -v tomcat:/usr/local/tomcat/webapps a0
我們可以看到津畸,docker為我們自動創(chuàng)建了tomcat數(shù)據(jù)卷振定。我們查看下tomcat數(shù)據(jù)卷信息,進入到目錄看下
我們可以看到肉拓,tomcat容器的數(shù)據(jù)已經(jīng)保存到宿主機上面了
3.將index.html放到tomcat數(shù)據(jù)卷的tomcat目錄中
mkdir tomcat
cp /dev/project/index.html ./tomcat
我們訪問下看看
頁面正常顯示
4.刪除tomcat容器后频,重新啟動看頁面是否還能正常顯示
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker images
docker run -d -p 8080:8080 --name tomcat -v tomcat:/usr/local/tomcat/webapps a0
我們的頁面仍然正常顯示。說明數(shù)據(jù)卷具有持久化容器數(shù)據(jù)能力
我們來試試第二種暖途,將數(shù)據(jù)卷保存到自定義路徑下
- 將數(shù)據(jù)卷保存到自定義路徑下
# 我們先根據(jù)如下命令刪除容器和數(shù)據(jù)卷
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker volume rm tomcat
# 以自定義路徑方式保存數(shù)據(jù)卷(本地路徑只能使用絕對路徑)
# 我們在/dev/project 目錄下進行
# 在該目錄下新建webapps目錄
mkdir webapps
docker images
docker run -d -p 8080:8080 --name tomcat -v /dev/project/webapps:/usr/local/tomcat/webapps a0
cd webapps
docker exec -it fe bash
cd webapps
我們可以看到卑惜,宿主機的webapps和容器內(nèi)的webapps都沒有文件
我們在宿主機webapps目錄下新建ROOT,將index.html復(fù)制一份到ROOT目錄下
cd /dev/project/webapps
mkdir ROOT
cd ROOT
cp /dev/project/index.html /dev/project/webapps/ROOT
此時我們通過瀏覽器訪問 ip:8080
同樣驻售,我們能夠正常訪問露久,這也方便我們對容器數(shù)據(jù),或者容器日志更好的管理欺栗。
docker自定義鏡像
下面我們來說說docker自定義鏡像毫痕。老規(guī)矩,我們還是來一起回顧下docker的思想迟几。用戶將制作好的鏡像發(fā)布到中央倉庫镇草,我們從中央倉庫拿到鏡像,運行瘤旨,變成一個容器梯啤。
我們之所以能從中央倉庫下載鏡像,是因為中央倉庫的鏡像存哲,也都是用戶上傳上去的因宇,那么這里我們一起來制作一個自定義鏡像。
1.創(chuàng)建一個Dockerfile文件祟偷,并且指定自定義鏡像信息察滑。
Dockerfile文件中常用的內(nèi)容:
from:指定當前自定義鏡像依賴的環(huán)境
copy:將相對路徑下的內(nèi)容復(fù)制到自定義鏡像中
其他的像workdir cmd run expose等命令在這里就不一一給大家介紹了,下面這個參考鏈接修肠,可以給大家答案贺辰。
Dockerfile文件詳解
前面我們演示了使用tomcat部署一個index.html頁面,那么我們就制作一個tomcat_index鏡像,運行后饲化,我們可以直接訪問莽鸭。一起來看下操作步驟吧。
- 刪除所有鏡像和容器
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -aq)
- 創(chuàng)建Dockerfile文件并編寫如下內(nèi)容
我們是在/dev/project/目錄下操作的吃靠,我們看下該目錄都有什么
- 打包鏡像
docker build -t 鏡像名稱:[tag] .
我們執(zhí)行docker build -t tomcat:1.0.0 .
注意最后面還有一個. 這個. 的作用就是指明Dockerfile文件所在目錄
我們來看下當前所有鏡像docker images
已經(jīng)有了我們的tomcat鏡像硫眨,下面我們運行起來看下
docker run -d -p 8080:8080 --name tomcat 66
在瀏覽器中正常訪問。
docker-compose 使用
來巢块,老規(guī)矩礁阁,我們一起來回顧下docker的思想。用戶將制作好的鏡像發(fā)布到一個中央倉庫族奢,我們從中央倉庫下載好鏡像到我們本地姥闭,運行鏡像變成一個容器。到此為止呢越走,其實我們已經(jīng)掌握了docker的基本用法棚品。但是我們有沒有發(fā)現(xiàn)一個問題,就是在操作docker的時候弥姻,有點繁瑣,命令太多掺涛。我們能不能實現(xiàn)只編寫一次庭敦,后面直接使用呢?當然可以薪缆,這就是我們的docker-compose秧廉。我們先來看下它可以解決什么問題。
之前運行一個鏡像拣帽,需要添加大量的參數(shù)
可以通過docker-compose編寫這些參數(shù)
docker-compose可以幫助我們批量的管理容器
只需要通過一個docker-compose.yml文件去維護即可
安裝docker-compose
我們進入github疼电,輸入docker/compose,點擊進入
我們點擊紅框內(nèi)容,找到發(fā)行版本
就拿最新版1.28.2 為例减拭。因為我們是在centos 7環(huán)境下蔽豺,我們選擇如下畫紅框部分,點擊下載
下載完畢后拧粪,我們通過scp命令發(fā)送到centos 7 中修陡。這是一個可執(zhí)行文件,所以我們需要修改一下權(quán)限
# 首先修改下名字
mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-compose
# 現(xiàn)在我們已經(jīng)可以使用docker-compose命令了可霎。為了方便后期操作魄鸦,配置一個環(huán)境變量
# 將docker-compose 文件移動到/usr/local/bin
mv docker-compose /usr/local/bin
# 修改/etc/profile 文件
vim /etc/profile
如果沒有的話,加上即可癣朗。
最后我們應(yīng)用一下配置文件 source /etc/profile
在任意目錄下使用docker-compose
打印出一下信息拾因,說明我們的docker-compose安裝完畢
使用docker-compose管理tomcat容器
下面我們就一起來使用docker-compose管理我們的tomcat容器把!
前面提到,使用docker-compose管理我們的容器需要一個docker-compose.yml文件绢记。關(guān)于這個文件的配置扁达,這里只做簡單的介紹,詳細的配置同Dockerfile給出參考鏈接庭惜,大家自行學(xué)習(xí)哈~
我們新建docker-compose.yml文件罩驻,編寫內(nèi)容如下:
我們一起來看下docker-compose的一些常用命令把!
在使用docker-compose的命令時护赊,默認會在當前目錄下找docker-compose.yml文件
1.基于dockr-compose.yml啟動管理的容器
docker-compose up -d
2.關(guān)閉并刪除容器
docker-compose down
3.開啟|關(guān)閉|重啟已經(jīng)存在的由docker-compose維護的容器
docker-compose start|stop|restart
4.查看由docker-compose管理的容器
docker-compose ps
5.查看日志
docker-compose logs -f
我們使用下docker-compose管理tomcat容器
控制臺執(zhí)行docker-compose up -d
我們在瀏覽器訪問下
瀏覽器能夠正常訪問惠遏。
我們的docker-compose還可以配合Dockerfile來管理自定義鏡像,這里我們就不做介紹了骏啰,就留給大家去探索吧节吮!
總結(jié)
到此為止呢,我們的docker基礎(chǔ)教程就結(jié)束了判耕。使用docker呢透绩,方便我們安裝和管理各種各樣的軟件,免去了繁瑣的配置問題壁熄,并且對于我們前端工程師來說帚豪,這也是進擊大前端和全棧開發(fā)的必經(jīng)之路。
參考鏈接:
千鋒教育-2020版-Docker最新超詳細版教程通俗易懂
我是前端dog君草丧,一名95后前端小兵狸臣。對前端的熱愛,讓我們在此相聚昌执,希望這篇文章烛亦,能幫助到您,也同時希望能交到志同道合的小伙伴懂拾,共同發(fā)展煤禽,一起進步。我的微信號dm120225岖赋,備注簡書檬果,期待您的光臨。