日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Docker數(shù)據(jù)卷與DockerFile學(xué)習(xí)

docker數(shù)據(jù)卷與DockerFile學(xué)習(xí)

作者:Aasee 2022-05-25 16:48:25
云計(jì)算
云原生 數(shù)據(jù)卷(Data Volumes)是宿主機(jī)中的一個(gè)目錄或文件,數(shù)據(jù)卷的設(shè)計(jì)目的就是數(shù)據(jù)的持久化,完全獨(dú)立于容器的生存周期,因此Docker不會(huì)在容器刪除時(shí)刪除其掛載的數(shù)據(jù)卷。

銅梁ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

什么是數(shù)據(jù)卷

數(shù)據(jù)卷(Data Volumes)是宿主機(jī)中的一個(gè)目錄或文件,數(shù)據(jù)卷的設(shè)計(jì)目的就是數(shù)據(jù)的持久化,完全獨(dú)立于容器的生存周期,因此Docker不會(huì)在容器刪除時(shí)刪除其掛載的數(shù)據(jù)卷。當(dāng)容器目錄和數(shù)據(jù)卷目錄綁定后,對(duì)方的修改會(huì)立即同步,一個(gè)數(shù)據(jù)卷可以被多個(gè)容器同時(shí)掛載,一個(gè)容器也可以被掛載多個(gè)數(shù)據(jù)卷。

數(shù)據(jù)卷可以在容器之間共享和重用,本地與容器間傳遞數(shù)據(jù)更高

對(duì)數(shù)據(jù)卷的修改會(huì)立馬有效,在容器內(nèi)部與本地目錄均可對(duì)數(shù)據(jù)卷進(jìn)行修改

對(duì)數(shù)據(jù)卷的更新,不會(huì)影響鏡像,對(duì)數(shù)據(jù)與應(yīng)用進(jìn)行了解耦操作

卷會(huì)一直存在,直到?jīng)]有容器使用

其實(shí)也不難理解和我們上一篇講的端口映射很相似,因?yàn)槿萜髋c宿主機(jī)之間都是相互隔離的。而端口映射則是在兩個(gè)互相隔離體之間構(gòu)建通道,使其可以進(jìn)行通訊共享。數(shù)據(jù)卷也是這種意思,但是數(shù)據(jù)卷不會(huì)因?yàn)槿萜鞯乃劳龆?,只要還有一個(gè)容器或宿主機(jī)與其進(jìn)行綁定,那么數(shù)據(jù)卷的內(nèi)容就不會(huì)丟失。

數(shù)據(jù)卷

一、直接命令掛載在宿主機(jī)目錄

1、測(cè)試nginx

docker run -v 主機(jī)目錄:容器內(nèi)目錄
docker run -d -v 主機(jī)目錄地址:/usr/share/nginx/html -p 8080:80 --name nginx-music-volume nginx

當(dāng)我們的兩個(gè)目錄進(jìn)行掛載之后,就相當(dāng)于共用一個(gè)目錄,不管哪邊發(fā)送改變目錄的內(nèi)容都會(huì)發(fā)生改變,這樣的話我們只需在宿主機(jī)這邊的目錄進(jìn)行操作,那么容器內(nèi)的該目錄也會(huì)發(fā)生相應(yīng)的變化。就像我上篇文章所進(jìn)行的cp操作就可以省去,并且當(dāng)我需要更新版本時(shí)也只需在宿主機(jī)這邊進(jìn)行操作即可。下面我以nginx進(jìn)行測(cè)試,掛載上自己自定義的網(wǎng)頁(yè)。

這里我自己網(wǎng)頁(yè)是放在/var/www/html里,接下來我需要掛載到nginx容器里的html文件夾下。

可以看到已經(jīng)運(yùn)行起來了訪問也通了,讓我們看看網(wǎng)頁(yè)行不行。

ok也是沒問題了。這里我們還能通過docker inspect 容器id 查看詳細(xì)信息。

這里可以看到確實(shí)是掛載成功了??梢钥吹疆?dāng)我們使用-v時(shí)很容易就將自己的本地目錄網(wǎng)頁(yè)放在了容器里,到這里其實(shí)就已經(jīng)可以說明現(xiàn)在這兩個(gè)目錄實(shí)際上已經(jīng)共用同一個(gè)目錄了,并且就算我將這個(gè)容器刪除,里面的內(nèi)容也依舊是保留的。

以后修改或者發(fā)布新的版本就只需在服務(wù)器進(jìn)行修改就行容器會(huì)自動(dòng)同步,并且只有容器沒刪不管是停止?fàn)顟B(tài)還是運(yùn)行狀態(tài)都會(huì)自動(dòng)同步。

2、 測(cè)試mysql

我這用mysql:5.7版本演示,首先docker pull mysql:5.7 ,當(dāng)然這里我先去官網(wǎng)看了一下。我這里還是建議大家直接先去官方進(jìn)行查詢學(xué)習(xí)。

