鏡像下載员舵、域名解析静檬、時(shí)間同步請(qǐng)點(diǎn)擊 阿里云開(kāi)源鏡像站
一鞍爱、鏡像
鏡像是一種輕量級(jí)踏兜、可執(zhí)行的獨(dú)立軟件包军拟,它包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容幸乒,我們把應(yīng)用程序和配置依賴(lài)打包形成一個(gè)可交付的運(yùn)行環(huán)境(包括代碼、運(yùn)行時(shí)需要的庫(kù)漠秋、環(huán)境變量和配置文件等)笙蒙,這個(gè)打包好的運(yùn)行環(huán)境就是image鏡像文件
1.鏡像分層
以tomcat鏡像為例,我們發(fā)現(xiàn)在pull的過(guò)程中鏡像好像一層一層的在下載
(1). Docker鏡像加載原理:
docker鏡像實(shí)際上由一層一層的文件系統(tǒng)組成庆锦,這種層級(jí)的文件系統(tǒng)就是聯(lián)合文件系統(tǒng)(UnionFS)
(2). UnionFS(聯(lián)合文件系統(tǒng))
UnionFS(聯(lián)合文件系統(tǒng)):Union文件系統(tǒng)是一種分層捅位、輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系統(tǒng)的修改作為一次提交來(lái)一層層的疊加搂抒, 同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下艇搀。Union文件系統(tǒng)時(shí)Docker鏡像的基礎(chǔ)。鏡像可以通過(guò)分層來(lái)進(jìn)行繼承求晶,基于基礎(chǔ)鏡像(沒(méi)有父鏡像)可以制作除具體的應(yīng)用鏡像焰雕。
(3). 具體細(xì)節(jié)
- bootfs(boot file sysytem)
主要包含bootloader和kernel,bootloader主要是引導(dǎo)加載kernel芳杏,Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng)矩屁,在Docker鏡像的最底層時(shí)引導(dǎo)文件系統(tǒng)bootfs。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的爵赵,包含boot加載器和內(nèi)核吝秕。當(dāng)boot加載完成之后整個(gè)內(nèi)核就都在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核空幻,此時(shí)系統(tǒng)也會(huì)卸載bootfs
- rootfs(root file system)
在bootfs之上烁峭,包含的就是典型Linux系統(tǒng)中的/dev, /proc, /bin,/etc等標(biāo)準(zhǔn)目錄和文件,rootfs就是各種不同操作系統(tǒng)發(fā)行版秕铛,比如Ubuntu约郁,Centos等
(4). 鏡像分層的好處
共享資源耘柱,方便復(fù)制遷移、復(fù)用
比如說(shuō)多個(gè)鏡像都是從相同的一份base鏡像構(gòu)建而來(lái)(更詳細(xì)的講 假如base鏡像共有十層棍现,而A鏡像是base鏡像的前三層,B鏡像是base鏡像的后三層)镜遣,那么我們只需要在磁盤(pán)上保存一份base鏡像己肮,在內(nèi)存中加載一份base鏡像,就可以為所有由base鏡像構(gòu)建而來(lái)的鏡像的實(shí)例容器服務(wù)了悲关。
通俗來(lái)講谎僻,大學(xué)圖書(shū)館分為好幾層,如工學(xué)寓辱、文學(xué)艘绍、醫(yī)學(xué)每個(gè)大的分區(qū)又可以細(xì)分多個(gè)不同的子領(lǐng)域,而我們?nèi)5膶W(xué)生雖然專(zhuān)業(yè)眾多秫筏,但是都可以在圖書(shū)館找到屬于自己專(zhuān)業(yè)的書(shū)籍诱鞠。這樣我們就不需要因?yàn)閷W(xué)科領(lǐng)域不同也建造多個(gè)圖書(shū)館了
(5). 容器層、鏡像層
當(dāng)容器啟動(dòng)時(shí)这敬,一個(gè)新的可寫(xiě)層被加載到鏡像的頂部航夺,這一層通常被稱(chēng)為 " 容器層" , "容器層 " 之下的都叫 " 鏡像層 " 崔涂。Docker鏡像層都是只讀的阳掐,容器層是可寫(xiě)的。
這個(gè)好理解冷蚂,圖書(shū)館中的書(shū)可以借閱缭保,但是圖書(shū)館地基和整體建筑肯定不能隨便動(dòng)
在docker上運(yùn)行Ubuntu容器實(shí)例,使用vim編輯文件蝙茶,發(fā)現(xiàn)報(bào)錯(cuò)了艺骂,找不到vim
原因:
這是由于鏡像是簡(jiǎn)易版的Linux,僅包括Linux內(nèi)核等一些重要的隆夯。
但是我們進(jìn)行配置文件的修改彻亲,需要用到vim編輯器,這時(shí)候就需要鏡像加強(qiáng)了
apt update 更新包管理工具(ubuntu)
apt install vim 下載vim
使用vim編輯器吮廉,新建文件a.txt 并寫(xiě)入hello docker苞尝,保存退出。讀取a.txt文件
ctrl+q+p 退出容器 docker ps 查看正在運(yùn)行的容器
第一個(gè)就是我們剛才使用的帶vim編輯器的ubuntu容器
docker commit -m="提交的描述信息" -a="作者" 容器ID 要?jiǎng)?chuàng)建的目標(biāo)鏡像名:[標(biāo)簽名]
commit 帶vim編輯器的ubuntu容器到本地宦芦,查看本地鏡像發(fā)現(xiàn)帶vim的大小多了近100MB宙址,這就是為什么鏡像文件小的原因所在,只是按需下載
Docker中的鏡像分層调卑,支持通過(guò)擴(kuò)展現(xiàn)有鏡像抡砂,創(chuàng)建新的鏡像大咱。
2.本地鏡像發(fā)布到阿里云
在阿里云控制臺(tái) -> 容器鏡像服務(wù) -> 個(gè)人實(shí)例(創(chuàng)建一個(gè)用于測(cè)試)
(1). 創(chuàng)建命名空間
(2) 創(chuàng)建鏡像倉(cāng)庫(kù)
(3) 阿里云會(huì)自動(dòng)生成操作指南
(3)講鏡像推送到Registry
(4)登錄
docker login --username=用戶(hù)名 registry.cn-shanghai.aliyuncs.com
(5)設(shè)置鏡像版本號(hào)
docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[鏡像版本號(hào)]
(6)推送
docker push registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[鏡像版本號(hào)]
(7)測(cè)試
刪除本地Ubuntu1.3的鏡像
(8)從阿里云Registry中拉取鏡像
docker pull registry.cn-shanghai.aliyuncs.com/xueyueqing/ubuntu:[鏡像版本號(hào)]
測(cè)試成功!
二注益、容器數(shù)據(jù)卷
1.作用
試想一下:我們的docker容器很容易被自己誤刪或者被別人惡意刪除碴巾,那我們?nèi)萜髦械闹匾獢?shù)據(jù)不就丟失了嗎?
docker采用容器數(shù)據(jù)卷的方式解決此類(lèi)問(wèn)題丑搔。
卷就是目錄或文件厦瓢,存在于一個(gè)或多個(gè)容器中,由docker掛載到容器啤月,不屬于聯(lián)合文件系統(tǒng)煮仇,可以繞過(guò)聯(lián)合文件系統(tǒng)提供一些用于持久化和共享數(shù)據(jù)的特性。
容器數(shù)據(jù)卷設(shè)計(jì)的目的就是數(shù)據(jù)的持久化谎仲,它完全獨(dú)立于容器的生存周期浙垫,因此Docker不會(huì)再容器刪除時(shí)刪除其掛載的數(shù)據(jù)卷
注意事項(xiàng):
Docker掛載主機(jī)目錄訪(fǎng)問(wèn)如果出現(xiàn)cannot open directory:Permission denied解決辦法:在掛載目錄后多加一個(gè)--privileged=true參數(shù)即可
作用: 擴(kuò)大容器的權(quán)限解決掛載目錄沒(méi)有權(quán)限的問(wèn)題,使得容器中root擁有所有權(quán)限郑诺,否則root只是外部一個(gè)普通的用戶(hù)
2.特點(diǎn)
- 數(shù)據(jù)卷可在容器之間共享或重用數(shù)據(jù)
- 卷中的更改可以直接實(shí)時(shí)生效
- 數(shù)據(jù)卷中的更改不會(huì)包含再鏡像的更新中
- 數(shù)據(jù)卷的生命周期一直持續(xù)倒沒(méi)有容器使用它為止
3.測(cè)試
docker run -it --privileged=true -v/宿主機(jī)絕對(duì)路徑目錄:/容器內(nèi)目錄 鏡像名
(1). 在容器docker_data目錄中創(chuàng)建文件
(2). 在本地host_data目錄下發(fā)現(xiàn) dockerin.txt文件已共享
(3). 在本地host_data目錄下新建文件并寫(xiě)入數(shù)據(jù) hello docker
(4). 在容器docker_data目錄中發(fā)現(xiàn)hostin.txt文件 并讀取到共享過(guò)來(lái)的數(shù)據(jù)
(5). docker inspect 容器ID 查看容器內(nèi)部細(xì)節(jié)
假設(shè)容器停止夹姥,在主機(jī)新建文件能否共享嗎?
(6). 停止容器
(7). 在主機(jī)創(chuàng)建文件c.txt
(8). 重啟容器
(9). 進(jìn)入容器docker_data目錄下發(fā)現(xiàn)c.txt文件已共享
4.容器卷的讀寫(xiě)規(guī)則
容器數(shù)據(jù)卷的讀寫(xiě)規(guī)則默認(rèn) rw 可讀可寫(xiě)辙诞,就如同上述的例子
ro:容器實(shí)例內(nèi)部被限制佃声,只能讀取不能寫(xiě)
docker run -it --privileged=true -v/宿主機(jī)絕對(duì)路徑目錄:/容器內(nèi)目錄:ro 鏡像名
(1). 創(chuàng)建只讀的Ubuntu容器實(shí)例
(2). 在本地主機(jī)上創(chuàng)建a.txt文件 并寫(xiě)入數(shù)據(jù) xueyueqing
(3). 這容器中只能讀文件,其他操作被限制
5.容器卷的繼承
docker run -it --privileged=true --volumes-from 父類(lèi) --name u2 ubuntu
(注意:向?qū)⒅暗膗2容器刪除倘要,docker rm 容器ID)
(1). u2繼承u1的docker_data目錄及目錄下的文件
(2). 在u2中創(chuàng)建文件圾亏,u1中也會(huì)共享數(shù)據(jù)
當(dāng)u1停止了,u2會(huì)共享本地主機(jī)數(shù)據(jù)嗎封拧? 會(huì)
(3). u2容器共享了主機(jī)的數(shù)據(jù)
容器卷的繼承本質(zhì)是繼承了容器之間的規(guī)則與容器本身沒(méi)有關(guān)系志鹃,因此u1容器停止不影響u2容器與本地主機(jī)數(shù)據(jù)共享
如果啟動(dòng)u1容器,那么u1中會(huì)有之前本地主機(jī)創(chuàng)建的文件嗎泽西? 會(huì)
三曹铃、docker上安裝常用軟件
總體步驟:
搜索鏡像
拉取鏡像
查看鏡像
啟動(dòng)鏡像
停止鏡像
移除容器
補(bǔ)充:
netstat -tunlp | grep 端口號(hào) 查看端口使用情況
ps - ef | grep 端口號(hào) 查看端口使用情況
kill - 9 進(jìn)程號(hào) 殺進(jìn)程
1.Tomcat
(1).搜索鏡像 docker search tomcat
(2).拉取鏡像,一般都是使用第一個(gè) docker pull tomcat
(3).查看tomcat鏡像是否下載成功 docker images tomcat
(4).使用tomcat鏡像創(chuàng)建容器實(shí)例 docker run -d -p 8080:8080 --name t1 tomcat
-p 小寫(xiě)捧杉,主機(jī)端口:docker容器端口 -d 后臺(tái)運(yùn)行
-P 大寫(xiě)陕见,隨機(jī)分配端口
(5). 啟動(dòng)成功
(6). 訪(fǎng)問(wèn)不到tomcat首頁(yè)
首先檢查防火墻端口8080是否開(kāi)啟,使用云服務(wù)器還需要檢查云服務(wù)器安全組中的8080端口規(guī)則是否添加
檢查tomcat中webapps目錄下是否有tomcat首頁(yè)
(7). 進(jìn)入tomcat容器味抖,發(fā)現(xiàn)tomcat中webapps目錄下為空
(8). 刪掉webapps评甜,將webapps.dist 改為webapps
成功了Tゼ怼5奚肌!
(原因是因?yàn)樾掳鎡omcat 默認(rèn)訪(fǎng)問(wèn)路徑webapps目錄是空的深胳,默認(rèn)配置在webapps.dist目錄中 ,需要修改下)
(9). 停止佩研、刪除容器一氣呵成
2.MySQL
(1). 簡(jiǎn)易版
- 搜索鏡像 docker search mysql
- 拉取鏡像柑肴,使用5.7版本的 docker pull mysql:5.7
- 查看mysql鏡像是否下載成功 docker images mysql
- 使用tomcat鏡像創(chuàng)建容器實(shí)例 docker run -d -p 8080:8080 --name t1 tomcat
先檢查L(zhǎng)inux本地主機(jī)是否啟動(dòng)了MySQL,防止端口沖突
- 啟動(dòng)容器 docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- 進(jìn)入容器旬薯,登錄root用戶(hù)
- 簡(jiǎn)單測(cè)試下MySQL
- 使用SQLyog測(cè)試 連接成功
** 問(wèn)題一:測(cè)試中文數(shù)據(jù)晰骑,發(fā)現(xiàn)亂碼**
問(wèn)題二:mysql容器如果被誤刪了,那么我的數(shù)據(jù)該怎么辦
解決方案:請(qǐng)看實(shí)戰(zhàn)版
(2). 實(shí)戰(zhàn)版
- 創(chuàng)建一個(gè)mysql目錄保存數(shù)據(jù)
- 使用容器卷保存數(shù)據(jù) docker run -d -p 3306:3306 --privileged=true -v /mysql/log:/var/log/mysql -v /mysql/data:/var/lib/mysql -v /mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
- 在本地主機(jī)/mysql/conf目錄下新建my.cnf 文件利用容器卷共享绊序,將文件共享到mysql容器解決亂碼
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
- 進(jìn)入容器硕舆,登錄mysql
- 查看mysql編碼 show variables like 'character%'
- 測(cè)試
- 成功解決中文亂碼問(wèn)題
- mysql容器被刪了??????
這個(gè)時(shí)候就不怕數(shù)據(jù)丟失了,因?yàn)槲覀冎笆褂萌萜骶肀4鏀?shù)據(jù)了
- 再次創(chuàng)建mysql容器 數(shù)據(jù)卷宿主機(jī)絕對(duì)路徑就是之前設(shè)置的
- 數(shù)據(jù)庫(kù)中數(shù)據(jù)從本地主機(jī)共享過(guò)來(lái)了政模,再也不怕刪庫(kù)跑路了??????
3.Redis
- 搜索鏡像 docker search redis
- 拉取鏡像, docker pull redis
- 查看tomcat鏡像是否下載成功 docker images redis
- 進(jìn)入容器蚂会,連接客戶(hù)端
這樣肯定是不行的淋样,因?yàn)閞edis需要保存數(shù)據(jù),還要修改配置文件
- 在本地主機(jī)新建目錄 /app/redis
- 將一個(gè)redis.conf 文件模板拷貝進(jìn) /app/redis 目錄下
- 修改redis.conf配置文件
- .將daemonize yes改為 no 胁住,因?yàn)樵撛O(shè)置何docker run中-d參數(shù)沖突趁猴,會(huì)導(dǎo)致容器一直啟動(dòng)失敗
- 再次創(chuàng)建redis容器(記得先把之前6379端口停了)
docker run -p 6379:6379 --name myredis --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis redis-server /etc/redis/redis.conf
- 測(cè)試連接成功
本文轉(zhuǎn)自:https://blog.csdn.net/qq_52595134/article/details/124460846