#云原生征文# docker数据卷与DockerFile学习

网友投稿 274 2022-10-19

#云原生征文# docker数据卷与DockerFile学习

什么是数据卷 数据卷(Data Volumes)是宿主机中的一个目录或文件,数据卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。 数据卷可以在容器之间共享和重用,本地与容器间传递数据更高 对数据卷的修改会立马有效,在容器内部与本地目录均可对数据卷进行修改 对数据卷的更新,不会影响镜像,对数据与应用进行了解耦操作 卷会一直存在,直到没有容器使用

其实也不难理解和我们上一篇讲的端口映射很相似,因为容器与宿主机之间都是相互隔离的。而端口映射则是在两个互相隔离体之间构建通道,使其可以进行通讯共享。数据卷也是这种意思,但是数据卷不会因为容器的死亡而消失,只要还有一个容器或宿主机与其进行绑定,那么数据卷的内容就不会丢失。

数据卷

一. 直接命令挂载在宿主机目录

(1). 测试nginx

docker run -v 主机目录:容器内目录docker run -d -v 主机目录地址:/usr/share/nginx/html -p 8080:80 --name nginx-music-volume nginx

以后修改或者发布新的版本就只需在服务器进行修改就行容器会自动同步,并且只有容器没删不管是停止状态还是运行状态都会自动同步。

(2). 测试mysql

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
相信看完上一篇文章的你对于这个命令应该不难理解了。-d 后台-p 端口映射-v 卷挂载-e 环境配置--name 命名

二. 匿名挂载和具名挂载

匿名挂载和具名挂载也很好理解,匿名就是没有给名字,具名就是给了具体的名字docker run -d -v /usr/share/nginx/html -p 8080:80 --name nginx01 nginx(未指定名称,只写了容器内路径的为匿名挂载)docker run -d -v Aasee:/usr/share/nginx/html -p 8080:80 --name nginx02 nginx(指定名称和容器内路径的为具名挂载)docker run -d -v 主机路径:容器内路径 -p 8080:80 --name nginx-volume nginx(直接挂载在宿主机指定目录)

下面我来给大家逐一展示,这里我就用-P随机指定端口了因为我8080端口跑着

匿名

具名

顺便补充一下

设置只读:docker run -d -v 主机目录地址:/usr/share/nginx/html:ro -p 8080:80 --name nginx-music-volume nginx
三. 数据卷容器 正如容器与主机之间能够进行通讯,容器与容器之间也可以进行通信,而这个父容器就为数据卷容器,因为我们已经知道了容器与宿主机可以通过数据卷进行文件共享,所以自然容器与容器之间也是同样可以通过数据卷共享。--volumes-from容器间数据共享命令。docker run -it --name 子容器名 --volumes-from 父容器名 镜像名 /bin/bash

这里我以nginx进行演示,先启动一个带有数据卷的容器作为父容器,我这把它命令为docker01

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

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

DockerFile

DockerFile:构建文件,定义了镜像如何生成已经所需的文件等等配置。 DockerImages: 通过DockerFile层层生成的最终镜像。最终发布和运行的产品 DockerContainer: 容器是镜像运行起来的服务,也是一个可写层。

可以看到ENTRYPOINT和CMD的功能描述几乎是一样的,但是他们还是有区别的,CMD的命令是执行最后一个,ENTRYPOINT命令则是追加。所以这里我就通过编写DockerFile来演示他们的区别。

[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"]

FROM centos:centos7 MAINTAINER Aasee COPY readme.txt /usr/local/readme.txt #导入压缩包会自动解压 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 #设置工作目录 ENV MYPATH /usr/local WORKDIR $MYPATH #jdk环境配置 ENV JAVA_HOME /usr/local/jdk1.8.0_333 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar #tomcat环境配置 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.63 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.63 #配置path环境 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来创建docker build -t 命名 .

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 来看看卷数据是否绑定成功

让我们看看tomcatlogs里的目录是否挂载成功。

接下来我们就给他新建一个自定义网页试试看。由于我们已经通过卷挂载了webapps/test,所以我们可以直接在宿主机的test目录下进行更改。同时也能反推看看两个目录是否卷挂载成功。

web.xml

index.html

Hello world Hello World

Aasee-Docker

push到仓库保存

当我们做好镜像之后要怎么给别人使用呢,有两种方法一种是打包到本地然后发给别人,另一种是上传到docker官方仓库或者是阿里云,腾讯云等这些大厂的官方仓库。但是由于docker官方仓库节点在国外,速度时好时坏的,而且操作都差不多,这里就以阿里云为例子(腾讯云相同操作)。

补充

总结

到这里我们就基本能独立构建镜像并且使用镜像用来搭建发布项目了!

【本文正在参加云原生有奖征文活动】,活动链接:https://ost./posts/12598

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:剑指Offer之Java算法习题精讲二叉树专项解析
下一篇:#云原生征文# 浅谈云原生——从概念到趋势
相关文章

 发表评论

暂时没有评论,来抢沙发吧~