Docker 学习历程-容器数据卷、DockerFile

本文详细介绍了Docker容器数据卷的使用,包括数据卷的持久化、Mysql数据同步、具名挂载与匿名挂载的区别。同时探讨了DockerFile的构建过程,CMD与ENTRYPOINT的差异,并提供了实战测试案例,如多MySQL数据共享、自定义Docker镜像等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是容器数据卷

容器数据卷是可以使数据持久化的一个技术,是将容器内部的数据存储到服务器的文件里,并且可以操作服务器上的文件,使得容器里的数据发生变化的。
如果删除容器,数据也可以持久化,举例:MySQL的容器删除了,但是数据在本地
容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地。

1、启动CentOS并且指定-v 目录
docker run -it -v /home/ceshi:/home centos

docker inspect 8cb966e186e0 // 8cb966e186e0 是容器id
在这里插入图片描述

已经成功将容器内部的文件同步到外部系统中
在这里插入图片描述
之后系统的数据操作都会在这个文件里生成,例如
在这里插入图片描述
反向操作:停止容器后,再到服务器上新增test.java文件内容,启动容器,查看test.java文件内容,也是会同步的
在这里插入图片描述

Mysql数据同步

1、下载mysql容器

docker pull mysql:5.7

2、运行容器,做数据挂载
官方启动文档:docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag // 运行mysql时需要输入密码 -e 就是配置环境 MYSQL_ROOT_PASSWORD 就是配置初始密码

// 启动mysql并挂载
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

3、使用本地可视化navicat测试数据

-d			 // 后台运行
-p			// 端口映射
-v			// 挂载运行,挂载多个目录需要输入多个-v
--name		// 给容器起个名字

具名挂载和匿名挂载

匿名挂载

docker run -d -P --name nginx03 -v /ect/nginx nginx

在这里插入图片描述

docker volume ls // 查看 volume 的具体情况

具名挂载

docker run -d -P --name nginx04 -v feirou-nginx:/etc/nginx nginx

在这里插入图片描述

docker volume inspect feirou-nginx  // 查看挂载的细节

在这里插入图片描述
没有指定卷目录的情况下,都是指定在/var/lib/docker/volumes/_date 下
通过具名挂载可以很方便的找到我们的卷,大多数情况下载使用的是具名挂载

如何确定是匿名挂在还是具名挂载?
-v 容器内路径					// 匿名挂载
-v 卷名:容器内路径			// 具名挂载
-v /宿主机路径::容器内路径		// 指定路径挂载

ro和rw
只读和读写权限设置

docker run -d -P --name nginx04 -v feirou-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx04 -v feirou-nginx:/etc/nginx:rw nginx
	ro:只能在宿主机下操作,容器内不能操作
	rw:可读可写
挂载方式二
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "---------------end----------------"
CMD /bin/bash

生成镜像
docker build -f dockerfile1 -t bayue/centos .
在这里插入图片描述
docker images
在这里插入图片描述
启动并查看挂载卷

docker run -it 容器id /bin/bash

在这里插入图片描述
在容器外查看容器的Mounts具体信息

docker inspect 容器id

在这里插入图片描述

数据卷容器

启动刚刚自己创建的centos命名为docker01并在volumes01下创建文件docker01

docker run -it --name 给centos重命名为docker01 容器ID/或者容器名称:版本号

在这里插入图片描述

启动并关联docker01

docker run -it --name docker02 --volumes-from docker01 容器ID/或者容器名称:版本号

在这里插入图片描述
通过 --volumes-from 来进行实现关联

如果将docker01停掉或者删除,docker02一样可以访问到共享卷(在volumes下创建得)docker01

多个MySQL实现数据共享

docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

DockerFile

dockerfile是用来构建docker镜像的文件,是命令参数脚本。
构建步骤:
1、编写一个 dockerfile 文件
2、通过命令 docker build 构建成为一个镜像
3、通过 docker run 命令,运行镜像
4、通过 docker push 发布镜像(DockerHub、阿里云镜像仓库)