但是為了掛載目錄方便管理,這里我們需要對(duì)該命令進(jìn)行修改。

docker run -d -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 3310:3306 --name mysql01 mysql:5.7 相信看完上一篇文章的你對(duì)于這個(gè)命令應(yīng)該不難理解了。
-d 后臺(tái)
-p 端口映射
-v 卷掛載
-e 環(huán)境配置
--name 命名

接下來我們?nèi)y(cè)試一下是否聯(lián)通了。

可以看到已經(jīng)成功了!我們?cè)趎avicat加一個(gè)表看看服務(wù)器上是否會(huì)有。

這樣我們就完成了MySQL容器的數(shù)據(jù)持久化。就算我們將容器進(jìn)行刪除,數(shù)據(jù)庫(kù)中的數(shù)據(jù)也將獲得保存。

二、 匿名掛載和具名掛載

匿名掛載和具名掛載也很好理解,匿名就是沒有給名字,具名就是給了具體的名字
docker run -d -v /usr/share/nginx/html -p 8080:80 --name nginx01 nginx (未指定名稱,只寫了容器內(nèi)路徑的為匿名掛載)
docker run -d -v Aasee:/usr/share/nginx/html -p 8080:80 --name nginx02 nginx(指定名稱和容器內(nèi)路徑的為具名掛載)
docker run -d -v 主機(jī)路徑:容器內(nèi)路徑 -p 8080:80 --name nginx-volume nginx(直接掛載在宿主機(jī)指定目錄)

下面我來給大家逐一展示,這里我就用-P隨機(jī)指定端口了因?yàn)槲?080端口跑著。

匿名

我們可以用docker volume ls 來查看數(shù)據(jù)卷列表,docker inspect [volumename] 來查看卷信息。

更多使用參數(shù)可以 --help查看。

docker inspect 容器id

具名

docker inspect 容器id查看

順便補(bǔ)充一下。

看到這這幅圖就很好理解了。一般建議用具名掛載。

設(shè)置只讀:docker run -d -v 主機(jī)目錄地址:/usr/share/nginx/html:ro -p 8080:80 --name 
nginx-music-volume nginx

三、數(shù)據(jù)卷容器

正如容器與主機(jī)之間能夠進(jìn)行通訊,容器與容器之間也可以進(jìn)行通信,而這個(gè)父容器就為數(shù)據(jù)卷容器,因?yàn)槲覀円呀?jīng)知道了容器與宿主機(jī)可以通過數(shù)據(jù)卷進(jìn)行文件共享,所以自然容器與容器之間也是同樣可以通過數(shù)據(jù)卷共享。

--volumes-from容器間數(shù)據(jù)共享命令。
docker run -it --name 子容器名 --volumes-from 父容器名 鏡像名 /bin/bash

這里我以nginx進(jìn)行演示,先啟動(dòng)一個(gè)帶有數(shù)據(jù)卷的容器作為父容器,我這把它命令為docker01

docker run -d --name docker01 -P -v volume01:/home/volume01 nginx

好的第一個(gè)容器已經(jīng)做好了,接下來做第二個(gè)。

docker run -it --name docker02 --volumes-from docker01 nginx /bin/bash

我們可以去home目錄驗(yàn)證一下是不是已經(jīng)存在volume01文件夾。

我們?cè)谶@新建一個(gè)文件,touch helloDocker.py 然后去docker01看看是不是已經(jīng)共享了。

可以看到成功了。

DockerFile

  • DockerFile:構(gòu)建文件,定義了鏡像如何生成已經(jīng)所需的文件等等配置。
  • DockerImages: 通過DockerFile層層生成的最終鏡像。最終發(fā)布和運(yùn)行的產(chǎn)品
  • DockerContainer: 容器是鏡像運(yùn)行起來的服務(wù),也是一個(gè)可寫層。

下面是我找的兩幅docker常用命令的簡(jiǎn)介圖。大家可以好好看看有對(duì)命令的詳細(xì)介紹。

可以看到ENTRYPOINT和CMD的功能描述幾乎是一樣的,但是他們還是有區(qū)別的,CMD的命令是執(zhí)行最后一個(gè),ENTRYPOINT命令則是追加。

所以這里我就通過編寫DockerFile來演示他們的區(qū)別。

[root@VM-0-3-centos ~]# cd dockerFile/
[root@VM-0-3-centos dockerFile]# vim docker-test-cmd
[root@VM-0-3-centos dockerFile]# cat docker-test-cmd
FROM centos
CMD ["ls","-a"]

這樣我們就創(chuàng)建好了一個(gè)dockerfile,很簡(jiǎn)單的一個(gè)dockerfile,這個(gè)的意思就是當(dāng)我們運(yùn)行這個(gè)鏡像的時(shí)候自動(dòng)ls -a。我們接下來用build命令來創(chuàng)建鏡像。

docker build -f docker-test-cmd -t test01-cmd .

現(xiàn)在我們就創(chuàng)建好了。run一下試試。

