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

銅梁ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
什么是數(shù)據(jù)卷
數(shù)據(jù)卷(Data Volumes)是宿主機中的一個目錄或文件,數(shù)據(jù)卷的設(shè)計目的就是數(shù)據(jù)的持久化,完全獨立于容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數(shù)據(jù)卷。當(dāng)容器目錄和數(shù)據(jù)卷目錄綁定后,對方的修改會立即同步,一個數(shù)據(jù)卷可以被多個容器同時掛載,一個容器也可以被掛載多個數(shù)據(jù)卷。
數(shù)據(jù)卷可以在容器之間共享和重用,本地與容器間傳遞數(shù)據(jù)更高
對數(shù)據(jù)卷的修改會立馬有效,在容器內(nèi)部與本地目錄均可對數(shù)據(jù)卷進行修改
對數(shù)據(jù)卷的更新,不會影響鏡像,對數(shù)據(jù)與應(yīng)用進行了解耦操作
卷會一直存在,直到?jīng)]有容器使用
其實也不難理解和我們上一篇講的端口映射很相似,因為容器與宿主機之間都是相互隔離的。而端口映射則是在兩個互相隔離體之間構(gòu)建通道,使其可以進行通訊共享。數(shù)據(jù)卷也是這種意思,但是數(shù)據(jù)卷不會因為容器的死亡而消失,只要還有一個容器或宿主機與其進行綁定,那么數(shù)據(jù)卷的內(nèi)容就不會丟失。
數(shù)據(jù)卷
一、直接命令掛載在宿主機目錄
1、測試nginx
docker run -v 主機目錄:容器內(nèi)目錄
docker run -d -v 主機目錄地址:/usr/share/nginx/html -p 8080:80 --name nginx-music-volume nginx
當(dāng)我們的兩個目錄進行掛載之后,就相當(dāng)于共用一個目錄,不管哪邊發(fā)送改變目錄的內(nèi)容都會發(fā)生改變,這樣的話我們只需在宿主機這邊的目錄進行操作,那么容器內(nèi)的該目錄也會發(fā)生相應(yīng)的變化。就像我上篇文章所進行的cp操作就可以省去,并且當(dāng)我需要更新版本時也只需在宿主機這邊進行操作即可。下面我以nginx進行測試,掛載上自己自定義的網(wǎng)頁。
這里我自己網(wǎng)頁是放在/var/www/html里,接下來我需要掛載到nginx容器里的html文件夾下。
可以看到已經(jīng)運行起來了訪問也通了,讓我們看看網(wǎng)頁行不行。
ok也是沒問題了。這里我們還能通過docker inspect 容器id 查看詳細信息。
這里可以看到確實是掛載成功了??梢钥吹疆?dāng)我們使用-v時很容易就將自己的本地目錄網(wǎng)頁放在了容器里,到這里其實就已經(jīng)可以說明現(xiàn)在這兩個目錄實際上已經(jīng)共用同一個目錄了,并且就算我將這個容器刪除,里面的內(nèi)容也依舊是保留的。
以后修改或者發(fā)布新的版本就只需在服務(wù)器進行修改就行容器會自動同步,并且只有容器沒刪不管是停止?fàn)顟B(tài)還是運行狀態(tài)都會自動同步。
2、 測試mysql
我這用mysql:5.7版本演示,首先docker pull mysql:5.7 ,當(dāng)然這里我先去官網(wǎng)看了一下。我這里還是建議大家直接先去官方進行查詢學(xué)習(xí)。
但是為了掛載目錄方便管理,這里我們需要對該命令進行修改。
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 相信看完上一篇文章的你對于這個命令應(yīng)該不難理解了。
-d 后臺
-p 端口映射
-v 卷掛載
-e 環(huán)境配置
--name 命名
接下來我們?nèi)y試一下是否聯(lián)通了。
可以看到已經(jīng)成功了!我們在navicat加一個表看看服務(wù)器上是否會有。
這樣我們就完成了MySQL容器的數(shù)據(jù)持久化。就算我們將容器進行刪除,數(shù)據(jù)庫中的數(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 主機路徑:容器內(nèi)路徑 -p 8080:80 --name nginx-volume nginx(直接掛載在宿主機指定目錄)
下面我來給大家逐一展示,這里我就用-P隨機指定端口了因為我8080端口跑著。
匿名
我們可以用docker volume ls 來查看數(shù)據(jù)卷列表,docker inspect [volumename] 來查看卷信息。
更多使用參數(shù)可以 --help查看。
docker inspect 容器id
具名
docker inspect 容器id查看
順便補充一下。
看到這這幅圖就很好理解了。一般建議用具名掛載。
設(shè)置只讀:docker run -d -v 主機目錄地址:/usr/share/nginx/html:ro -p 8080:80 --name
nginx-music-volume nginx
三、數(shù)據(jù)卷容器
正如容器與主機之間能夠進行通訊,容器與容器之間也可以進行通信,而這個父容器就為數(shù)據(jù)卷容器,因為我們已經(jīng)知道了容器與宿主機可以通過數(shù)據(jù)卷進行文件共享,所以自然容器與容器之間也是同樣可以通過數(shù)據(jù)卷共享。
--volumes-from容器間數(shù)據(jù)共享命令。
docker run -it --name 子容器名 --volumes-from 父容器名 鏡像名 /bin/bash
這里我以nginx進行演示,先啟動一個帶有數(shù)據(jù)卷的容器作為父容器,我這把它命令為docker01
docker run -d --name docker01 -P -v volume01:/home/volume01 nginx
好的第一個容器已經(jīng)做好了,接下來做第二個。
docker run -it --name docker02 --volumes-from docker01 nginx /bin/bash
我們可以去home目錄驗證一下是不是已經(jīng)存在volume01文件夾。
我們在這新建一個文件,touch helloDocker.py 然后去docker01看看是不是已經(jīng)共享了。
可以看到成功了。
DockerFile
- DockerFile:構(gòu)建文件,定義了鏡像如何生成已經(jīng)所需的文件等等配置。
- DockerImages: 通過DockerFile層層生成的最終鏡像。最終發(fā)布和運行的產(chǎn)品
- DockerContainer: 容器是鏡像運行起來的服務(wù),也是一個可寫層。
下面是我找的兩幅docker常用命令的簡介圖。大家可以好好看看有對命令的詳細介紹。
可以看到ENTRYPOINT和CMD的功能描述幾乎是一樣的,但是他們還是有區(qū)別的,CMD的命令是執(zhí)行最后一個,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)建好了一個dockerfile,很簡單的一個dockerfile,這個的意思就是當(dāng)我們運行這個鏡像的時候自動ls -a。我們接下來用build命令來創(chuàng)建鏡像。
docker build -f docker-test-cmd -t test01-cmd .
現(xiàn)在我們就創(chuàng)建好了。run一下試試。
現(xiàn)在我們在run命令后面加上一個 -l,理論上來說的話如果我們加上了一個-l那么這個鏡像在run的時候執(zhí)行的命令應(yīng)該是ls -a -l 對吧,我們試試看。
可以看到報錯了,這是為什么呢,因為前面說了CMD命令是只執(zhí)行最后一項,所以當(dāng)我們在run的時候加上命令-l的話實際鏡像運行時執(zhí)行的命令-l替換了ls -a,那么這時centos就無法識別-l是什么意思了。而ENTRYPOINT則是可以進行追加的,像這種情況entrypoint就可以運行命令為ls -a -l。這里就不對其再進行演示。
制作一個tomcat鏡像
我們需要先去準備幾個安裝包,大家可以去官網(wǎng)上搜索,??jdk下載??,??tomcat下載??。
下載完用xftp上傳上去就行。
接下來就可以編寫Dockerfile文件了。
FROM centos:centos7
MAINTAINER Aasee
COPY readme.txt /usr/local/readme.txt
#導(dǎo)入壓縮包會自動解壓
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
# 啟動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
這是我的命令你們也可以按自己需要改,相信看到這里,大部分命令大家都是能看懂的了。
可以看到運行成功并且也掛載成功了。訪問頁面看看。
日志也能查看了。
再用docker inspect 容器id 來看看卷數(shù)據(jù)是否綁定成功。
讓我們看看tomcatlogs里的目錄是否掛載成功。
可以看到已經(jīng)成功了。
接下來我們就給他新建一個自定義網(wǎng)頁試試看。由于我們已經(jīng)通過卷掛載了webapps/test,所以我們可以直接在宿主機的test目錄下進行更改。同時也能反推看看兩個目錄是否卷掛載成功。
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)タ纯错撁娴男Ч伞?/p>
歐克了。
push到倉庫保存
當(dāng)我們做好鏡像之后要怎么給別人使用呢,有兩種方法一種是打包到本地然后發(fā)給別人,另一種是上傳到docker官方倉庫或者是阿里云,騰訊云等這些大廠的官方倉庫。但是由于docker官方倉庫節(jié)點在國外,速度時好時壞的,而且操作都差不多,這里就以阿里云為例子(騰訊云相同操作)。
首先先登錄阿里云。
直接搜索容器鏡像服務(wù),我們個人測試使用就直接用個人版就行,然后根據(jù)提示創(chuàng)建命令空間再創(chuàng)建鏡像倉庫選擇本地倉庫之后就可以看到push的教程了。
這些內(nèi)容就大家自己去看了。官方的命令很詳細了。根據(jù)官方的命令我們就能很容易得將鏡像推送到官方倉庫。
補充
這里補充一下其他命令,例如docker history 鏡像id這樣就能看到這個鏡像怎么生成的了。
像這樣
總結(jié)
到這里我們就基本能獨立構(gòu)建鏡像并且使用鏡像用來搭建發(fā)布項目了!
網(wǎng)站欄目:Docker數(shù)據(jù)卷與DockerFile學(xué)習(xí)
文章網(wǎng)址:http://m.fisionsoft.com.cn/article/djeeisj.html


咨詢
建站咨詢