DockerFile 构建过程

基础知识:
1、每个关键字(指令)都是大写字母
2、执行顺序,从上到下执行
3、#表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交(这就和之前自己创建的centos,同步volumes01,02是一个意思)
在这里插入图片描述
在这里插入图片描述

DockerFile 指令

	FROM        		# 基础镜像,一切从这里开始构建
	MAINTAINER			# 镜像是谁写的,姓名+邮箱
	RUN					# 镜像构建的时候需要运行的命令
	ADD				 	# 步骤:tomcat镜像,这个tomcat压缩包!添加内容
	WORKDIR				# 镜像的工作目录
	VOLUME				# 挂载的目录
	EXPOSE				# 指定暴露的端口
	RUN					# 运行
	CMD/ENTRYPOINT		# 指定这个容器启动的时候要运行的命令,CMD只有最后一个会生效,可被代替/ENTRYPOINT可以追加命令
	ONBUILD				# 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD 的指令,触发指令
	COPY				# 类似ADD,将我们文件拷贝到镜像中
	ENV					# 构建的时候设置环境变量

在这里插入图片描述
测试:构建自己的centos
home目录下创建文件dockerfilrtest再创建文本mydockerfile
vi编辑mydockerfile

FROM centos
MAINTAINER bayue<282517807@qq.com>

ENV MYPATH /usr/local
WORKDIR #MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash

使用docker build -f 编译

docker build -f mydockerfile -t mycentos:0.1 .

在这里插入图片描述
在编译过程中会有警告,属于正常情况
在这里插入图片描述
原理,dockerfile从本地的经先开始查找,如果没有则去下载,然后叠罗汉,搭载成一个镜像.
在这里插入图片描述
对比一下
创建之前没有ifconfig命令
在这里插入图片描述

创建后
在这里插入图片描述
查看镜像生成过程
docker history 容器id
在这里插入图片描述

CMD 和 ENTRYPOINT 的区别
CMD					# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被代替
ENTRYPOINT			# 指定这个容器启动的时候要运行的命令,可以追加命令

测试CMD

编写文件vim dockerfile-cmd=test

FROM centos
CMD ["ls","-a"]

保存后编译
docker build -f dockerfile-cmd=test -t cmdtest . 

在这里插入图片描述
ls -a 命令生效了

测试追加命令 -l

docker run db8eb1e6a12f -l

发现报错了
报错信息
需要将完整的命令写上

docker run db8eb1e6a12f ls -al

在这里插入图片描述
测试ENTORYINT
1、编写文件 dockerfile-cmd-entrypoint

FROM centos
ENTRYPOINT ["ls","-a"]

2、编译文件

build -f dockerfile-cmd-entrypoint -t entrypoint-cmd-entryoint entryoint-test .

3、启动entrypoint-test并追加 -l命令

可以追加到命令后
在这里插入图片描述

实战测试

准备两个文件liunx版本的jdk和tomcat,需要知道版本号
1、编一个DockerFile

vim Dockerfile

# 文件内容
FROM centos
MAINTAINER <282517807@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u291-linux-aarch64.tar.gz /usr/local/
ADD apache-tomcat-8.0.30-deployer.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_291
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOE/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.30
ENV CATALINA_BASH /usr/local/apache-tomcat-8.0.30
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-8.0.30/bin/startup.sh && tail -F /url/local/apache-tomcat-8.0.30/bin/logs/catalina.out

2、编译文件

docker build -t diytomcat .

因为文件名就叫Dockerfile,这是官方定义的,所以Docker会自己找到这个文件进行编译,不需要再写-f

3、启动刚刚编译的dockerfile,并加入挂载目录

docker run -d -p 8088:8088 --name bayuetomcat2 -v /home/bayue/tomcat/test:/usr/local/apache-tomcat-8.0.30/webapps/test -v /home/bayue/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.0.30/logs diytomcat

4、测试访问

5、修改webapps文件内容

补充Docker安装ES
上连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值