現(xiàn)在我們?cè)趓un命令后面加上一個(gè) -l,理論上來說的話如果我們加上了一個(gè)-l那么這個(gè)鏡像在run的時(shí)候執(zhí)行的命令應(yīng)該是ls -a -l 對(duì)吧,我們?cè)囋嚳础?/p>

可以看到報(bào)錯(cuò)了,這是為什么呢,因?yàn)榍懊嬲f了CMD命令是只執(zhí)行最后一項(xiàng),所以當(dāng)我們?cè)趓un的時(shí)候加上命令-l的話實(shí)際鏡像運(yùn)行時(shí)執(zhí)行的命令-l替換了ls -a,那么這時(shí)centos就無法識(shí)別-l是什么意思了。而ENTRYPOINT則是可以進(jìn)行追加的,像這種情況entrypoint就可以運(yùn)行命令為ls -a -l。這里就不對(duì)其再進(jìn)行演示。

制作一個(gè)tomcat鏡像

我們需要先去準(zhǔn)備幾個(gè)安裝包,大家可以去官網(wǎng)上搜索,??jdk下載??,??tomcat下載??。

下載完用xftp上傳上去就行。

接下來就可以編寫Dockerfile文件了。

FROM centos:centos7
MAINTAINER Aasee
COPY readme.txt /usr/local/readme.txt
#導(dǎo)入壓縮包會(huì)自動(dòng)解壓
ADD apache-tomcat-9.0.63.tar.gz /usr/local/
ADD jdk-8u333-linux-x64.tar.gz /usr/local/
#安裝vim
RUN yum -y install vim
#設(shè)置工作目錄
ENV MYPATH /usr/local
WORKDIR $MYPATH
#jdk環(huán)境配置
ENV JAVA_HOME /usr/local/jdk1.8.0_333
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#tomcat環(huán)境配置
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.63
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.63
#配置path環(huán)境
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#暴露端口
EXPOSE 8080
# 啟動(dòng)tomcat和打印日志
CMD /usr/local/apache-tomcat-9.0.63/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.63/logs/catalina.out

我這的命名為官方推薦名Dockerfile。所以不需要再用-f來指定文件。直接可以用docker build來創(chuàng)建

docker build -t 命名 .

接下來就可以run起來了

docker run -d -p 9090:8080 --name aaseetomcat -v /root/dockerFile/tomcat/test:/usr/local/apache-tomcat-9.0.63/webapps/test -v /root/dockerFile/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.63/logs aasee-tomcat01

這是我的命令你們也可以按自己需要改,相信看到這里,大部分命令大家都是能看懂的了。

可以看到運(yùn)行成功并且也掛載成功了。訪問頁(yè)面看看。

日志也能查看了。

再用docker inspect 容器id 來看看卷數(shù)據(jù)是否綁定成功。

讓我們看看tomcatlogs里的目錄是否掛載成功。

可以看到已經(jīng)成功了。

接下來我們就給他新建一個(gè)自定義網(wǎng)頁(yè)試試看。由于我們已經(jīng)通過卷掛載了webapps/test,所以我們可以直接在宿主機(jī)的test目錄下進(jìn)行更改。同時(shí)也能反推看看兩個(gè)目錄是否卷掛載成功。

web.xml


xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

index.html





Hello world



Hello World


Aasee-Docker



接著我們?nèi)タ纯错?yè)面的效果吧。

歐克了。

push到倉(cāng)庫(kù)保存

當(dāng)我們做好鏡像之后要怎么給別人使用呢,有兩種方法一種是打包到本地然后發(fā)給別人,另一種是上傳到docker官方倉(cāng)庫(kù)或者是阿里云,騰訊云等這些大廠的官方倉(cāng)庫(kù)。但是由于docker官方倉(cāng)庫(kù)節(jié)點(diǎn)在國(guó)外,速度時(shí)好時(shí)壞的,而且操作都差不多,這里就以阿里云為例子(騰訊云相同操作)。

首先先登錄阿里云。

直接搜索容器鏡像服務(wù),我們個(gè)人測(cè)試使用就直接用個(gè)人版就行,然后根據(jù)提示創(chuàng)建命令空間再創(chuàng)建鏡像倉(cāng)庫(kù)選擇本地倉(cāng)庫(kù)之后就可以看到push的教程了。

這些內(nèi)容就大家自己去看了。官方的命令很詳細(xì)了。根據(jù)官方的命令我們就能很容易得將鏡像推送到官方倉(cāng)庫(kù)。

補(bǔ)充

這里補(bǔ)充一下其他命令,例如docker history 鏡像id這樣就能看到這個(gè)鏡像怎么生成的了。

像這樣

總結(jié)

到這里我們就基本能獨(dú)立構(gòu)建鏡像并且使用鏡像用來搭建發(fā)布項(xiàng)目了!


當(dāng)前標(biāo)題:Docker數(shù)據(jù)卷與DockerFile學(xué)習(xí)
文章轉(zhuǎn)載:http://m.5511xx.com/article/djeeisj.html